Einzelnen Beitrag anzeigen

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, 02: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