2012-03-28 3 views
0

Ich zeige ein Objekt in OpenGL unter Verwendung einer Modellmatrix für das Objekt, die ich von meinem zuvor gespeicherten Objektstandort UND eine Quaternion auf die Rotation angewendet. Ich muss die endgültigen kartesischen Koordinaten in 3D meines Objekts nach den Rotationen und Transformationen finden (die Koordinaten, dass das Objekt auf dem Bildschirm erscheint). Wie bekomme ich die einfachen Koordinaten?Finden Sie die endgültigen Weltkoordinaten aus der Modellmatrix oder Quaternion

+1

Ich bin nicht sicher, was Sie fragen ... Multiplizieren Sie die Matrix mit dem Punkt Koordinatenvektor? Wenn Sie jedoch die Position auf dem Bildschirm erhalten möchten, müssen Sie auch die Kameramatrix berücksichtigen. – cooky451

+1

@ cocy451: Die Ansichtsmatrix ist nur ein Teil, es gibt auch die Projektionsmatrix (die nicht mit einer Kamera verwechselt werden darf!) Und den Normierungsschritt. – datenwolf

+0

Ich versuche, die Weltkoordinaten eines Objekts zu erhalten, mit den Drehungen (die endgültige Position). Ich rotiere das Objekt NICHT im Ursprung, daher hat das Objekt aufgrund der Rotation in einer Nicht-Ursprungsposition einen gewissen Versatz. Ich muss diese Position finden, die ich sehe. –

Antwort

2

Wenn ich richtig verstehe, haben Sie ein Objekt; Wenn Sie es ohne Anwendung einer Transformation gerendert haben, wäre sein Mittelpunkt [0,0,0].

Sie haben einen Punkt, [a, b, c], im 3D-Raum. Sie wenden eine Übersetzung auf die Modelview-Matrix an. Wenn Sie nun das Objekt gerendert haben, wäre sein Mittelpunkt bei [a, b, c] in Weltkoordinaten.

Sie haben eine Quaternion, [qw, qx, qy, qz]. Sie create a rotation matrix, M, von diesem und wenden Sie es auf die Modelview-Matrix. Nun wollen Sie die neuen Koordinaten [a ', b', c '] des Objektzentrums im Weltall kennen.

Wenn dies wahr ist, dann ist der einfachste Weg, das zu tun, die Matrix selbst Multiplikation:

a' = m11*a + m12*b + m13*c 
b' = m21*a + m22*b + m23*c 
c' = m31*a + m32*b + m33*c 

wo

[m11 m12 m13] 
M = [m21 m22 m23] 
    [m31 m32 m33] 

Aber vielleicht bist du nicht wirklich bauen M. Ein anderer Weg wäre, die Quaternion direkt zu verwenden, obwohl das im Wesentlichen darin besteht, die Rotationsmatrix aufzubauen und sie dann zu verwenden.

Es sollte nicht notwendig sein, gluProject zu verwenden. Wenn Sie die Rotation auf die Modelview-Matrix anwenden, wird die Matrix multipliziert. So könnten Sie bekommen nur die Werte aus der Matrix selbst:

double mv[16]; 
glGetDoublev(GL_MODELVIEW_MATRIX,mv); 
a' = mv[13]; 
b' = mv[14]; 
c' = mv[15]; 

Dies sagt Ihnen, wo die Model-View-Matrix ist der Ursprung des Modells bewegen.

+0

Ich habe die Methode in ähnlicher Weise implementiert, aber das scheint noch einfacher.Große Antwort, ich bin sicher, dass ich Ihre Methode in meinen zukünftigen Projekten verwenden werde, die sehr bald kommen werden :) –

+0

Danke, das hat mir geholfen. FYI, glGetDoublev sollte einen Kleinbuchstaben v haben. Ich würde Ihre Antwort bearbeiten, um sie selbst zu ändern, aber es scheint mir nicht erlaubt zu sein, ein einzelnes Zeichen zu bearbeiten. –

+0

@Mitch Danke. Ich habe es repariert. – JCooper

1

Re-implementieren Sie gluProject() und wenden Sie alles außer der Viewport-Transformation an.

+0

wäre es nicht ein bisschen übertrieben? Ich bin nicht sehr gut mit Matrizen und Projektion, es sollte die letzte Wahl sein, wenn es eine einfachere Methode gibt? oder wenn das gluProject einfach ist, wo finde ich eine einfache Erklärung davon (die ich gefunden habe, sind verwirrend) –

+0

oder die aktuellen Matrizen schieben, Identität als Ansichtsmatrix laden und meine Modellmatrix als Modellansichtsmatrix laden und aufrufen gluProject Arbeit? –

Verwandte Themen