AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rotation anhand eines Vektors

Ein Thema von Weazy · begonnen am 29. Okt 2009 · letzter Beitrag vom 30. Okt 2009
Antwort Antwort
Benutzerbild von Weazy
Weazy

Registriert seit: 7. Apr 2005
Ort: Bern (Schweiz)
414 Beiträge
 
Delphi 2007 Enterprise
 
#1

Rotation anhand eines Vektors

  Alt 29. Okt 2009, 23:31
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?
Philippe Wechsler
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 02:02
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
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 03:26
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

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

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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 08:17
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 09:58
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
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 12:55
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 13:06
@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 .
[*]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 ...[/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 13:14
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 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.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Rotation anhand eines Vektors

  Alt 30. Okt 2009, 13:30
//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...
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 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