2010-06-12 4 views
1

Je commence tout juste à m'enseigner openGL et j'ajoute maintenant openAL au mix. J'ai quelques planètes dispersées dans l'espace 3D et lorsque je touche l'écran, j'attribue un son à une planète aléatoire puis je vole lentement et doucement la caméra pour la regarder et l'écouter. La partie animation/interpolation fonctionne parfaitement, mais la pièce openAL n'est pas silencieuse. Je déplace l'appareil photo en faisant un tiny translate() et gluLookAt() pour chaque image pour garder les choses en douceur (interpolation de la position de la caméra et lookAt coords). Le problème semble être avec l'image stéréo que je sors des écouteurs. Il semble que la gauche/droite/haut/bas est parfois mélangé après que la caméra roule ou tourne. Je suis assez sûr que le problème est ici:calculer la caméra en haut du vecteur après 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); 

Je me demande si je dois recalculer le vecteur pour la caméra après chaque gluLookAt() pour redresser le problème de positionnement audio .. Cela semble qu'il pourrait être l'ingrédient manquant, mais le calcul impliqué semble si avancé que je ne suis même pas sûr par où commencer ..

1) Est-il correct que je devrais recalculer le vecteur haut après chaque gluLookAt()?

2) Quelqu'un pourrait-il m'apprendre comment calculer un vecteur haut?


Donc, ce serait une façon correcte d'obtenir le vecteur haut de la caméra après le 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]; 

Répondre

1

Dans un monde Y-up, le vecteur "up" global est le vecteur "Y" local. Ou, en d'autres termes, si vous mettez "0, 1, 0" dans la transformation, il apparaîtra "pointant vers le haut".

Dans une matrice OpenGL, cela signifie que la deuxième colonne est votre vecteur «haut». Vous pouvez l'extraire comme suit:

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

Ceci est une énorme amélioration, mais il semble que je puisse encore avoir quelque chose de mal. J'ai toujours essayé d'utiliser une valeur de 0,1,0 dans le gluLookAt() mais cela ne semble pas fonctionner aussi bien que de réutiliser les valeurs précédentes de cam-> UP retirées de la matrice après la gluLookAt précédente() décrit. – user360092

+0

Il semble qu'il faille toujours passer le vecteur UP actuel à gluLookAt, et ne pas l'envoyer 0,1,0 à chaque fois. Je suis toujours en train de comprendre. Je fais un pouce de progrès tous les jours maintenant. J'espère que le rythme de l'apprentissage se rétablira bientôt! Merci pour votre aide Jon. – user360092

+0

La recherche montre qu'il faut environ 10 000 heures de pratique pour devenir maître d'un sujet donné. Bonne chance! :-) –

Questions connexes