Всем привет!
Решил не заморачиваться с 3д звуком и использовать OpenAL в своём проекте на движке, основанном на FreeBasic. Громкость от дальности источника звука меняется, но не могу задать AL_ORIENTATION нормально. Всякие способы уже измучал...
То, что передаются вектора at и up я понял, но как правильно задать at вектор?
вот пример из официальной спецификации:
Код
float directionvect[6];
directionvect[0] = (float) sin(listenerAngle);
directionvect[1] = 0;
directionvect[2] = (float) cos(listenerAngle);
directionvect[3] = 0;
directionvect[4] = 1;
directionvect[5] = 0;
alListenerfv(AL_ORIENTATION, directionvect);
Какая ось берется за listenerAngle в спецификации не указано. Ну я взял Y.
Ну здорово, сделал так же:
Код
ListenerOri(0) = Sin(PlayerRot.Y)
ListenerOri(1) = 0
ListenerOri(2) = Cos(PlayerRot.Y)
ListenerOri(3) = 0
ListenerOri(4) = 1
ListenerOri(5) = 0
alListenerfv(AL_ORIENTATION, @ListenerOri(0))
В итоге при повороте камеры быстро сменяются левый и правый канал местами! Да и вообще работает подозрительно...
Пример можете скачать
Что надо сотворить/исправить/добавить, чтобы я уже наконец-то получил все плюшки от использования OpenAL? Третий день уже этот ветер слушаю Добавлено (24 сентября 2015, 15:50)
---------------------------------------------
Сам спросил - сам отвечу.
Наткнулся на англоязычном форуме на объяснение, что в OpenAL есть некая особенность - слушатель при векторе "вперед" (0.0.1) повернут лицом в монитор, глядя из монитора. Поэтому игрок как бы слышит наоборот. Я и не обращал внимания, почему это по умолчанию ориентация слушателя (0.0.-1), а ведь именно поэтому!
И для задания ориентации слушателя, как у настоящего слушателя (игрока), нужно либо перевернуть вектор "вперед" X,Z
Код
ListenerOri(0) = -Sin(PlayerRot.Y)
ListenerOri(1) = 0
ListenerOri(2) = -Cos(PlayerRot.Y)
Либо просто перевернуть вектор "вверх"
Код
ListenerOri(3) = 0
ListenerOri(4) = -1
ListenerOri(5) = 0
Вот такая странная особенность, о которой очень сложно найти информацию...
Если кому-то любопытно, то вот, что получилось