Drehwinkel in 3D berechnen < Skalarprodukte < Lineare Algebra < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:21 Mi 21.09.2011 | Autor: | Pille456 |
Hi!
Ich versuche gerade in Matlab ein 3D-Objekt auf ein bestimmtes Ziel auszurichten, bekomme es aber nicht ganz hin.
Zur Rotation des Objektes stehen mir 3 Befehle rotateX/Y/Z zur Verfügung, die das Objekt jewels um die entsprechende Achse in Grad drehen.
Um nun an die Winkel zu kommen, tue ich folgendes:
Richtungsvektor: [mm] \vektor{x \\ y \\ z} [/mm] = [mm] \vektor{x_{ziel} \\ y_{ziel} \\ z_{ziel}}-\vektor{x_{pos} \\ y_{pos} \\ z_{pos}}
[/mm]
Winkel für x-y-Ebene [mm] \alpha [/mm] = [mm] arccos(\bruch{x*1}{\wurzel{x^2+y^2}}) [/mm] (d.h. ich berechne den Winkel in der x-y Ebene im Bezug auf die X-Achse)
Da mir das Skalarprodukt immer den geringsten Winkel zurückgibt, unterscheide ich jetzt noch zwischen den 4 Quadranten, damit das auch passt.
Und dann führe ich ein rotateX(..) durch.
Wenn ich diese Berechnungen+Rotationen einzeln durchführe, dann passt das auch alles. Nur sobald ich X/Y/Z hintereinander ausführe, kommt es zu Problemen. Die Drehungen an sich sollten stimmen, ich denke nur, dass ich den Winkel irgendwie falsch berechne. Kann es sein, dass sich die Drehnungen / Winkel irgendwie beeinflussen? Also wenn ich bereits um [mm] \alpha [/mm] Grad in X-Richtung gedreht habe, dass ich dann nur noch um [mm] \beta [/mm] Grad in Y-Richtung drehen muss (und eben nicht mehr um den Wert den ich zuvor berechnet habe) ?
Gruß
Pille
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:36 Mi 21.09.2011 | Autor: | leduart |
Hallo
ja, du kannst nicht so drehen! du solltest gar nicht mit den Rotationen um die achsen arbeiten!
Du willst den Raum drehen, stell dir das als translation auf einer kugelobefläche vor, die erreichst du, indem du 2 drehungen um 180° ausführst, 1. Drehung um den Ausgangspfeil, nächste drehung um die winkelhalbierende.
Die 180° Drehung um den Vektor n (normiert ) ist x=>-x+2*<n,x>*n (alles Vektoren)
Gruss leduart
|
|
|
|
|
Hi!
Danke für Deine Antwort. Leider habe ich momentan keinen Zugang zu Matlab, aber ich werde das morgen nochmal probieren.
2 Drehungen reichen aus, das verstehe ich, aber wie meinst Du
"Die 180° Drehung um den Vektor n (normiert ) ist x=>-x+2*<n,x>*n (alles Vektoren) " bzw. das mit der Winkelhalbierenden?
Ich habe einen Vektor mit [mm] \vektor{x \\ y \\ z} [/mm] als Richtungsvektor und kann mit rotateX/Y/Z das Objekt bzw. das Koordinatensystem des Objektes drehen.
Vereinfacht gehe ich nun mal davon aus, dass das Objekt einfach eine Art 3D-Pfeil ist, der standardmäßig in Richtung X-Achse zeigt und gedreht wird immer im math. positiven Sinne.
Dann führe ich ich zuerst eien Drehung in der xy-Ebene durch (d.h. ich rotiere die Z-Achse). Den Winkel müsste ich noch "normal" per Skalarprodukt bestimmen können. Danach rotiere ich in der xz oder yz Ebene. Intuitiv macht das für mich gerade keinen Unterschied welche Ebene ich dort nehme - gibt es da einen?
Das Problem was ich gerade sehe ist, dass ich nicht um welche 2. Achse (x oder y) ich drehen muss und wie groß der Winkel dabei sein muss. Hat da jemand eine Idee?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:31 Mi 21.09.2011 | Autor: | leduart |
Hallo
es ist unübersichtlich und schwierig eine Drehung um eine beliebige Achse durch ne Drehung um y und x- Achse zu verwirklichen. es ist auch nicht der übliche Weg, den hab ich dir beschrieben!
Gruss leduart
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:20 Fr 23.09.2011 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
> Ich versuche gerade in Matlab ein 3D-Objekt auf ein
> bestimmtes Ziel auszurichten, bekomme es aber nicht ganz
> hin.
> Zur Rotation des Objektes stehen mir 3 Befehle rotateX/Y/Z
> zur Verfügung, die das Objekt jewels um die entsprechende
> Achse in Grad drehen.
Hallo Pille,
es kommt darauf an, was du genau willst und was du damit
meinst, das 3D-Objekt "auf ein bestimmtes Ziel auszurichten".
Ich stelle mir mal vor, dass es sich bei dem zu drehenden Objekt
um deinen eigenen Kopf handelt und dass du beabsichtigst,
ein anderes Objekt in deiner Umgebung anzuschauen, zum
Beispiel das Gesicht einer anderen Person, die dich anschaut.
Wenn du zuerst gerade nach vorne schaust (in x-Richtung),
könntest du dich und/oder deinen Kopf zuerst um eine vertikale
Achse (z-Achse, deine Halswirbelsäule) drehen. In einer zweiten
Drehung hebst oder senkst du deinen Kopf und damit deinen
Blick, bis du in das Gesicht der anderen Person schaust.
Nun hast du vielleicht noch das Bedürfnis, deinen Kopf je
nachdem seitlich nach links oder rechts zu neigen, damit du
das andere Gesicht auch "aufrecht" siehst (Nasen parallel
ausgerichtet ).
Wenn man das Ganze so beschreibt, trägst du sozusagen ein
eigenes, mit deinem Körper bzw. deinem Kopf verbundenes
Koordinatensystem mit dir herum, in welchem du deine
aufeinanderfolgenden Drehungen beschreibst.
Eine andere Möglichkeit wäre, dass wir alle Drehungen in
einem ortsfesten Koordinatensystem beschreiben. Dazu
benützen wir als Modell lieber eine zu positionierende
Kamera als deinen Kopf. Die Kamera sei in einer kardanischen
Aufhängung montiert, welche man um drei feste, paarweise
zueinander senkrechte Achsen (x-Achse, y-Achse, z-Achse)
drehen kann. Dabei kann man ebenfalls 3 Drehwinkel
vorgeben. Die Reihenfolge der Ausführung der 3 Drehungen
ist dabei wesentlich. Ebenso wie du deinen Kopf in jede
beliebige Lage bringen kannst, kann man dies mit der Kamera
tun - aber die Drehwinkel, die man bei diesen beiden Betrach-
tungsweisen braucht, sind keineswegs dieselben.
Beschreibe also bitte etwas genauer, was du beabsichtigst,
und schau z.B. einmal da nach: Eulersche Winkel
LG Al-Chw.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:10 Mi 21.09.2011 | Autor: | Pille456 |
Hi,
danke erstmal für Deine Antwort.
Eigentlich möchte ich nur folgendes machen:
Ich habe ein Flugzeug mit einer Position und einem Ziel und möchte dieses Flugzeug auf das Ziel ausrichten.
In Analogie zu dem Kopf reicht es mir aus, den Kopf um die vertikale Achse zu drehen und ihn dann zu heben/senken.
Soweit ich die Befehle rotateX/Y/Z verstanden habe, hat ein Objekt immer sein eigenes Koordinatensystem, d.h. der erste beschriebene Fall tritt ein.
Das Dumme ist, dass ich wirklich nur diese 3 Befehle benutzen kann, um das Objekt zu rotieren und ich nicht mit Rotationsmatrizen oder so arbeiten kann, da diese entsprechende Befehle einfach nicht bereitgestellt werden.
Vielleicht als kleine Entschuldigung, ich habe hiermit keinerlei Erfahrung und bisher auch nicht viel drüber gelesen/gehört. Ich mache das für meine Freizeit und habe auch keine spezielle Vorlesung/Buch o.Ä. bzgl. dieses Themas, daher verstehe ich auch leduart's doch recht knappe Antwort nur relativ schwer.
Es ist mir mittlerweile bewusst, dass mir 2 Drehungen vollkommen ausreichen, jedoch habe ich mit folgendem Beispiel schon Probleme:
Das Flugzeug sei an Position (0/0/0) und soll ich Richtung (1/1/1) zeigen. Um das zu schaffen, muss ich folgende Drehungen machen:
Um die Z-Achse um 45° und dann dass Flugzeug um 35° heben. Die beiden Winkel sollte ich eigentlich realtiv problemlos berechnen können, nur weiß ich nicht wie ich dann rotieren muss, damit das Flugzeug um 35° gehoben wird.
(angenommen dabei natürlich immer, dass das Flugzeug in einer "vernünftigen" Ausgangslage ist)
|
|
|
|
|
> Hi,
>
> danke erstmal für Deine Antwort.
> Eigentlich möchte ich nur folgendes machen:
> Ich habe ein Flugzeug mit einer Position und einem Ziel
> und möchte dieses Flugzeug auf das Ziel ausrichten.
> In Analogie zu dem Kopf reicht es mir aus, den Kopf um die
> vertikale Achse zu drehen und ihn dann zu heben/senken.
> Soweit ich die Befehle rotateX/Y/Z verstanden habe, hat
> ein Objekt immer sein eigenes Koordinatensystem, d.h. der
> erste beschriebene Fall tritt ein.
>
> Das Dumme ist, dass ich wirklich nur diese 3 Befehle
> benutzen kann, um das Objekt zu rotieren und ich nicht mit
> Rotationsmatrizen oder so arbeiten kann, da diese
> entsprechende Befehle einfach nicht bereitgestellt werden.
>
> Vielleicht als kleine Entschuldigung, ich habe hiermit
> keinerlei Erfahrung und bisher auch nicht viel drüber
> gelesen/gehört. Ich mache das für meine Freizeit und habe
> auch keine spezielle Vorlesung/Buch o.Ä. bzgl. dieses
> Themas, daher verstehe ich auch leduart's doch recht knappe
> Antwort nur relativ schwer.
>
> Es ist mir mittlerweile bewusst, dass mir 2 Drehungen
> vollkommen ausreichen, jedoch habe ich mit folgendem
> Beispiel schon Probleme:
> Das Flugzeug sei an Position (0/0/0) und soll ich Richtung
> (1/1/1) zeigen. Um das zu schaffen, muss ich folgende
> Drehungen machen:
> Um die Z-Achse um 45° und dann dass Flugzeug um 35°
> heben. Die beiden Winkel sollte ich eigentlich realtiv
> problemlos berechnen können, nur weiß ich nicht wie ich
> dann rotieren muss, damit das Flugzeug um 35° gehoben
> wird.
> (angenommen dabei natürlich immer, dass das Flugzeug in
> einer "vernünftigen" Ausgangslage ist)
Hallo,
ich denke, dass ich die Winkel richtig verstanden habe. Jetzt
sollte noch klar sein, wie das aktuelle Koordinatensystem
jeweils genau definiert ist. Ich vermute: die positive x-Achse
zeigt nach vorne (dahin wo der Pilot blickt, wenn er in
Start- bzw. Flugrichtung schaut), die positive y-Achse nach
links (linker Flügel), die positive z-Achse nach oben.
Dann käme zuerst die Drehung um 45° um die z-Achse,
welche die Flugrichtung in der horizontalen Ebene im Gegen-
Uhrzeigersinn dreht. Dann käme als zweites, in dem mit dem
Flugzeug mitgedrehten Koordinatensystem, die Drehung um
die Querachse (y-Achse), welche die Flugzeugspitze um ca.
35° nach oben heben soll. Bei den üblichen Konventionen
über die Drehsinne müsste dies eine Drehung um die
y-Achse um -35° sein. Zwar bin ich mir nicht sicher,
ob das bei deinem Programm wirklich genau so geht -
aber probier's halt einmal aus !
LG Al-Chw.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:34 Fr 23.09.2011 | Autor: | felixf |
Moin,
wie schon geschrieben, rotateX/Y/Z sind hier nicht die beste Wahl.
Am einfachten ist es, wenn du ein passendes Koordinatensystem bestimmst, also drei orthogonale normierte Vektoren, die sagen, in welche Richtung du schaust, wo oben ist, und wo rechts. Sozusagen das "Kamera-Koordinatensystem".
Den Vektor nach vorne hast du ja schon bestimmt; du musst ihn noch normieren. Nennen wir ihn $V$.
Jetzt brauchst du zwei dazu orthogonale Vektoren, die nach oben und nach vorne zeigen. Nehmen wir mal an, dass der Vektor [mm] $e_3 [/mm] = [mm] \vektor{ 0 \\ 0 \\ 1 }$ [/mm] "normalerweise" nach oben zeigt; dieser ist allerdings nicht orthogonal zu $V$ (ausser in Spezialfaellen).
Die Idee ist, mit dem Kreuzprodukt zu arbeiten und zuerst den Vektor $R$ zu finden, der nach Rechts geht: setze $R := V [mm] \times e_3$. [/mm] Dieser Vektor ist orthogonal zu $V$ und [mm] $e_3$. [/mm] Falls $V$ und [mm] $e_3$ [/mm] in die gleiche Richtung zeigen, ist er gleich 0; in dem Fall setze einfach $R := [mm] e_2 [/mm] = [mm] \vektor{ 0 \\ 1 \\ 0 }$ [/mm] oder irgend etwas anderes beliebiges. Als naechste normiere den Vektor $R$, da er normalerweise nicht Laenge 1 hat.
Jetzt hast du also zwei orthgonale normierte Vektoren $V$ und $R$. Um den Vektor $O$ zu bekommen, der nach oben zeigt, benutzt du einfach nochmal das Kreuzprodukt: $O = [mm] \pm [/mm] V [mm] \times [/mm] R$ (welches Vorzeichen das richtige ist musst du dir noch ueberlegen und haengt davon ab, ob du mit Linke-Hand-Systemen oder Rechte-Hand-Systemen arbeitest; einfach ein kleines Beispiel einsetzen, und du siehst welches Vorzeichen du nehmen musst). Um sicher zu gehen (Rundungsfehler) normierst du diesen Vektor auch noch mal.
LG Felix
|
|
|
|