2010-12-07 14 views
4

Grüße alle,OpenGL, World to Object Koordinatenmapping? (Inverse Matrix)

Wie im Bild zu sehen,

alt text

Ich habe ein Objekt mit dem Namen O (Satz von linestripes) .Seine Objekt-Koordinatensystem (x‘, y ', z'). I, drehen Sie dieses Objekt in meine OpenGL-Szene mit folgenden Code-Schnipsel übersetzen:

glPushMatrix(); 
glTranslatef(Oz, Oy,Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 
contour->render(); 
glPopMatrix() 

;

Ich habe einen Punkt genannt H, die (hx, hy, hz) Weltkoordinaten mit übersetzt

glPushMatrix(); 
glTranslatef(hx,hy,hz); 
glPopMatrix(); 

Wenn ich richtig, (Oz, Oy, Oz) und (hx, hy, hz) sind Weltkoordinaten.

Nun, was ich will Todo ist die Position von H (hx, hy, hz) relativ zu O-Objekt-Koordinatensystem zu berechnen. (X ', y', z '); Wie ich verstanden habe, kann ich dies tun, indem Sie inverse Transformationen von Objekt O berechnen und sie auf Punkt H anwenden.

Irgendwelche Tipps zu diesem Thema? Gibt OpenGL irgendwelche Funktionen für die Inverse-Matrix-Berechnung? Wenn ich irgendwie umgekehrte Matrizen gefunden habe, wie ist die Reihenfolge ihrer Multiplikation?

Hinweis: Ich möchte "hammer" wie Werkzeug implementieren, wo ich an Punkt H eine Kugel mit Radius R zeichne. Benutzer kann diese Kugel verwenden, um das Objekt O wie ein Hammer zu zerhacken. Ich habe dies in 2D implementiert Ich kann den gleichen Algorithmus verwenden, wenn ich die Hammerposition relativ zu (x ', y', z ') berechnen kann

Vielen Dank im Voraus.

+1

Wenn ich Ihre Frage verstehe, wäre es nicht einfach "{Ox - hx, Oy - hy, Oz - hz}" (dh 'glTranslatef (Ox - hx, Oy - hy, Oz - hz);') Wenn Sie bereits Ihre globalen Vektoren 'O' und' h' haben, ist es eine einfache Sache der Vektorsubtraktion, die Matrixmanipulation vollständig aus der Gleichung herauszulassen. Ihre ursprüngliche Lösung klingt übrigens korrekt. – MrGomez

+0

hi, ich muss die ursprünglichen Objektkoordinaten des Objekts O ändern. Das heißt, ich muss Objektkoordinaten vergleichen, nicht Weltkoordinaten. –

+1

Keine Sorge. Ein kurzer Refresher erinnerte mich daran, dass OpenGL keine universelle Matrixbibliothek zur Verfügung stellt. Sie müssen hierfür eine separate Bibliothek verwenden oder die Berechnung selbst durchführen (http://mathworld.wolfram.com/MatrixInverse.html). – MrGomez

Antwort

2

Das Invertieren der Matrix wäre die allgemeine Lösung, aber soweit ich das sehen kann, handelt es sich nicht wirklich um ein "allgemeines" Problem. Anstatt eine willkürliche Transformation rückgängig zu machen, versuchen Sie, eine bekannte Abfolge von Transformationen umzukehren, von denen jede sehr einfach invertiert werden kann. Wenn Ihr Objekt-zu-Welt Transformation ist:

glTranslatef(Ox, Oy, Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 

Dann wird die Welt-zu-Objekt invers ist nur:

glRotatef(-rotationZ, 0.0, 0.0, 1.0); 
glRotatef(-rotationY, 0.0, 1.0, 0.0); 
glRotatef(-rotationX , 1.0, 0.0, 0.0); 
glTranslatef(-Ox, -Oy, -Oz); 

Grundsätzlich gerade zurück aus jeder Transformation in umgekehrter Reihenfolge ursprünglich angelegt.

2

Ja, im Grunde sind Sie richtig, dass Sie diesen Vorgang

durch die Übersetzung Matrix durchführen kann

M = O^-1 * H

wie Sie eine bereits erraten Sie die Inverse von O für diese müssen . OpenGL ist keine Math-Bibliothek, sondern nur Rendering. Sie müssen also die Inversion selbst implementieren. Google für "Gauss Jordan", um einen möglichen Algorithmus zu finden. Wenn Sie absolut sicher sein können, dass O nur aus Rotation und Translation besteht, dh keine Scherung oder Skalierung, dann können Sie die obere linke 3x3 Submatrix transponieren und die obersten 3 Elemente der rechten Spalte negieren (dies nutzt die Natur von Orthogonal) Matrizen, wie Rotationsmatrizen, dass die Transponierung auch das Inverse ist, ist die obere linke 3x3 der Rotationsteil, die Umkehrung einer Translation negiert die Elemente ihres Vektors, der die am weitesten rechts liegenden oberen 3 Elemente ist.