ich habe einen Richtungsvektor und bräuchte eine Matrix, mit der ich einen anderen Vektor (0/0/1) auf diesen Rotieren kann (über die X und Y achse).
Bzw.. sagen wir, ich habe eine IdentitätsMatrix "m" und rotiere diese nun auf X um 30° und Y um 20°, á la:
Code:
glRotate(30, 1, 0 ,0);
glRotate(20, 0, 1, 0);
// m = modelViewMatrix
Jetzt habe ich einen Vektor "v" den ich mit der Matrix multipliziere:
Code:
v' = m * v;
Genau das ganze brauche ich jetzt nur andersrum... also ich habe v' und brauche die matrix m. Da es ja im prinzip unendlich viele möglichkeiten gibt um von v auf v' zu rotieren, beschränke ich das ganze auf die rotation um X und Y - auch in dieser reihenfolge.. also erst X, dann Y. Das beschränkt das ganze auf eine, bzw zwei möglichkeiten (man könnte um 30° drehen, oder um -330°..).
Neben deinem v' brauchst du nur einen weiteren Vektor damit das Ergebnis eindeutig ist. Beispielsweise einen Vektor der angibt wo oben ist, z.B. up=(0,1,0). Eine derartige (ggf. implizite) Annahme wirst du in jedem Fall benötigen, egal mit welcher Methode du diese Matrix berechnest.
Zuerst v' normalisieren. Mit Hilfe des Kreuzproduktes von v' und up erhältst du deinen Side-Vektor der orthogonal zu beiden ist. Den side-Vektor normalisieren. Nochmal Kreuzprodukt von v' und side um ein up' zu erhalten und du hast drei zueinander orthogonale Vektoren die alle die Länge 1 haben.
Diese stopfst du in die Matrix: X = side Y = up' Z = v' Position: (0,0,0)
(Möglicherweise musst du die Vektoren side und/oder up' negieren (= das Kreuzprodukt umdrehen), wenn irgendwas unabsichtlich gespiegelt ist....man kann da 30min drüber nachdenken wie es richtig ist oder einfach ausprobieren)
ich hab mal ne grafik gemacht um zu verdeutlichen was ich brauche:
Unten links ist mein ausgangs vektor, den ich jetzt auf den nächsten vektor ausrichten möchte - der UpVector (Im Bild grün) muß sich dementsprechend mit drehen.
Da es in 3D eben im grunde undendlich viele möglichkeiten gibt auf einen vektor hin zu rotieren muß man eben wie z.B. bei gluLookAt einen UpVektor angeben, allerdings soll der sich bei mir eben mit rotieren (ebenfalls der Side-Vektor).
Damit das überhaupt geht, muß man die Achsen um die rotiert werden darf beschränken - deswegen sage ich "Ich will von A nach B kommen indem ich zuerst um X und dann um Y rotiere - immer mit dem kleinsten winkel". Dadurch bleibt nur noch eine einzige möglichkeit übrig.. und die brauch ich
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
dürfte eigentlich garnicht so schwer sein. Wenn du den Vektor v1 auf v2 drehen willst, berechnest du für v1 und v2 die Winkel der Kugelkoordinaten und nimmst jeweils die kürzere Winkeldifferenz, sagen wir mal alpha und beta. ( so daß alpha und beta zwischen 0 und 180° liegen ) Wenn v1 bei dir (0/0/1) ist, dürfst sich die Berechnung noch etwas vereinfachen...
Die zugehörige Matrix ergibt sich dann aus :
Code:
glRotate(beta, 1, 0 ,0);
glRotate(alpha, 0, 1, 0);
Viele Grüße dj3hut1
_________________ Wenn Gauß heute lebte, wäre er ein Hacker. Peter Sarnak, Professor an der Princeton University
Also ich wäre mir da nicht so sicher, dass das mit der XY-Rotation eindeutig ist.
Ich habe mal Maxima an das Problem ran gelassen und dieses findet keine Lösung. Allerdings bin ich mit Maxima nicht sonderlich vertraut, aber üblicherweise kriegen Algebrasysteme sowas hin. Siehe Anhang.
Meine Lösung (sieh mein Post oben) liefert genau das, was du willst und das auch noch ohne komplexe Berechnungen und den Umweg über irgendwelche Winkel. Der benötigte Up-Vektor up' wird immer schön berechnet. Allerdings funktioniert das nicht, wenn dein Richtungsvektor fast genau gleich dem definierten Up-Vektor ist. => Solange dein Objekt keine Loopings fliegt, kein Problem.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.