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

Проблемы с OpenAL

#0
18:53, 24 авг. 2007

Сделал огонь. Захотел прикрепить звук. Решил использовать OpenAL (после прочтения статьи, которая есть здесь на сайте). Но почему-то у меня ничего толком не выходит. Делаю так:

const
  sourcepos: array [0..2] of TALfloat = ( 0.0, 0.0, 0.0);  //огонь находится в центре сцены
  sourcevel : array [0..2] of TALfloat = ( 0.0, 0.0, 0.0);

  listenervel: array [0..2] of TALfloat = ( 0.0, 0.0, 0.0);  
  listenerori: array [0..5] of TALfloat = ( 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); 
...
//инициализация
  InitOpenAL;
  MainDevice := alcOpenDevice(nil);
  MainContext := alcCreateContext(MainDevice,nil);
  alcMakeContextCurrent(MainContext);

  alGenBuffers(1, @FirstBuffer);
  alutLoadWAVFile('fire_small1.wav',format,data,size,freq,loop);
  alBufferData(FirstBuffer,format,data,size,freq);
  alutUnloadWAV(format,data,size,freq); 
  alGenSources(1, @FirstSource); 

  alSourcei( FirstSource, AL_BUFFER, FirstBuffer); 
  alSourcefv(FirstSource, AL_POSITION, @sourcepos); 
  alSourcefv( FirstSource, AL_VELOCITY, @sourcevel); 
  alSourcei( FirstSource, AL_LOOPING, AL_TRUE);

  alListenerfv(AL_VELOCITY, @listenerVel);
  alListenerfv(AL_ORIENTATION, @listenerOri);

  alSourcePlay(FirstSource);
...
//при перерисовке (X, Y, Z - координаты камеры)
  listenerPos[0] := X;
  listenerPos[1] := Y;
  listenerPos[2] := Z;

  alListenerfv(AL_POSITION, @listenerPos);
В результате звук слышен все время - хоть удаляйся от огня, хоть приближайся. Почему так?


#1
20:35, 24 авг. 2007

Звук должен быть монофоническим. Плохо ты статью читал.

#2
12:58, 25 авг. 2007

Alexander K
Звук как раз таки монофонический - из Half-Life 2 взял =)
А ты используешь OpenAL? И получается?

#3
13:30, 25 авг. 2007

вообщем написал бред, удалил... сейчас у себя попробовал... делал почти тоже самое... двигаю слушателя... не робит... та же громкость, двигаю источник, норм все..

может так и надо?:)) всмысле двигать источники а не слушателя, преобразовывать??
ща думаю....

сейчас двигаю и источник и слушателя, пофиг... как будто слушатель всегда в нуле остается... думаю что надо ориентацию настраивать... щас проверю...

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

#4
14:10, 25 авг. 2007

AcManZ
Воо ... тоже самое. Так же извращался. И понять не могу в чем проблема. Надо где-нить демку нарыть, где OpenAL и спользуется в 3D мире. А то мне только консольные примеры попадаются. С примером глядишь и разберемся.

#5
12:26, 26 авг. 2007

Итак, разобрался. Если двигать слушателя и источник, то ничего не выходит. А если слушателя поместить в (0.0, 0.0, 0.0), а для источника высчитывать новые координаты (по сути мы переносим систему координат), то все получается.

//Pos - изначальные координаты источника
//X, Y, Z - координаты камеры
  sourcepos[0] := Pos.x - X;
  sourcepos[1] := Pos.y - Y;
  sourcepos[2] := Pos.z - Z;

  alSourcefv( FirstSource, AL_POSITION, @sourcepos);
И все проблема решена. Только вот зачем так авторы OpenAL сделали? А может эта проблема встречается только у делфистов, а на С++ все работает как надо? Ну, и ладно. Главное работает ;)
Теперь надо как-то рабобраться с оринтацией слушателя.
Если делать так:
  listenerori[0] := 1;
  listenerori[1] := sin(Heading);
  listenerori[2] := - cos(Heading);
  listenerori[3] := 0.0;
  listenerori[4] := 1.0;
  listenerori[5] := 0.0;
  alListenerfv(AL_ORIENTATION, @listenerOri);
При повороте камеры на 360 градусов звук успевает раз эдак 1000 поменять направление (то левое ухо, то правое).
А если так:
  if Heading < 180 then
    listenerori[0] := 1
  else begin
    if Heading = 180 then
      listenerori[0] := 0
    else
      listenerori[0] := -1;
  end;         
  if (Heading > 90) and (Heading < 270) then
    listenerori[2] := 1
  else begin
    if (Heading = 90) or (Heading = 270) then
      listenerori[2] := 0
    else
      listenerori[2] := -1;
  end;          
  listenerori[3] := 0.0;
  listenerori[4] := 1.0;
  listenerori[5] := 0.0;
  alListenerfv(AL_ORIENTATION, @listenerOri);
то звук при повороте камеры резко меняется (был слышен в левом ухе, хоп, в правом - никакого плавного перехода).

Прошло более 10 месяцев
#6
14:30, 5 июля 2008

Блин. Те же проблемы. Как нужно задавать ListenerOri ???

#7
14:44, 5 июля 2008

Ааа! Разобрался. РЕБЯТ, если у кого нибудь станет такая проблема - этот тескст для вас. Нашел путём : а вдруг также как в gluLookAt :)

Параметры в listenerOri(0,1,2,3,4,5) задаются так:

0,1,2 - вектор куда cмотрим
3,4,5 - ориентация камеры. Как и в gluLookAt последние 3 параметра. Вобщем обычно 3-0,4-0,5-1

т.е. если v- вектор направления камеры, то будет так :

listenerOri(v.x, v.y, v.z, 0, 0, 1)

#8
2:45, 20 ноя. 2008

Я конечно понимаю, что проблеме, описанной в этой теме уже более года, и скорее всего её уже не существует на корню. Но на всякий случай хочу всё-таки сделать свой вклад.
Aut
В твоём случае задавать

alSourcefv( FirstSource, AL_VELOCITY, @sourcevel);

скорее всего бесполезно.
И вполне достаточно того, что ты уже написал

//Pos - изначальные координаты источника
//X, Y, Z - координаты камеры
  sourcepos[0] := Pos.x - X;
  sourcepos[1] := Pos.y - Y;
  sourcepos[2] := Pos.z - Z;

  alSourcefv( FirstSource, AL_POSITION, @sourcepos);

Приросты или убывания в координатах, это условно и будет скорость. И вообще, как я читал, AL_VELOCITY это условное понятие скорости, на самом деле в это понятие разработчик может внести какой-угодно свой смысл.
Почитай тему этого форума
OpenAL 1.1: Проблема с громкостью проигрываемых моно звуков
В ней я привёл листинг, относящийся к разработке озвучивания с применением ООП. Может натолкнёт на какие новые интересные идеи :)

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

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