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

Как привязать 3D звук к объекту в пространстве(openal)?

#0
19:27, 7 мая 2012

Скопировал полностью код из этой статьи:
http://www.gamedev.ru/code/articles/OpenAL

Также пробовал использовать библиотеку freeslw, но звук никак не меняется.


InitializeOpenAL();
Snd3D.Open("Footsteps.wav", true, false);

дальше
Snd3D.Play();
Snd3D.Move(50,15,150);// пример

Звук выводится, но везде одинаковый.
меняю вот эти значения для слушателя:

  alListenerfv(AL_POSITION,    ListenerPos);
    // Скорость
    alListenerfv(AL_VELOCITY,    ListenerVel);
    // Ориентация
    alListenerfv(AL_ORIENTATION, ListenerOri);

тоже самое звук как был так и остаётся.
Перемещаюсь в пространстве звук тот же, поворачиваюсь звук тот же.

Вообще этого должно быть достаточно, чтобы звук автоматически распределялся на колонки или нужно еще что то делать?


#1
20:57, 7 мая 2012

В общем разобрался. Дело было в том, что wav файл должен быть моно а не стерео.
использовал программу редактирования звука Audacity, но она оказывается не сохраняла файл в моно несмотря на настройки.
Перекодировал файл sound forge, и всё заработало.

#2
11:34, 8 мая 2012

первый раз слышу про необходимость делать моно.

#3
0:58, 11 мая 2012

Сейчас заметил что, неправильная ориентация у звука. Если перемещаешь взгляд вверх или по диагонали то звук идет в правый динамик, а если в низ то в левый. При поворачивании звук всегда либо в правом либо в левом динамике.

Делаю так.
В physx камера управляется следующими векторами
NxVec3 gCameraPos(0,5,-15);   
NxVec3 gCameraForward(0,0,1); // вот здесь это look at?
NxVec3 gCameraRight(-1,0,0);    //  здесь look up?

...
При проигрывании устанавливаю позицию и ориентацию слушателя

Snd3D.Move(0,0,0);// источник звука в центре координат

// слушатель это камера
alListener3f(AL_POSITION,    gCameraPos.X , gCameraPos.Y , gCameraPos.Z);

// ориентация слушателя как я понимаю это gCameraForward и gCameraRight
ALfloat ListenerOri[] = { gCameraForward.X, gCameraForward.Y, gCameraForward.Z,  gCameraRight.X  gCameraRight.Y, gCameraRight.Z};
alListenerfv(AL_ORIENTATION, ListenerOri);

Snd3D.Play();

Так и должны задаваться координаты? Вот примеров openal где динамически формируется alListenerfv(AL_ORIENTATION, ListenerOri); не могу найти.

#4
5:58, 11 мая 2012

Это я уже видел. Там нет примера с двигающимся слушателем. Мне нужно понять что из себя представляет второй вектор передающийся в alListenerfv(AL_ORIENTATION, ListenerOri);

Собсвенно у меня есть позиция камеры так?

NxVec3 gCameraPos(0,5,-15);    

//её вставляю сюда
alListener3f(AL_POSITION,    gCameraPos.X , gCameraPos.Y , gCameraPos.Z);


//Есть вектор в точку взгляда look at 
NxVec3 gCameraForward(0,0,1); 

// Что из себя представляет look up?
он высчитывается из имеющихся данных или нет?

ALfloat ListenerOri[] = { gCameraForward.X, gCameraForward.Y, gCameraForward.Z,  ??.X  ??.Y, ??.Z}; 
alListenerfv(AL_ORIENTATION, ListenerOri);

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

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