Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 22:56

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Aug 25, 2010 06:01 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo mal wieder seit langem.

Zur Zeit versuche ich folgende Problemstellung zu lösen:

ich bekomme eine beliebige Matrix, die im nicht verdrehten Zustand wie folgt ausschaut:

Code:
1  0  0  0
0  1  0  0
0  0  1  0
0  0  0  1


im einfachsten um die xz ebene gespiegelten fall sieht die Matrix so aus:

Code:
1  0  0  0
0 -1  0  0
0  0  1  0
0  0  0  1


soweit die beiden einfachsten fälle...

dummerweise können die Bauteile um die es geht aber nicht nur gespiegelt sondern auch beliebig verdreht sein....

was dann zum beispiel mal so ausschaut:

Code:

 0.553603112697601   -0.445059716701508    0.70387876033783    0
 0.499999970197678    0.853553354740143    0.146446600556374   0
-0.665975630283356   0.270866066217422    0.695059776306152   0
 0                    0                    0                   1




stöbern in diesem Forum und im Internet hat mich zu http://web.archive.org/web/20041029003853/http:/www.j3d.org/matrix_faq/matrfaq_latest.html#Q31 und folgende gebracht - verstanden habe ich das gilt:
Code:
für rotation um X

 1       0            0         0
 0       cos(a)      -sin(a)    0
 0       sin(a)       cos(a)    0
 0       0            0         1


für rotation um Y

 cos(b)  0      sin(b)   0
 0       1      0        0
-sin(b) 0      cos(b)   0
 0       0      0        1

für rotation um Z

 cos(c)  -sin(c)   0   0
 sin(c)   cos(c)   0   0
 0        0        1   0
 0        0        0   1



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!

Gruß

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 25, 2010 09:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 25, 2010 11:24 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
danke für die Antwort, das hört sich sehr vielversprechend an! wäre toll wenn es so einfach ist....

kannst du mir die zeile

Zitat:
if ( dot( cross(spalte1,spalte3), spalte2) >= 0)


bitte erklären?

also wofür steht dot und cross?

wonach muß ich suchen?

danke!

gruß

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 25, 2010 11:45 
Offline
DGL Member
Benutzeravatar

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^^)

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 25, 2010 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
also wofür steht dot und cross?

Oh, sorry, also das sind Vektorprodukte.

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:
Code:
cross(A,B).x := A.y*B.z - A.z*B.y
cross(A,B).y := A.z*B.x - A.x*B.z
cross(A,B).z := A.x*B.y - A.y*B.x

Wichtige Eigenschaft:
Sofern A und B nicht linear abhängig (*) sind steht der resultierende Vektor immer im rechten Winkel zu A und 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.

Edit:
Ggf. hier hilfreich hab es aber nicht gelesen: Tutorial_Lineare_Algebra

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]