2010-05-03 4 views
2

J'ai implémenté une caméra de type FPS, avec la caméra constituée d'un vecteur de position, et les angles d'Euler, le tangage et le lacet (rotations x et y). Après la mise en place de la matrice de projection, je puis traduis aux coordonnées de la caméra en tournant, puis traduire à l'inverse de la position de la caméra:Calculer le vecteur lookat à partir de la position et des angles d'Euler

// Load projection matrix 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

// Set perspective 
gluPerspective(m_fFOV, m_fWidth/m_fHeight, m_fNear, m_fFar); 

// Load modelview matrix 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

// Position camera 
glRotatef(m_fRotateX, 1.0, 0.0, 0.0); 
glRotatef(m_fRotateY, 0.0, 1.0, 0.0); 
glTranslatef(-m_vPosition.x, -m_vPosition.y, -m_vPosition.z); 

Maintenant, j'ai quelques viewports mis en place, chacun avec son propre appareil photo , et de chaque caméra je rends la position des autres caméras (comme une simple boîte). Je voudrais également dessiner le vecteur de vue pour ces caméras, sauf que je n'ai aucune idée de la façon de calculer le vecteur lookat à partir de la position et des angles d'Euler. J'ai essayé de multiplier le vecteur original de la caméra (0, 0, -1) par une matrice représentant les rotations de la caméra puis en ajoutant la position de la caméra au vecteur transformé, mais cela ne fonctionne pas du tout (probablement parce que je « m retirent base):

vector v1(0, 0, -1); 
matrix m1 = matrix::IDENTITY; 
m1.rotate(m_fRotateX, 0, 0); 
m1.rotate(0, m_fRotateY, 0); 

vector v2 = v1 * m1; 
v2 = v2 + m_vPosition; // add camera position vector 

glBegin(GL_LINES); 
glVertex3fv(m_vPosition); 
glVertex3fv(v2); 
glEnd(); 

Ce que je voudrais est de dessiner un segment de droite de la caméra dans la direction de lookat. J'ai regardé partout pour des exemples, mais je n'arrive pas à trouver quelque chose.

Merci beaucoup!

+0

Juste curieux, faites-vous quelque chose pour manipuler le verrou de cardan? – FrustratedWithFormsDesigner

+0

Non, je sais que c'est là, tapi;) Je vais essayer des quaternions plus tard, mais j'aimerais vraiment comprendre cela en premier. – Jaap

+0

Lorsque vous faites pivoter votre appareil photo, vous faites pivoter le monde entier en sens inverse. Ainsi, lorsque vous appliquez la même transformation au vecteur au lieu de le déplacer avec l'appareil photo, faites-le pivoter davantage dans la direction opposée. avec matrice inverse de matrice vous utilisez pour faire pivoter votre vue .. – Ivan

Répondre

4

Je viens de comprendre. Quand je suis retourné à ajouter la réponse, j'ai vu que Ivan venait de me dire la même chose :)

En gros, pour dessiner le vecteur de la caméra, je fais ceci:

glPushMatrix(); 

// Apply inverse camera transform 
glTranslatef(m_vPosition.x, m_vPosition.y, m_vPosition.z); 
glRotatef(-m_fRotateY, 0.0, 1.0, 0.0); 
glRotatef(-m_fRotateX, 1.0, 0.0, 0.0); 

// Then draw the vector representing the camera 
glBegin(GL_LINES); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 0, -10); 
glEnd(); 

glPopMatrix(); 

Cela dessine une ligne de la position de la caméra pour 10 unités dans la direction de recherche.

Questions connexes