Rotation um drei Achsen < Lin. Algebra/Vektor < Oberstufe < Schule < Mathe < Vorhilfe
|
Hi!
Ich schreibe gerade ein Computerprogramm, indem sich Würfel in einem 3dim. Raum bewegen. Jeder Würfel hat eine Position und eine Richtung (ausgedrückt in normalisiertem Vektor).
Nun hätte ich gerne folgendes: Jeder Würfel soll "in die Richtung schauen, in die er sich bewegt", d.h. er soll je nach Richtung so rotiert sein, dass 4 seiner Kanten parallel zum Richtungsvektor sind und die anderen 8 im rechten Winkel dazu. Dabei ist es mir egal, welche Seite des Würfels "nach vorne schaut".
Nun bietet mir das java3d class framework folgende Methoden, um den Würfel zu rotieren:
rotX(Winkel im Bogenmaß): Körper wird um den Winkel um die X-Achse gedreht
und entsprechend rotY und rotZ.
Leider kann ich mir nur schwer stellen, wie ich den Körper erst um die x-achse, dann um die y-achse und dann u die z-achse drehen muss, damit der Würfel z.B. in die Richtung [mm] \pmat{ 1 \\ 1 \\ 1 } [/mm] "schaut". In der Schule hatten wir sowas leider nie...
jemand eine Idee?
|
|
|
|
Hallo Bit2_Gosu,
das ist einerseits nicht so schwierig, wie es aussieht, andererseits...
Hast Du schon einmal mit Rotationsmatrizen gearbeitet? Wenn ja, wäre das hier der einfachste Weg. Wenn nein, vergiss ihn am besten gleich wieder.
> Ich schreibe gerade ein Computerprogramm, indem sich Würfel
> in einem 3dim. Raum bewegen. Jeder Würfel hat eine Position
> und eine Richtung (ausgedrückt in normalisiertem Vektor).
Du meinst mit Richtung hier die Bewegungsrichtung, richtig?
> Nun hätte ich gerne folgendes: Jeder Würfel soll "in die
> Richtung schauen, in die er sich bewegt", d.h. er soll je
> nach Richtung so rotiert sein, dass 4 seiner Kanten
> parallel zum Richtungsvektor sind und die anderen 8 im
> rechten Winkel dazu. Dabei ist es mir egal, welche Seite
> des Würfels "nach vorne schaut".
Das ist keine eindeutige Lage. Vielleicht liegt da Dein Problem. Der Würfel kann ja dann um eine Achse in Richtung seines Richtungsvektors rotieren, und würde doch zu jedem Zeitpunkt Deine Bedingung erfüllen!
> Nun bietet mir das java3d class framework folgende
> Methoden, um den Würfel zu rotieren:
>
> rotX(Winkel im Bogenmaß): Körper wird um den Winkel um die
> X-Achse gedreht
> und entsprechend rotY und rotZ.
>
> Leider kann ich mir nur schwer stellen, wie ich den Körper
> erst um die x-achse, dann um die y-achse und dann u die
> z-achse drehen muss, damit der Würfel z.B. in die Richtung
> [mm]\pmat{ 1 \\ 1 \\ 1 }[/mm] "schaut". In der Schule hatten wir
> sowas leider nie...
Leg den Würfel mal so, dass sein Mittelpunkt im Koordinatenursprung liegt und seine Kanten parallel zu den Koordinatenachsen. Nehmen wir an, Du wolltest die Seite, die "in x-Richtung" liegt, jetzt in die Richtung [mm] \vektor{1\\1\\1} [/mm] drehen. Dazu gibt es verschiedene Möglichkeiten, ich zeige mal eine, die anderen findest Du dann wahrscheinlich selbst.
Zuerst reduziere ich den Würfel in Gedanken auf den Vektor vom Würfelmittelpunkt zum Mittelpunkt der Seite, die "nach vorn" schauen soll. Das ist hier offenbar der Vektor [mm] \vec{w}=\vektor{1\\0\\0}.
[/mm]
Da der Vektor beim Drehen seine Länge nicht verändern wird, soll er also durch zwei Drehungen um verschiedene Achsen in den Vektor [mm] \bruch{1}{3}\wurzel{3}\vektor{1\\1\\1} [/mm] überführt werden.
Die erste Drehung erfolgt nun um die y-Achse um den Winkel [mm] \arcsin{\left(\bruch{1}{3}\wurzel{3}\right)}. [/mm] Der Vektor wird dabei wie folgt abgebildet:
[mm] \vektor{1\\0\\0} \mapsto \bruch{1}{3}\wurzel{3}\vektor{\wurzel{2}\\0\\1}
[/mm]
(nachrechnen!)
Diesen Vektor drehen wir jetzt um [mm] -\bruch{\pi}{4} [/mm] um die z-Achse und erhalten:
[mm] \bruch{1}{3}\wurzel{3}\vektor{\wurzel{2}\\0\\1} \mapsto \bruch{1}{3}\wurzel{3}\vektor{1\\1\\1}
[/mm]
Fertig.
Versuch mal, Dir das räumlich vorzustellen, dann findest Du auch leicht die Werte für die nötigen Drehwinkel bzw. den Weg, wie man sie bestimmt.
Dann versuche, das gleiche Ziel zu erreichen, indem Du erst um die y-Achse drehst und dann um die x-Achse. Ein Tipp dazu: die erste Drehung wird nicht die gleiche sein wie die oben!
Es gibt vier Kombinationen von zwei Drehungen, die dieses Ergebnis hervorbringen:
1) erst um y, dann um z (s.o.)
2) erst um y, dann um x (Dein Part...)
3) erst um z, dann um y
4) erst um z, dann um x
Du wirst das Thema besser verstehen, wenn Du für alle vier mal die Winkel bestimmst.
Grüße,
reverend
> jemand eine Idee?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:36 Do 19.02.2009 | Autor: | Bit2_Gosu |
schonmal vielen Dank für deine ausführliche Antwort!
Ich werde deine Lektüre morgen intensiv studieren ;)
|
|
|
|
|
ok, ich hab das jetzt verstanden. Vielen Dank!
Du meintest ja, dass es mit Rotationsmatrizen leichter wäre.
Ich habe festgestellt, dass Java3d das rotieren mit 3x3 Matrizen erlaubt.
Ich wusste zwar bis dato nichts von Rotationsmatrizen, habe mich aber jetzt ein bisschen eingelesen.
Wenn ich richtig liege, wäre in unserem Fall die Rotationsmatrix
für
[mm] \alpha [/mm] = [mm] asin(\bruch{\wurzel{3}}{3})
[/mm]
[mm] \beta [/mm] = [mm] \bruch{-\pi}{4}
[/mm]
[mm] \pmat{ \cos\alpha*\cos\beta & -sin\beta & \sin\alpha*\cos\beta \\ \cos\alpha*\cos\beta & \cos\alpha & \sin\alpha*\sin\beta \\ -\sin\alpha & 0 & \cos\alpha }.
[/mm]
Was auf den Vektor [mm] \vektor{1 \\ 0 \\ 0} [/mm] angewandt dann folgendes ergibt:
[mm] \pmat{ \bruch{\wurzel{3}}{3} & 0 & 0 \\ 0 & \bruch{\wurzel{3}}{3} & 0 \\ 0 & 0 & \bruch{\wurzel{3}}{3} }.
[/mm]
Jetzt habe ich in meinem Programm mal die Funktion "getRotationalScale", die eine 3x3 Matrix ausgibt, aufgerufen. Und zwar auf einen Würfel im Ursprung, den ich noch nicht gedreht habe. Ausgegeben wird:
[mm] \pmat{ 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 }
[/mm]
das verstehe ich irgendwie nicht ganz.
Dann hab ich mal auf den Würfel unsere zwei Achsenrotationen ausgeführt und dann wieder die Funktion ausgeführt. Ergebnis:
[mm] \pmat{ -\cos\alpha*\cos\beta & \cos\alpha*\cos\beta & \cos\alpha*\cos\beta\\ \sin\beta & -\sin\beta & 0 \\ \sin\alpha*\sin\beta & -\sin\alpha*\sin\beta & \cos\alpha }.
[/mm]
Kann sich jemand die letzten beiden (ich denke doch Rotations-) Matrizen eklären??
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:20 Mo 23.02.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|