also soweit mein wackliges Verständnis der Materie.
Mein Ansatz war nun der folgende:
nacheinander um die Achsen solange drehen bis wieder die Form
Code:
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
vorliegt...
Nun zur Einsteiger Frage:
wie rotiere ich korrekt um x? es gibt ja sowas wie
Code:
glRotatef(pa,pb,pc,pd);
was ich aber machen will ist: eine gegebene matrix um einen kleinen x winkel drehen und mir danach das ergebnis anschauen... dabei will ich eigentlich opengl nichtmal gestartet haben sondern wirklich nur rechnen.
wenn mir jemand mit der rotation einer matrix helfen kann oder aber eine eventuell eleganterer lösung für mein eingangs beschriebenes Problem kennt, wäre ich wie immer sehr dankbar!
oder aber eine eventuell eleganterer lösung für mein eingangs beschriebenes Problem
Eine Matrix ist nichts anderes als eine Menge von Basisvektoren. Wir betrachten jetzt mal nur den oberen linken 3x3-Teil. Die erste Spalte ist der Punkt auf den (1,0,0) abgebildet wird. Die zweite Spalte gehört zu (0,1,0) und die dritte zu (0,0,1). Sie bilden das neue Koordinatensystem und werden daher auch Basisvektoren genannt. Wenn du dir nun also anschaust wie die drei Basisvektoren zueinander stehen kannst du leicht ablesen ob gespiegelt wurde oder nicht:
Code:
if ( dot( cross(spalte1,spalte3), spalte2) >= 0) { // Fall 1 } else { // Fall 2 }
Entweder Fall 1 oder Fall 2 ist nun der gespiegelte Fall, einfach ausprobieren.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
cross ist das Kreuzprodukt zweier vektoren. Das Ergebnis ist ein Vektor, der senkrecht auf den beiden Vektoren steht, oder auch der Flächeninhalt des Parallelogramms, das von den beiden Vektoren aufgespannt wird, wenn man den Betrag davon nimmt.
dot steht für Punktprodukt oder auch Skalarprodukt genannt. Es werden die Komponenten eines Vektors jeweils mit einander multiplizeirt und anschließend auf summiert. Hat auch noch viele andere Eigenschaften, deshalb am besten bei wikipedia oder so nachschlagen.
Ich benutze das Punktprodukt am häufigsten um Dinge zu projezieren, aber man kann damit auch prüfen, ob sich Punkt vor oder hinter einer Ebene befinden (wäre dein anwendungsfall). Eine Ebene wird nähmlich durch ihre Normale definiert, die wieder rum aus dem Kreuzprodukt berechnet wird. (was für ein Zufall, dass die beiden Funktionen auch so in der Formel stehen^^)
Dot-Produkt (häufig auch als Skalar- oder Punktprodukt bezeichnet) Gegeben: zwei 3D-Vektoren A und B.
Code:
dot(A,B) := A.x*B.x + A.y*B.y + A.z*B.z;
Wichtige Eigenschaft: dot(A,B) = length(A) * length(B) * cos(alpha) wobei alpha der Winkel zwischen den beiden Vektoren ist. Das bedeutet z.B., dass das dot-Produkt den Wert 0 hat wenn zwei Vektoren im rechten Winkel zu einander stehen. Außerdem ist es größer Null, wenn die Vektoren ungefähr in die gleiche Richtung zeigen (Winkel kleiner 90 Grad) bzw. kleiner Null, wenn sie in entgegengesetzte Richtung zeigen. Diese Eigenschaft nutzen wir hier.
Cross-Produkt (zu deutsch: Kreuzprodukt) Gegeben: zwei 3D-Vektoren A und B. Hier ist das Ergebnis keine Zahl sondern wieder ein 3D-Vektor:
Wichtige Eigenschaft: Sofern A und B nicht linear abhängig (*) sind steht der resultierende Vektor immer im rechten Winkel zu Aund zu B. In unserem Beispiel berechnen wir cross(spalte1, spalte3). Die Basisvektoren stehen im rechten Winkel zu einander, daher erhalten wir entweder spalte2 oder -spalte2 als Ergebnis. (Wenn die Matrix eine Skalierung enthält erhalten wir nicht spalte2 sondern irgendein vielfaches davon, also c*spalte2 für irgendein c.)
(*) D.h. Wir können A nicht durch c*B mit irgendeiner ggf. auch negativen Konstante c ausdrücken.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.