Seite 1 von 1

Zu doof zum Vektoren Rotieren [Gelöst!]

Verfasst: 13.06.2010, 14:13
von ponx
Hallo Leute,
ich brauch mal wieder Nachhilfe in 3D-mathe Grundlagen. :oops: Folgendes Problem hab ich:
Ich hab ein 3D-Spielobjekt, das in eine bestimmte Richtung guckt (mit dem Unit-Vektor Vector3 'Forward'). Jetzt würde ich gern den toten Winkel des Objekts grafisch darstellen, mit zwei einfachen Linien, die in einem bestimmten Winkel von der Guck-Richtung wegzeigen. Im Lokalen Koordinatensystem konnte ich die auch schön berechnen, nennen wir sie mal toterVector1 und toterVector2. Jetzt müsste ich die nur noch in den gleichen Winkeln rotieren, wie der Forward-Vektor (0 1 0) verdreht ist, und alles wäre ok. Ich habs mir aufgemalt und eigentlich müsste es so gehen: Wenn alpha die Verdrehung des Forward-Vektors um die Z-Achse ist, dann wäre

sin(alpha) = Forward.X
-> sprich ich krieg meine Verdrehung um die Y-Achse mit ArcSin(Forward.X) , richtig ?

Und wenn beta die Verdrehung meines Forward-Vektors um die X-Achse ist, dann wäre

tan(beta) = Forward.Z / Forward.Y
-> sprich beta = ArcTan(Forward.X / Forward.Z) ?

Jetzt müsste ich nur davon wieder je eine Rotations-Matrix für X- und Y-Rotation erstellen, also (in XNA):

Matrix rotX = Matrix.CreateRotationY(alpha);
Matrix rotY = Matrix.CreateRotationX(beta);

.. und dann meine beiden toten Vektoren damit drehen..

toterVector1 =Vector3.Transform(toterVector1, rotX * rotY);
toterVector2 = Vector3.Transform(toterVector2, rotX * rotY);

und dann auf Weltkoordinaten verschieben, und alles wäre gut ? Die zeigen nur leider sonstwo hin. Was mach ich falsch ? :cry:

lg vom ponx

Re: Zu doof zum Vektoren Rotieren

Verfasst: 14.06.2010, 09:19
von Brainsmith
Egal, in welcher Sprache. Es gilt immer:

Wenn du einen Vektor drehen willst, verschiebst du ihn zuerst an den Ursprung, drehst ihn und verschiebst ihne wieder zurück. In jedem anderen Fall drehst du um eine andere Achse. So wie ich das bisher sehe, hast du vergessen die Vektoren vor dem Drehen an den Ursprung zu verschieben

Re: Zu doof zum Vektoren Rotieren

Verfasst: 14.06.2010, 17:21
von ponx
Danke für die Antwort ! Der Forward-Vektor ist schon im Ursprung, d.h. es ist einfach der Blickrichtungs-Vektor des Spielobjekts in Unit-Länge. Meine "toten Vektoren" haben auch Unit-Länge, ich mal die dann nur an die Position des Spielobjekts in Weltkoordinaten.
Ich hab's jetzt hinbekommen, weil ich glücklicherweise auch die gedrehten "Up" und "Side" Vektoren hatte, die dann zusammen mit dem Forward-Vektor die drei gedrehten Ortsvektoren bilden. Damit konnte ich dann die Rotationsmatrix zusammenbasteln, indem ich die da reinkopiert hab. Plus bisschen rumprobieren hat's dann irgendwie geklappt, hurra !

Re: Zu doof zum Vektoren Rotieren [Gelöst!]

Verfasst: 15.06.2010, 07:58
von joeydee
ponx hat geschrieben:Ich hab's jetzt hinbekommen, weil ich glücklicherweise auch die gedrehten "Up" und "Side" Vektoren hatte, die dann zusammen mit dem Forward-Vektor die drei gedrehten Ortsvektoren bilden. Damit konnte ich dann die Rotationsmatrix zusammenbasteln
Hättest du gar nicht zusammenbasteln müssen - einfach deine Vektoren mit der aktuellen Objektmatrix multiplizieren und sie sind da wo sie hingehören. Denn in Gedanken kannst du sie einfach als weitere Vertices deines Modells betrachten.

Re: Zu doof zum Vektoren Rotieren [Gelöst!]

Verfasst: 15.06.2010, 13:10
von ponx
joeydee hat geschrieben: Hättest du gar nicht zusammenbasteln müssen - einfach deine Vektoren mit der aktuellen Objektmatrix multiplizieren und sie sind da wo sie hingehören. Denn in Gedanken kannst du sie einfach als weitere Vertices deines Modells betrachten.
Ich hatte die Objektmatrix nicht, weil das Rendern über so einen abstrakten Render-Aufruf bewerkstelligt wird (das Projekt ist nicht auf meinem Mist gewachsen). Aber hätte ich mich da mal weiter reingefuchst, wär ich bestimmt schneller auf die Idee mit dem Matrix-Basteln gekommen..! :oops: