Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rotation anhand eines Vektors (https://www.delphipraxis.net/142528-rotation-anhand-eines-vektors.html)

Weazy 29. Okt 2009 22:31


Rotation anhand eines Vektors
 
Hallo, wie es scheint brauche ich wohl etwas Nachhilfe in Vektor Geometrie: Ich habe einen 3D Vektor und möchte nun die Rotation dieses Vektors erhalten. Also angenommen ich habe ein Objekt im 3D Raum das ich um die x,y, und z achse rotieren kann. Dieses Objekt hat einen richtungsvektor der angibt wo oben ist, also 0,1,0. Nun habe ich einen beliebigen vektor und möchte das Objekt so rotieren, dass es in die Richtung dieses Vektors zeigt. Kann mir da jemand helfen?

alleinherrscher 30. Okt 2009 01:02

Re: Rotation anhand eines Vektors
 
Hey, und guten Abend.

Also wenn ich das richtig verstanden habe, möchtest du folgendes machen:

Ein Objekt (also Quasi eine ansammlung an Punkte bzw Ortsvektoren) drehen, und zwar so, dass dein (von dir sog.) Richtungsvektor (ein Richtungsvektor ist ja in der Mathematik was anderes) auf einen bel. anderen Vektor gedreht wird.

Was du brauchst ist eine Drehmatrix:

Wenn du bei Wikipedia guckst, findest du 3 Drehmatrizen, jeweils eine für x,y und z Achse.

z.B. x-Achse:
http://upload.wikimedia.org/math/2/d...693944d0dd.png

Einen Vektor bzw. Punkt deines Objektes kannst du nun um einen Winkel alpha um die x-Achse (oder y,z-Achse) drehen, indem du den A*v rechnest, wobei A deine Drehmatrix für eine Drehung um die x Achse ist und v dein Vektor sein soll.

Das Problem ist jetzt, dass du aber die Winkel alpha nicht weißt, um die du dein Objekt auf jeder Achse drehen musst, damit du deinen "Richtungsvektor" auf den beliebigen anderen Vektor verschiebst.

[edit: im weiteren Text war ein Denkfehler, ich schreibe morgen nochwas dazu :) ]

Wenn du noch Fragen hast: Immer raus damit ;)

s.h.a.r.k 30. Okt 2009 02:26

Re: Rotation anhand eines Vektors
 
So, nun mag ich auch ein wenig Wissen dazu beitragen ;) Habe diesen Thread hier gelesen und das Thema hat mich einfach nicht in Ruhe gelassen, bis mir nun endlich die Idee gekommen ist, wie man an den Winkel kommt.

Zunächst muss ich zugeben, dass ich keine Lösung für ein x-beliebiges Dreieck kenne. Habe ein wenig danach gegoogelt und habe nichts gefunden. Nun ja, dann muss man sich halt etwas überlegen. Nun ist es ja so, dass man die folgende (vereinfachte) Skizze hat (bei b fehlt leider ein Pfeil ;) ):

Code:
// a: Vektor, b: Vektor, E: Ebene in Normalenform

     a      |
  ---------->|
  \          |
   \ b      | Ebene E
    \        |
             |
a: Vektor, der die Ausrichtung des Objekts darlegt
b: neue Ausrichtung
E: Hilfsebene, um den Winkel zwischen a und b zu ermitteln

Nun kurz zu meiner Idee, wie ich auf den Winkel zwischen a und b kommt. Und zwar fordere ich, dass bei a ein rechter Winkel anliegt, also zwischen a und der c, wobei c die Verbindung zwischen a und b ist, d.h. die dritte Seite im Dreieck. Dies kann ich ja wie folgt definieren: a + c - μ*b = 0. Nun sind aber c und μ unbekannt und lassen sich nicht einfach so eliminieren. An dieser Stelle eilt mir dann die Hilfsebene E zur Hilfe :mrgreen:

Nun kann man sich ja die Hilfsebene über die Normalenform konstruieren, wobei der Normalenvektor -a ist. Und mit Hilfe von b definiere ich eine Gerade. Der Aufpunkt sollte klar sein, d.h. dem "Ursprung" des Objekts. Nun kann ich mir den Schnittpunkt von Ebene und Gerade berechnen, wobei man hier vorsichtig sein muss, denn wenn das μ negativ ist, so ist der Winkel später um 90 Grad größer, da der Winkel zwischen a und b ja größer als 90 Grad sein muss. Hat man jedenfalls dieses μ, so kann man sich wieder auf diese Gleichung konzentrieren: a + c - μ*b = 0. Dann einfach mal schnell c ausrechnen, die Längen der Vektore berechnen und ein wenig Pytagoras/Sinus/Cosinus und fertig ist die Lösung :zwinker:

Ich wüsst auf Anhieb nicht, wie ich es einfacher Lösen sollte. Im zweidimensionalen würe ich an dieser Stelle wohl auch mit einer Hilfsgeraden argumentieren.

Medium 30. Okt 2009 07:17

Re: Rotation anhand eines Vektors
 
Ein einziger Zielvektor reicht nicht aus, du brauchst noch einen "Right"-Vektor um eine Drehmatrix zum neuen Bezugssystem erstellen zu können, idealerweise auch noch einen "Ahead"-Vektor, der sich im Zweifel aber aus Up und Right bilden ließe (Kreuzprodukt). Dann wäre noch die Wikipedia wieder recht interessant :)

alleinherrscher 30. Okt 2009 08:58

Re: Rotation anhand eines Vektors
 
So hier nun die endgültige und meiner Meinung nach einfachste Lösung für dein Problem:

Wir brauchen einen Vektor, der unsere Drehachse bildet, da wir ja nicht unbedingt die Einheitsvektoren x,y,z zum Drehen benutzen wollen.

