рассчитать вектор камеры после glulookat ()? - PullRequest
1 голос
/ 12 июня 2010

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

У меня есть несколько планет, рассеянных вокруг в трехмерном пространстве, и когда я касаюсь экрана, я назначаю звук случайной планете, а затем медленно и плавно перемещаю «камеру», чтобы посмотреть на нее и послушать ее. Часть анимации / анимации работает отлично, но часть 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 Ответ

1 голос
/ 12 июня 2010

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

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

float *myMatrix = ...;
myUpVector = Vector3(myMatrix[4], myMatrix[5], myMatrix[6]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...