Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Ich las mir mal gerade das Mathe-Tutorial durch, in der Hoffnung vielleicht doch noch etwas brauchbares zu entdecken.
Und siehe da , wenn man nicht gleich nach dem ersten Blick aufhört zu lesen erfährt man wie OpenGL die Rotationen und Verschiebungen anstellt. Es erklärte auch woher der Name Matrix in OpenGL kommt, allerdings hätte ich gerne noch mehr Informationen zu dem Thema Matrizen gehabt.
So wird nur kurz auf den obrigen Kreis verwiesen um zu erkären was die Matrix mit einem Vertex macht.
Dabei war mir das nun überhaupt nicht klar wie er sich mal so eben aus dem oberen Kreis die Matrix Rechnung ableitet.
Ich habe danach mal versucht irgendwie auf diese Formel zu kommen.
Also nehme ich mal die Formel für X aus einer Matrix die nur die rotation um die X Achse beschreibt
Zitat:
X'= cos(alpha)*X - sin(alpha)*Y
Jetzt gehe ich mal davon aus das ich das mit dem Sinus und Cosinus nicht weis: Dass der neue X Wert vom alten X Wert und Y Wert abhängt ist klar.
Zitat:
X'= a*X+b*Y
Nun nehme ich mal an ich hätte den Punkt (3/0) und drehe ihn um den Ursprung, o dass ich den Y Wert nicht zu beachten brauche:
Zitat:
0°: X' = 3 = 1*X => bei 0° ist a1 90°:X'= 0= 0*X => bei 90° ist a 0 180°:X'= -3 = -1*X => bei 180° ist a -1 270°:X'= 0=0*X => bei 270° ist a 0
Und auch bei dem Punkt (-2/0) hat a für die gleichen Grad zahlen den gleichen Wert:
Zitat:
0°: X' = -2 = 1*X => bei 0° ist a1 90°:X'= 0= 0*X => bei 90° ist a 0 180°:X'= 2 = -1*X => bei 180° ist a -1 270°:X'= 0=0*X => bei 270° ist a 0
Vermutung: Nehme ich den Cosinus aus den Gradzahlen erhalte ich a:
Zitat:
1=cos(0°) 0=cos(90°) -1=cos(180°) 0=cos(270°)
Ok, jetzt das ganze noch mit den Punkt (0/-4):
Zitat:
0°: X' = 0 = 0*Y => bei 0°ist b=0 90°:X'= 4 = -1*Y => bei 90° ist b=-1 180°:X'= 0 = 0*Y => bei 180° ist b=0 270°:X'= -4 = 1*Y => bei 270° ist b=1
Zur Sicherheit noch mal mit dem Punkt(0/7)
Zitat:
0°: X' = 0 = 0*Y => bei 0°ist b=0 90°:X'= -7 = -1*Y => bei 90° ist b=-1 180°:X'= 0 = 0*Y => bei 180° ist b=0 270°:X'= 7 = 1*Y => bei 270° ist b=1
Vermutung: Nehme ich den negativen Sinuns aus den Gradzahlen erhalte ich b:
Wie leitet Delphic sich das alles so schnell und sicher her, und warum Spaltenweise wenn doch Zeilenweise gerechnet wird? Ausschnitt aus dem Tutorial:
Zitat:
Der X-Achsen Einheitsvektor(1.0, 0.0, 0.0) verändert sich hingegen schon. Mithilfe von Trigonometrie kommt man schnell auf der Lösung Spur. Ein Blick auf das Bild zum Einheitskreis zeigt schnell, dass wir gerade das gleiche Problem zu bewältigem haben: Die Rotationsachse ist in beiden Fällen die Z-Achse. Der Einheitsvektor, der gedreht wird, ist die X-Achse: x = cos(ß) y = sin(ß) womit wir den Inhalt der ersten Spalte der Matrix kennen: (cos(ß); sin(ß); 0; 0)
Das lässt sich jetzt genauso auf den Y-Achsen Einheitsvektor(0.0, 1.0, 0.0) übertragen, man muss nur bedenken in welcher weise sich x und y vertauschen: x = -sin(ß) y = cos(ß) So ergibt sich für die zweite Spalte: (-sin(ß); cos(ß); 0; 0)
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Wie leitet Delphic sich das alles so schnell und sicher her, und warum Spaltenweise wenn doch Zeilenweise gerechnet wird?
Es ist sehr einfach herzuleiten, wenn man anch DEM zentralen Satz in dem Tutorial sucht, der zentriert, fett und grösser als der Rest geschrieben steht:
Code:
Die Spalten
sind die Bilder
der Einheitsvektoren
Hat man das verstanden - z.b. indem man das Beispiel das dazugehört angeschaut und nachvollzogen hat, dann ist diese Ableitung ein Kinderspiel.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
So wichtig kam mir der Satz aber nicht vor(Ich dachte es wäre nur abschließender Spruch ).
Ich habe mir den Satz nochmal angeschaut und versucht zu verstehen was das für eine Bedeutung hat.
Nur damit ich es jetzt richtig verstanden habe, diese Einheitsvektoren sind nichts anders als die Achsen meines Koordinaten Systemes und haben daher in ihrem Urzustand nur einen 1er Wert. Eben diese Einheitsvektoren werden nun gedreht, und somit das gesamte Koordiaten System. Die gedrehten Einheitsvektoren brauch ich dann nur noch in ihre Spalte eintragen.
Was ist wenn die Einheits-Vektoren nicht senkrecht aufeinander stehen?
Kann man sich so ein System überhaupt noch vorstellen?
(Wie im Beispiel)
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Ein Einheitsvektor ist streng genommen irgendein Vektor der Länge 1 (oft auch als normiert bezeichnet). Häufig versteht man darunter aber die Vektoren, die genau 1 auf einer Komponente haben - in 3D also folgende: (1;0;0) (0;1;0) (0;0;1). Im Beispiel werden genau diese durch die Matrix gejagd: http://www.delphigl.com/res/tutorials/m ... ktoren.htm
Zitat:
Was ist wenn die Einheits-Vektoren nicht senkrecht aufeinander stehen? Kann man sich so ein System überhaupt noch vorstellen?
Wenn du damit die "Achsen" deines Koordinatensystem meinst - dann ist die Vorstellung rel. einfach. Stell dir einen Würfel vor. Halte die Bodenplatte feste und zieh den Deckel nach rechts - so ähnlich schaut dann dein System dann aus. Durch ein paar Rechnungen kann man dann zwischen solchen schiefen und dem üblichen orthonomalensystem hin und herrechnen. Grosse Freude in Schulaufgaben, in 3D Grafik kommts eher selten vor. Das rechnen mit kugelkoordinaten geht in die Richtung, ist allerdings noch eine Nummer komplizierter.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Zitat:
Ein Einheitsvektor ist streng genommen irgendein Vektor der Länge 1 (oft auch als normiert bezeichnet).
Ein Vektor mit X = 1 und Y = 2,wie in deinem Beispiel wäre also streng genomen kein Einheitsvektor (da er Länger als 1 ist)ist aber trotzdem eine Achse.
In prinzip ist die Matri-Art die du uns da vorgestellt hast nichts anders als eine Beschreibung eines Koordinaten Systemes. Die ersten 3 Spalten Beschreiben die Achsen mit Hilfe von Vektoren und die letzte 4 Spalte ist die Position.
Wobei das durchjagen eines Vektors durch die Matrix somit auch leichter vorstellbar ist.
Hätte ich den Punkt (2/0/0) und Jage ihn durch die Matrix so wird er von 2 addierten Vektoren der X Achse beschrieben plus dem Vertex der die Postion des Koordinaten System beschreibt.
Kommen nun noch Y und Z Werte hinzu so sind dies nur noch weitere Vektoren(basiern auf den jeweiligen Achsen-Vektoren) die hinzuaddiert werden müssen.
Schaut man sich mal das einfache 2D Koordiaten System an so ist dieses auch einfach nur aus jeweils 1 Vektor für X und Y Achse zusammengesetz.
Habe ich den Punkt (0,5/3) so habe ich 3 mal den Vektor der Y Achse und einen halben Vektor der X Achse zu addieren.
Eigentlich zimlich einfach wenn man mal weis was gemeint ist.
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Ein Vektor mit X = 1 und Y = 2,wie in deinem Beispiel wäre also streng genomen kein Einheitsvektor (da er Länger als 1 ist)ist aber trotzdem eine Achse.
Nein, das ist tatsächlich kein Einheitsvektor - das ist das Bild eines Einheitsvektors, nachdem er mit der Matrix multipliziert wurde, um zu zeigen was aus (1;0;0) wird, wenn man ihn durch die Matrix des Beispiels schickt.
IFlo hat geschrieben:
In prinzip ist die Matri-Art die du uns da vorgestellt hast nichts anders als eine Beschreibung eines Koordinaten Systemes. Die ersten 3 Spalten Beschreiben die Achsen mit Hilfe von Vektoren und die letzte 4 Spalte ist die Position.
Nun, das ist ja nicht irgendeeine Matrix, sondern so in der Art sehen halt die Matrizen aus, die in OpenGl zum Einsatz kommen. Sie beinhalten soz. die Regeln zum verschieben, skalieren, rotieren, etc. von Vektoren, wobei die letzte Spalte die Verschiebung angibt.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Zitat:
Nun, das ist ja nicht irgendeeine Matrix, sondern so in der Art sehen halt die Matrizen aus, die in OpenGl zum Einsatz kommen.
Trifft das auch auf die PROJEKTIONS_MATRIX zu?
Ich glaube ich habe nämlich mal diese Matrix mit gltranslate unf glrotate verändert. Hat aber keinen Unterschied zur MODELVIEW_MATRIX gemacht, außer das was ich in der PROJEKTIONS_MATRIX verändert hatte nicht mit dem glloadidenty Aufruf in der MODELVIEW_MATRIX zurückgesetzt wurde.
Wird das was ich mit gluperspektive setze auch in der PROJEKTIONS_MATRIX gespeichert?
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
wenn du gluPerspective verwendest, multipliziert gluPerspective deine damit gemachten Einstellungen mit der aktuell gewählten Matrix. Wenn du in die Projektionsmatrix die Identitätsmatrix mit glLoadIdentity setzt, dann in die Modelview Matrix wechselst und dort gluPerspective verwendest, hättest du denselben Effekt, aber es ist sinnvoll das nicht zu tun und eine Matrix für Projektionen und eine für Modelle getrennt zu haben.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich verweise hier mal auf die Linksektion. 8) Dort ist ein Link auf das Computergemotrie Script meines Mathe Dozenten (Dr. Pester).
In dem Script ist die (komplette) Mathematiktheorie erklärt die OpenGL zu grunde liegt. Da sind dann auch die diversen Drehungs-, Scalierungs-, Translations- und Schehrungsmatrizen drin. Und noch einiges mehr.
Wenn du dich für sowas interessierst, solltest du dier das mal durchlesen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
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.