So konvertieren Sie lokale Objekt-Koordinaten in Welt-Koordinaten?
Ich brauche eine einfache Möglichkeit zu konvertieren, meine Objekte zu koordinieren, die in Welt-Koordinaten, so dass ein suchen können Sie in das Koordinatensystem und tun Kollisionserkennung?
- Ich empfehle die Lektüre über Lineare Algebra oder Matrix-algebra und auch ein Buch über die Grafik.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst einige Hintergrundinformationen. In 3D-Grafiken, die Sie brauchen, um über mehrere Vektorräume:
[-1, +1]
in jeder dimension.Koordinaten angegeben sind homogen, so dass jeder Vektor hat die Komponenten
(x, y, z, w)
, wow
ist ein Skalierungsfaktor. Erhalten Sie die Koordinaten in 3-Raum als(x/w, y/w, z/w)
. Die Skalierung ist notwendig, für bestimmte Transformationen wie die perspektivische Projektion, die nicht möglich wäre mit nicht-homogenen Koordinaten.4x4-Matrizen sind erforderlich, um die Transformation der Koordinaten von einem Vektorraum zu einem anderen. Sie konnte drei verschiedene Matrizen:
Würden Sie ein Projekt koordinieren
C
auf dem Bildschirm mit der Formel:OpenGL verwaltet intern zwei Matrizen: modelview (model und view miteinander multipliziert) und Projektion. Es ist auch ein textur-matrix, die wir nicht befürchten. Wenn Sie anrufen
glMatrixMode
Sie wechseln zwischen diesen Matrizen. Sie ersetzt die aktuelle matrix durch die Einheitsmatrix mitglLoadIdentity
. Sie Transformationen auf die aktuelle matrix mit Funktionen wieglTranslatef
,glRotatef
odergluProjection
. Jede dieser Funktionen erstellt nur eine 4x4-matrix, die implementiert, dass bestimmte transformation ist, dann multipliziert die aktuelle matrix durch es. Sie können sehen, was die Transformationsmatrizen sind in der OpenGL 2.1 reference pages.Nun für die eigentliche Antwort. Sie verwalten müssen, um ein 4x4-Modell-matrix für jedes Objekt in Ihrer Szene. Das Modell matrix enthält alle Transformationen ändern musste-Modell-Koordinaten in Welt-Koordinaten. Zum Beispiel, jedes mal, wenn Sie rufen
glTranslate
würden, würden Sie aktualisieren Ihr Modell matrix:Dann können Sie Ihr Modell-matrix zu erhalten-Koordinaten in Welt-Raum (stellen Sie sicher, Sie sind homogene Koordinaten zuerst; setzen Sie einfach
w = 1
, wenn Sie nicht):Da Sie die Aufrechterhaltung dieser Transformationen parallel, Sie nicht wirklich brauchen, um Pflege der OpenGL-modelview-matrix nicht mehr. Sie können den pass in Ihrem Modell matrix als eine einheitliche, um die shaders. Sie pflegen Ihre eigene Ansicht und Projektion Matrizen in ähnlicher Weise. Dies ist erforderlich, in den letzten Versionen von OpenGL; alle matrix-handling-Funktionen sind veraltet.
C' = P * V * M * C
jedoch in der Nähe des Ende Sie sagen, dassV' = M * V
. Ich bin ein bisschen verwirrt, denn einmal ist esV * M
und einmalM * V
. Matrix-Multiplikation ist nicht kommutativ, soA * B != B * A
. Könnte es sein, dass entweder die Reihenfolge falsch ist deine Antwort? Vielleicht ist es auch meine Mathe-falsch, aber in diesem Fall fühlen Sie sich frei, mich zu korrigieren.Können Sie das Produkt der inversen der virtuellen Kamera-view-matrix(V-1) mal die ModelView-Matrix (V*M) des Objekts, um Welt-Koordinaten.
Erhalten Sie V nur nach der gluLookAt () - Funktion verwenden:
glGetFloatv (GL_MODELVIEW_MATRIX, camViewMatrix)
dann invertieren der matrix und speichern Sie Sie (verwendet für die Multiplikation später im code.)
Erhalten Sie V*M an dem Punkt, wo Sie sind etwa um ein Objekt zu zeichnen, gerade nach all den glTranslatef(), glRotatef() und glScale () - Befehle mit dem gleichen GL Funktion:
glGetFloatv (GL_MODELVIEW_MATRIX, objectsModelViewMatrix);
V-1 * ( V * M ) == M
Dann mehrere die beiden Matrizen, die resultierende matrix enthält die position, m12 = x, m13 = y und m14 = z
mehr details mit C-code an:
https://sourceforge.net/p/openantz/wiki/Local_to_World_Coordinates/