Wie kombinieren Sie X-, Y- und Z-Rotationen im lokalen Bereich eines Modells (nicht global)?

8

Ich beginne mit Molehill und habe viele Probleme mit Matrix3D. Mein erstes Problem ist, wie man ein Matrix3D verwaltet, das die Ausrichtung eines einzelnen Modells beschreibt.

Ich verwende Matrix3D.appendRotation (), um dies zu tun. Aber abhängig von der Reihenfolge, in der ich anhänge, bekomme ich ein anderes Ergebnis (offensichtlich, da ich im globalen Raum einzeln rotiere). Ich weiß, das ist ein häufiges Problem, ich habe es mit 3D-Software-Modellierung kennengelernt. Aber dieses Mal muss ich es programmatisch reparieren. Hier brauche ich Hilfe.

Erstens, falls es irgendeine Verwirrung gibt, hier ist das Problem in Bildern:

Schritt 1: Ich rendere ein Modell.

Schritt 2a: Ich drehe es auf der X-Achse. Sieht richtig aus!

Schritt 2b: Ich drehe es auf der Z-Achse. Sieht richtig aus!

Also ... wenn ich auf der X- und Z-Achse des Modells rotiere, möchte ich dies:

Aber, trauriges Gesicht, ich verstehe das:

Ich kann das Problem sehen . Ich füge die Rotationen nacheinander im globalen Raum an. Ich muss im lokalen Bereich des Objekts drehen. Ich habe KEINE Ahnung, wie ich das machen soll oder wonach ich eigentlich suchen soll (Terminologie usw.). Der Code ist einfach (und falsch):

%Vor%

Ich vermute, dass ich anstelle der Vector3D-Achsenkonstanten einen normalisierten Vektor und einige ... uh, ding ... anstelle von modelZRot, modelXRot und eventuell modelYRot verwenden möchte. Kann mir jemand sagen, was die Best-Practice-Lösung ist, um den gewünschten Rotationstyp oben anzuwenden?

UPDATE: Den Tag damit verbracht, die "Bücher" (aka KhanAcademy auf YouTube) zu schlagen und mit dieser Präsentation zu beginnen: The Mathematics der 3D-Rotationsmatrix Ich bin auf eine Art "Anschau" -Methode gestoßen, die meiner gewünschten Lösung sehr nahe kommt. Leider verstehe ich es nur zu 50%. Ich hoffe immer noch, dass jemand dieses Thema beleuchten kann!

%Vor%

Sache ist, das scheint ziemlich klobig. Zumal der Drehwinkel für ein Vector3D der vierte (w) Wert sein sollte. Noch wichtiger: Matrix3D scheint bereits eine lookAt () -Methode zu haben. Ich verstehe es noch nicht ... bitte rette mich vor stundenlangem Ausprobieren!

    
jpwrunyan 23.11.2011, 06:18
quelle

1 Antwort

2

Ok, ich habe herausgefunden, wie das geht. Es ist viel einfacher als ich es gemacht habe. Es half auch, die Matrix3D API zu überprüfen (es hat einige tolle Funktionen!).

Zuerst habe ich den Quellcode verwendet, um mein Modell auf seinen lokalen Achsen zu drehen:

%Vor%

Die normalisierten "up" -, "right" - und "out" -Vektoren werden im Link in meinem ursprünglichen Beitrag besprochen. Sie sind im Wesentlichen die Nick-, Gier- und Rollachsen des Modells. Es genügt zu sagen, dass diese Vektoren beim Initialisieren Ihres Objekts identisch mit Vector3D.X_AXIS, Y_AXIS und Z_AXIS sind. Ich habe sie mit Matrix3D.rawData Eigenschaft extrahiert, obwohl es einen besseren Weg geben kann.

Nun können Sie beliebig entlang dieser Achsen rotieren, aber in dem Moment, in dem Sie dies tun, ändert sich die Ausrichtung der beiden anderen Achsen sofort. Das macht Sinn. Dein Modell hat sich gedreht und seine "Rechte", "Oben" und "Vorwärts" sind jetzt anders! Wenn Sie also anfangen, auf der "rechten" Achse des Modells zu drehen (denken Sie daran, dass dies mit der globalen X_AXIS beginnt), und dann möchten Sie Ihr Modell auf seiner "Out" -Achse rollen, müssen Sie es aus dem lokalen Modell holen Matrix. Offensichtlich ist es nicht mehr dasselbe wie das globale Z_AXIS. Beachten Sie, dass ich Matrix3D.identity () nicht aufrufen. Wenn ich das täte, würden die Achsen meines Modells zurückgesetzt werden! Dies ist in Ordnung für meine Rendering-Schleife, obwohl ich meinen Code (und meine Denkweise) etwas ändern musste, da ich alle meine Matrizen zurückgesetzt hatte, bevor ich Transformationen und Rotationen anwendete. Beachten Sie, dass modelXRot, modelYRot und modelZRot einen Rotationswert in Grad speichern.

Ich hoffe, das hilft jemandem. Ich kann nicht glauben, dass ein so allgemeines Problem mit solch einer einfachen Lösung nirgendwo zu finden war. Jedenfalls scheint es genau das zu tun, was ich will.

    
jpwrunyan 23.11.2011, 13:04
quelle