2 Stimmen

Berechnung des Lookat-Vektors aus Position und Euler-Winkeln

Ich habe eine Kamera im FPS-Stil implementiert, wobei die Kamera aus einem Positionsvektor und den Euler-Winkeln Pitch und Yaw (x- und y-Drehungen) besteht. Nach dem Einrichten der Projektionsmatrix übersetze ich dann durch Drehen in die Kamerakoordinaten und übersetze dann in die Umkehrung der Kameraposition:

// 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);

Jetzt habe ich ein paar Ansichtsfenster eingerichtet, jedes mit seiner eigenen Kamera, und von jeder Kamera rendern ich die Position der anderen Kameras (als eine einfache Box). Ich möchte auch den Blickvektor für diese Kameras zeichnen, aber ich habe keine Ahnung, wie ich den Blickvektor aus der Position und den Euler-Winkeln berechnen kann. Ich habe versucht, den ursprünglichen Kameravektor (0, 0, -1) mit einer Matrix zu multiplizieren, die die Kameradrehungen darstellt und dann die Kameraposition zu dem transformierten Vektor zu addieren, aber das funktioniert überhaupt nicht (wahrscheinlich, weil ich weit von der Basis entfernt bin):

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();

Ich möchte ein Liniensegment von der Kamera in Richtung der Blickrichtung zeichnen. Ich habe überall nach Beispielen dafür gesucht, aber ich kann nichts finden.

Herzlichen Dank!

4voto

Jaap Punkte 83

Ich habe es gerade herausgefunden. Als ich zurückging, um die Antwort hinzuzufügen, sah ich, dass Ivan mir gerade das Gleiche gesagt hatte :)

Um den Kameravektor zu zeichnen, gehe ich im Wesentlichen folgendermaßen vor:

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();

Dies zeichnet eine Linie von der Kameraposition um 10 Einheiten in Blickrichtung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X