2009-09-17 12 views
1

J'essaye de faire un prototype de simulation de vol spatial en OpenGL, mais après avoir lu de nombreux articles en ligne, j'ai encore du mal à faire fonctionner correctement les rotations (j'avais un appareil quaternion que je n'avais pas Je comprends bien, mais il dérive et a d'autres comportements étranges).Rotation 3D en OpenGL et rotation locale

Je suis en train de faire ce qui suit:

1) rotation locale - lorsque l'utilisateur appuie sur les touches fléchées, la rotation a lieu par rapport à la fenêtre (rotation « up » est vers le haut de l'écran, par exemple) . Deux clés, telles que Z et X, contrôlent le "roulement" du bateau (rotation autour de la vue actuelle).

2) Les rotations seront stockées au format Axe-angle (ce qui est le plus naturel pour OpenGL et un seul appel de rotation avec le vecteur de la caméra doit faire tourner la scène correctement). Donc, étant donné le vecteur d'angle-Angle initial et une ou plusieurs des rotations locales notées ci-dessus (nous pourrions appeler localement "X" l'axe gauche/droite, "Y" l'axe haut/bas et "Z" l'axe du rouleau), Je voudrais que le résultat final soit un nouveau vecteur d'angle d'axe.

3) Évitez les quarternions et minimisez l'utilisation de matrices (pour une raison quelconque, je trouve les deux non intuitives). Au lieu de la notation matricielle, il vous suffit d'afficher dans psuedocode les composants vectoriels et ce qui se passe.

4) Vous devriez pouvoir tourner dans une direction (en utilisant les touches fléchées) sur 360 degrés et revenir à la vue de départ sans dériver. De préférence, si l'utilisateur appuie sur une combinaison puis l'inverse, il s'attendrait à pouvoir revenir à son orientation d'origine.

5) L'état de départ de la caméra est aux coordonnées (0,0,0) faisant face au vecteur d'angle de l'axe (axe 0,0,1,0 - z sans rotation de départ). "haut" est (0,1,0).

+0

... Alors, quelle est la question exactement? Montrez-nous ce que vous avez et ce qui ne va pas afin que nous puissions vous aider à le corriger. – strager

+0

Quel était le problème que vous avez eu avec les quaternions? Ce que vous essayez de faire est l'une des principales applications d'ingénierie d'entre eux. –

+0

Je me demande simplement si vous pouvez utiliser Axis-Angle à cette fin; par exemple, la caméra est par exemple à (0,0,0) et vous commencez par regarder (0,0,1,0) ce qui serait gluLookAt (0,0,0, 0,0,1, 0, 1,0). Maintenant, lorsque l'entrée se produit, je vais tourner à gauche/droite/haut/bas ou rouler en changeant le vecteur que je regarde ou la rotation autour de cet axe (dans le cas de roulement). Après cela, je vais faire gluLookAt() avec différents vecteurs pour monter et descendre. J'ai juste besoin d'un moyen d'utiliser les rotations locales pour passer d'un Axe-Angle à un autre (je regarde conceptuellement deux points à l'intérieur d'une sphère). –

Répondre

2

L'utilisation des angles d'Euler est incorrecte avec spacesim. J'ai essayé cette approche et j'ai rapidement dû abandonner. Le joueur veut tous les degrés de liberté, et les angles d'Euler ne le fournissent pas, ou le compliquent énormément.

Ce que vous vraiment, vraiment veulent quaternions. Ceci fait partie de mon code de mise à jour.

  Quaternion qtmp1, qtmp2, qtmp3; 

      Rotation r(........); 
      qtmp1.CreateFromAxisAngle(1., 0., 0., r.j*m_updatediff); 
      qtmp2.CreateFromAxisAngle(0., 1., 0., r.i*m_updatediff); 
      qtmp3.CreateFromAxisAngle(0., 0., 1., r.k*m_updatediff); 
      m_rotq = qtmp1 * qtmp2 * qtmp3 * m_rotq; 

r.i, r.j et r.k contiennent la vitesse actuelle de rotation autour d'un certain axe. Obtenir une sensation de spaceim est juste une question de multiplication de ces quaternions.

Tout le reste n'est qu'une complication. Avec les angles d'Euler, vous pouvez jouer toute la journée - en fait, toute l'année - mais vous allez juste faire plein de code désordonné.

Votre recommandation journalière: quaternions.