2010-06-12 3 views
1

Я только начинаю учиться openGL и теперь добавляю openAL в микс.вычислить вектор камеры после glulookat()?

У меня есть некоторые планеты, рассеянные вокруг в 3D-пространстве, и когда я касаюсь экрана, я назначаю звук случайной планете, а затем медленно и плавно летаю на «камеру», чтобы посмотреть на нее и послушать ее. Анимация/твиновская часть работает отлично, но часть openAL не очень тихая. Я перемещаю камеру, выполняя крошечные translate() и gluLookAt() для каждого кадра, чтобы сохранить гладкость (перемещение позиции камеры и просмотр коордов). Кажется, что проблема связана со стереоизображением, которое я получаю из наушников. Кажется, что левый/правый/вверх/вниз перемешаны иногда после того, как камера катится или вращается. Я уверен, что проблема здесь:

ALfloat listenerPos[]={camera->currentX,camera->currentY,camera->currentZ}; 

    ALfloat listenerOri[]={camera->currentLookX, 
          camera->currentLookY, 
          camera->currentLookZ, 
          0.0,//Camera Up X <--- here 
          0.1,//Camera Up Y <--- here 
          0.0}//Camera Up Z <--- and here 

    alListenerfv(AL_POSITION,listenerPos); 
    alListenerfv(AL_ORIENTATION,listenerOri); 

мне интересно, если мне нужно пересчитывать вектор UP для камеры после каждого gluLookAt(), чтобы выправить проблему аудио позиционирования .. Это кажется, что это может быть недостающим ингредиентом, но вовлеченная математика кажется настолько продвинутой. Я даже не знаю, с чего начать.

1) Правильно ли, что мне нужно будет пересчитать вектор вверх после каждого gluLookAt()?

2) Может ли кто-нибудь научить меня вычислять вектор вверх?


Так будет ли это правильным способом получить векторный снимок камеры после gluLookAt()?

gluLookAt(cam->currentX, 
      cam->currentY, 
      cam->currentZ, 
      cam->currentLookX, 
      cam->currentLookY, 
      cam->currentLookZ, 
      cam->upX, 
      cam->upY, 
      cam->upZ); 

//Get the up vector 
glGetFloatv(GL_MODELVIEW_MATRIX, cam->modelViewMatrix); 

cam->upX = cam->modelViewMatrix[4]; 
cam->upY = cam->modelViewMatrix[5]; 
cam->upZ = cam->modelViewMatrix[6]; 

ответ

1

В мире Y-up глобальным вектором «вверх» является локальный вектор «Y». Или, по-другому, если вы введете «0, 1, 0» в преобразование, он выйдет, указывая «вверх».

В матрице OpenGL это означает, что второй столбец является вашим вектором «вверх». Вы можете извлечь его следующим образом:

float *myMatrix = ...; 
myUpVector = Vector3(myMatrix[4], myMatrix[5], myMatrix[6]); 
+0

Это огромное улучшение, но похоже, что у меня все еще может быть что-то неправильно. Я старался всегда использовать до 0,1,0 в gluLookAt(), но это, похоже, не работает, а также повторное использование предыдущих значений cam-> UP, выведенных из матрицы после предыдущего gluLookAt(), как описано. – user360092

+0

Кажется, что всегда следует передавать текущий вектор UP на gluLookAt, а не отправлять его 0,1,0 каждый раз. Я все еще чувствую это. Я делаю шаг вперед каждый день. Надеюсь, что темпы обучения скоро начнутся! Спасибо за вашу помощь. – user360092

+0

Исследования показывают, что для того, чтобы стать мастером любого предмета, требуется около 10 000 часов практики. Удачи! :-) –

Смежные вопросы