Dieser Vektor muss senkrecht auf "Richtungsvektor" und dem "Zielvektor", auf den der "Richtungsvektor" gedreht werden soll, stehen. Wie schon gesagt, erhälst du diesen Drehvektor, wenn du das Kreuzprodukt zwischen "Richtungsvektor" und "Zielvektor" bildest, und sicherheitshalber, noch normierst:

http://upload.wikimedia.org/math/c/e...d308010e54.png

Code:
Normierung eines Vektors (Länge des Vektors auf 1 setzen): x' = x / |x|
Dieser Vektor ist nun also deine Drehachse und kann in die Drehmatrix für die Drehung um eine beliebige Achse eingesetzt werden:

http://upload.wikimedia.org/math/e/d...4f396333ac.png

Den Winkel alpha erhälst du in diesem Fall direkt aus dem Skalarprodukt zwischen "Richtungsvektor" und "Zielvektor":

http://upload.wikimedia.org/math/b/d...11b61e2743.png

Anschließend können alle Ortsvektoren deines "Objektes" mit der fertigen Drehmatrix multipliziert werden und du müsstest dann das gedrehte Objekt erhalten :)

Medium 30. Okt 2009 11:55

Re: Rotation anhand eines Vektors
 
Stimmt, man kann den Orthogonalen zwischen "altem" und neuen Up-Vektor als weiteren nehmen, allerdings ist dann eine Annahme über die Drehung vorgenommen worden, da sie an und für sich nicht vollständig bestimmt ist. Du willst ja nicht nur den Vektor drehen, sondern ein gesamtes Bezugssystem, und das braucht mehr als nur eine Richtung in 3D. Bildlich gesprochen würdest du z.B. einen Würfel kippen, könntest diesen ja aber noch frei um den neuen Up-Vektor drehen ohne die Drehung des Up-Vektors selbst zu verletzen. Die oben getroffene Annahme dürfte zu einem intuitiv "gutem" Verhalten führen, ist aber möglicherweise garnicht was du erreichen möchtest. Das hängt dann davon ab was du letztlich genau machen willst.

Khabarakh 30. Okt 2009 12:06

Re: Rotation anhand eines Vektors
 
@alleinherrscher: Wenn du um diesen Winkel drehst, veränderst du leider auch den Up-Vektor - das Objekt "kippt" (Roll) relativ zur Horizontalen, was sehr wahrscheinlich unerwünscht sein dürfte. Um das zu verhindern, müsstest du um Azimuth- und Polarwinkel drehen[*]. Aber da scheint mir Mediums allgemeine Lösung angebrachter, sehr interessant :D .
[*]Euler sagt uns, dass es eine Achse geben muss, mit der wir es in einer Drehung schaffen, aber es ist im Allgemeinen eben nicht einfach das Kreuzprodukt ;) .

[edit]Tja, schneller schreiben/denken müsste man können :P ...[/edit]

alleinherrscher 30. Okt 2009 12:14

Re: Rotation anhand eines Vektors
 
Zitat:

Zitat von Medium
Stimmt, man kann den Orthogonalen zwischen "altem" und neuen Up-Vektor als weiteren nehmen, allerdings ist dann eine Annahme über die Drehung vorgenommen worden, da sie an und für sich nicht vollständig bestimmt ist. Du willst ja nicht nur den Vektor drehen, sondern ein gesamtes Bezugssystem, und das braucht mehr als nur eine Richtung in 3D. Bildlich gesprochen würdest du z.B. einen Würfel kippen, könntest diesen ja aber noch frei um den neuen Up-Vektor drehen ohne die Drehung des Up-Vektors selbst zu verletzen. Die oben getroffene Annahme dürfte zu einem intuitiv "gutem" Verhalten führen, ist aber möglicherweise garnicht was du erreichen möchtest. Das hängt dann davon ab was du letztlich genau machen willst.


Stimmt, da hast du recht, du könntest dich noch um deinen Up-Vektor drehen, d.h. einen Freiheitsgrad hast du noch. Aber meine Drehung würde die Rotation um den Up-Vektor invariant lassen - soll heißen: Wenn unbedingt nötig, könnte man anschließend noch eine Drehmatrix mit dem Up-Vektor als Drehachse erstellen und so dann auch das objekt "um sich selbst" drehen.

//edit:

Zitat:

Zitat von Khabarakh
@alleinherrscher: Wenn du um diesen Winkel drehst, veränderst du leider auch den Up-Vektor - das Objekt "kippt" (Roll) relativ zur Horizontalen, was sehr wahrscheinlich unerwünscht sein dürfte.

Wenn du mit der Horizontalen die x-y Ebene meinst kippt das Objekt natürlich gegenüber der Horizontalen, aber genau dass will man doch, wenn ich diesen Satz hier richtig interpretiere - er will doch, dass nach der Drehung der Up Vektor des Objektes in die selbe Richtung zeigt, wie ein zweiter, beliebig vorgegebener Vektor:

Zitat:

Dieses Objekt hat einen richtungsvektor der angibt wo oben ist, also 0,1,0. Nun habe ich einen beliebigen vektor und möchte das Objekt so rotieren, dass es in die Richtung dieses Vektors zeigt.

alleinherrscher 30. Okt 2009 12:30

Re: Rotation anhand eines Vektors
 
//edit: Ups, das sollte kein neuer Post sein, sondern ein Edit meines vorherigen Posts, habe mich verklickt...sorry!!!

Ach und: Ich glaube nicht, dass dir die Transformation in Kugelkoordinaten was bringt ;)

However, vielleicht muss der Themensteller sein Problem etwas genauer formulieren, denn ich glaube Khabarakh hat und ich haben zwei unterschiedliche Vorstellungen, von dem, was zu tun ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz