Воскресенье, 24 Ноября 2024, 12:17

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Ориентация слушателя в OpenAL
VuvkДата: Четверг, 24 Сентября 2015, 15:50 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Всем привет!
Решил не заморачиваться с 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))


В итоге при повороте камеры быстро сменяются левый и правый канал местами! Да и вообще работает подозрительно... cry
Пример можете скачать
Что надо сотворить/исправить/добавить, чтобы я уже наконец-то получил все плюшки от использования OpenAL? Третий день уже этот ветер слушаю wacko

Добавлено (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

Вот такая странная особенность, о которой очень сложно найти информацию...

Если кому-то любопытно, то вот, что получилось
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг