[OpenGL]-Rotation einer 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/Rotationsmatrix

    Aber 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


Anmelden zum Antworten