[OpenGL]-Rotation einer Matrix
-
Hallo,
es geht um die Rotation eines beliebigen Objektes mit einer Matrix. Es geht um:X - Axis: |1 0 0 0| |0 cos sin 0| |0 -sin cos 0| |0 0 0 1| Y - Axis: |cos 0 -sin 0| |0 1 0 0| |sin 0 cos 0| |0 0 0 1| Z - Axis: |cos sin 0 0| |-sin cos 0 0| |0 0 1 0| |0 0 0 1|
Da wir die Standard-Trigonometrie noch nicht in der Schule hatten, fällt es mir etwas schwer, die Formeln für mein eigensangeeignetes Wissen über Kosinus/Sinus herzuleiten. Nun, angenommen ich möchte die X-Achse rotieren, warum reicht da nicht eine einfache Winkelangabe? Und warum gibt es 2 mal Sinus und 2 mal Kosinus Werte für die Rotation? Ich habe mich bereits mit Kreisausschnitten vertraut gemacht, kann diese beiden Themengebiete aber nur bedingt verbinden und somit fehlt mir ein gewisses Grundverständnis. Ich wäre selbst über ein paar nützliche Links froh, wo das ganze mal auf einer verständlichen Ebene erklärt wird.
Ich danke im Voraus!
-
Eine 3D-Matrix enthaelt drei Vektoren die die Koordinatenachsen des neuen Koordinatensystems angeben.
Eine 3D-Rotation um eine kartesische Achse ist dabei einfach nur eine erweiterte 2D-Matrix bei der jeweils eine Koordinate erhalten bleibt.
Bei einer Rotation um die X-Achse bewegen sich also y und z auf einem Kreis um den Rotationsmittelpunkt.
Die beiden relevanten Basisvektoren der Matrix zeigen also auf den Einheitskreis an dem ja Sinus und Cosinus definiert sind. Dabei stehen beide Basisvektoren senkrecht aufeinander. Eine Senkrechte zu einem gegebenen 2D-Vektor (x,y) erhaelt man indem man beide Koordinaten vertauscht und eine negiert, also zb (y,-x) - und genau das findest Du auch in der Matrix.
-
Ok, klingt logisch. Was meinst du mit "Basisvektoren"?
-
Kóyaánasqatsi schrieb:
Ok, klingt logisch. Was meinst du mit "Basisvektoren"?
Für jemanden der noch nicht mal "Standard-Trigonometrie" (10. Klasse) in der Schule hatte ist das zu kompliziert...
Basisverktoren sind etwas relativ abstraktes mit dem die Professoren Studienanfänger rumquälen. Ich könnte zwar versuchen das jetzt anschaulich zu erklären, aber dann würdest du dir vermutlich etwas Falsches darunter vorstellen. Ist aber nicht schlimm, für die Rotation muss man nicht wissen was ein Basisvektor ist. Und ausserdem ist der ganze Satz von hellihjb mit den Basisverktoren Unsinn.
-
ausserdem ist der ganze Satz von hellihjb mit den Basisverktoren Unsinn.
Dann korrigiere mich doch bitte.
-
Ok, vielleicht war das unglücklich formuliert. Ich weiß zwar was Vektoren sind, allerdings konnte ich mir nicht vorstellen, was helli in dem Zusammenhang damit meinte.
Danke soweit schon mal!
-
-
Also meinst du mit den beiden "Basisvektoren" (3. letzter Satz) die Y- und Z-Achsen der Matrix?
-
Genau, die "X-Achse" enthaelt ja lediglich (1,0,0), laesst also die X-Koordinate gleich. Die anderen beiden ("relevanten") Vektoren kannst Du anhand des Winkels dem Einheitskreis entnehmen.
Die Laenge dieser Vektoren sollte dabei 1 sein (darum Einheitskreis) sonst skalierst Du naemlich auch.Es gibt natuerlich weitere (und eventuell leichter verstaendliche) Wege einen Vektor zu rotieren, die aber wegen Anwendung trigonometrischer Funktionen viel aufwaendiger sind als mit einer Matrix zu multiplizieren die ja fuer alle zu transformierenden Vektoren konstant bleibt.
-
Ganz ohne Trigonometrie ist Doof.
Ein Ansatzpunkt ist zum Beispiel diese Wikipedia Seite:
http://de.wikipedia.org/wiki/RotationsmatrixAber die Herleitung wirst du wahrscheinlich ohne weiteres nicht so recht verstehen können :).
Vielleicht als Versuch einer Erklärung:
Stell dir mal vereinfacht vor, du hast einen Vektor der Länge 1. Das kann ein beliebiger Vektor sein, am Besten für die Vorstellung sind aber (1 0) und (0 1). Diese beiden Vektoren liegen auf dem Einheitskreis(denn auch der hat den Radius 1).
Nun schaust du dir die Grafik rechts auf der Seite an: http://de.wikipedia.org/wiki/Einheitskreis
In der Grafik siehst du, wie sich ein Zeiger (ein Vektor!) um den Einheitskreis, bzw einen Ausschnitt davon mit steigendem Winkel dreht. An der X-Achse ist cosinus aufgetragen, an der y-Achse der Sinus. Also hat ein Vektor im Einheitskreis mit dem Winkel a die Koordinaten: (cos(a) sin(a) )
Das heißt, für deinen Vorhin vorgestellten Vektor kannst du dir einen bestimmten Winkel überlegen, bei dem sinus/cosinus exakt den richtigen Wert haben. Nennen wir ihn b. Wenn du den dann um 20 Grad rotieren willst, berechnest du also (cos(b+20) sin(b+20)).
Nun ist es doof, für jeden Vektor erst den Winkel ausrechnen zu müssen, dann den Winkel zu verändern und das Ergebnis wieder zu einem Vektor zu machen.
Deswegen wird das Additionstheorem verwendet, und damit lässt sich der Vektor so darstellen:
$ \cos(b+20)=\cos(b) \cdot \cos(20)-sin(b) \cdot \sin(20)\\ \sin(b+20)=\sin(b) \cdot \cos(20)+sin(b) \cdot \sin(20) $Wie genau man daran kommt ist jetzt vielleicht etwas viel ;). sin(b)/cos(b) sind jetzt einfach unsere ursprünglichen Koordinaten des Vektors, also haben wir uns schon etwas rechnerei gespart:
$ \cos(b+20)=x \cdot \cos(20)-y \cdot \sin(20)\\ \sin(b+20)=y \cdot \cos(20)+x \cdot \sin(20) $jetzt noch die zweite Gleichung umsortieren und das Ergebnis etwas verschönern:
$ x'=x \cdot \cos(20)-y \cdot \sin(20)\\ y'=x \cdot \sin(20)+y \cdot \cos(20) $Und nun ist eine Matrix nichts anderes als eine andere Darstellung eines solchen Gleichungssystems:
$ \begin{bmatrix} x'\\ y' \end{bmatrix}=\begin{bmatrix} \cos(20) & -sin(20)\\ sin(20) &\cos(20) \end{bmatrix} \cdot \begin{bmatrix} x\\ y \end{bmatrix} $Fertig!
das Ganze gilt jetzt genau so für 3D - nur dass alles etwas komplizierter ist. Das ginge am Einfachsten, wenn du etwas mehr Wissen von linearer Algebra hättest. Der einfachste Fall wurde ja bereits angesprochen. An die anderen Fälle solltest du kommen, wenn du die Koordinaten deines 3D vektors erstmal so tauscht, dass oben die beiden sind um die du drehen willst, dann wendest du die rotation an und tauscht dann die Koordinaten wieder zurück. Die drehung um eine beliebige Achse ist damit aber nicht mehr gut erklärbar
-
Ich danke euch von Herzen, ich werde mir das mal heute in Ruhe durch den Kopf gehen lassen.
-
otze hat es ja sehr schön erklärt - gleich erklären nochmal von mir ;):
http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/MatrizenfuerDummies.pdf