Привет!
Играясь со звуком столкнулся с одной проблемой. Есть звуковой источник, при отдаление от него камеры звук затихает при приближение становится громче. Работает как нужно. Но с ориентаций головы слушателя (камеры) не могу разобраться.
Получаю координаты камеры:
Vec3 player_rotation = player_camera->GetRotation();
player_rotation.z = -player_rotation.y;
Если координата -z звук идет в левую колонку, если +z то в правую.
Передаю их слушателю:
AIL_set_listener_3D_orientation(dig, player_rotation.x, 0.0, player_rotation.z, 0.0, 1.0, 0.0);
В итоге получаю полную чушь, работает если только Z будет равен 0. И после этого вращая камерой в лева и вправо, то есть -1~ и +1~
А ведь игрок может стоять левым ухом к источнику, и при этом координата Z будет с +...
Как вывести адекватный рабочий алгоритм?
Может быть кто то сталкивался, работал со звуком! Прощу помочь.
Update:
Вроде нашел решение в тригонометрии:
float px = 1.0*Math::Sin(player_rotation.x);
float pz = -1.0*Math::Cos(player_rotation.y);
Ты бы хоть название библиотеки написал.
Бибилиотека наверно openal. Для ориентации необходимо вращать 2 вектора - direction и up. Иначе будет gimbal lock.
И это касается не только listener-ов звука, но и по хорошему - камер.
vec3 sv = normalize(sound.pos - listener.pos); vec3 left = viewMatrix.getLeft( ); // или normalize(cross(dir, up)); float pan = dot( left, sv); float pL = min( 1.0f, 1.0f - pan); float pR = min( 1.0f, 1.0f + pan); ... sample[i].L *= pL; sample[i].R *= pR;
где dir - вектор направления взгляда, up - вектор вверх
Спасибо XProger
Тема в архиве.