ПрограммированиеФорумЗвук

Ориентация звука

#0
4:47, 24 фев 2015

Привет!
Играясь со звуком столкнулся с одной проблемой. Есть звуковой источник, при отдаление от него камеры звук затихает при приближение становится громче. Работает как нужно. Но с ориентаций головы слушателя (камеры) не могу разобраться.

Получаю координаты камеры:
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);

#1
9:37, 24 фев 2015

Ты бы хоть название библиотеки написал.

#2
1:10, 25 фев 2015

Бибилиотека наверно openal. Для ориентации необходимо вращать 2 вектора - direction и up. Иначе будет gimbal lock.
И это касается не только listener-ов звука, но и по хорошему - камер.

#3
6:02, 25 фев 2015
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 - вектор вверх

#4
20:27, 25 фев 2015

Спасибо XProger

ПрограммированиеФорумЗвук

Тема в архиве.