PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL Matritzen


Timberton
2005-04-06, 11:46:18
hallo, ich versuche opengl zu lernen und habe schon viele tutorials gelesen, aber was wahrscheinlich ganz einfacher immernoch nicht verstanden. Was bedeuten die ProjectionMatrix, ModelViewMatrix, NormalMatrix. man sieht oft, dass diverse vekotren damit multipliziert werden, aber wieso, was man davon hat und wofür die stehen habe ich nicht verstanden. ich habe wohl soviel verstanden, dass man mit einer matrix mehrere transformationen (drehen, skalieren, verschieben) ausführen kann und dann nur diese matrix auf den punkt anwenden bzw. multiplizieren muß, aber wieso werden diese speziellen matritzen gebraucht?

Simon
2005-04-06, 13:56:11
Hi,

nimm dir mal das Red Book und lies dir das Kapitel über die Grafikpipeline durch. Da steht alles erklärt, wofür man die Matrizen braucht.

Kurz:
Modelview: Transformiert die Vertices vom Object Space in World Space
Projection: Transformiert vom World Space in Eye Space
Normal: Dürfte es nur in shadern geben. Ist zum Transformieren der Normalen vom Object Space in World Space. Ist gleich dem invers (transponierten?) der Modelview.

Trap
2005-04-06, 14:50:59
Motivation für Matrizen:
Jede lineare Transformation kann als Matrix dargestellt werden. Wenn man mehrere nacheinander ausführen möchte multiplizierte man die dazugehörigen Matrizen einfach.
Man kann also jede Reihenfolge von linearen Transformationen als 1 Matrix speichern und als 1 Matrix-Vektor-Multiplikation anwenden.

Lineare Transformationen sind z.B. Skalierung, Drehung, Verschiebung, Spiegelung

Hmm, den Teil hast du anscheinend schon etwa verstanden gehabt, ich schick es trotzdem mal ab...

Coda
2005-04-06, 16:10:04
Also auf der Grafikkarte landet eigentlich immer projection * modelview als matrix mit der transformiert wird.

Wieso man das ganze in zwei trennt? Weil man viele gleiche Objekte in einem lokalen Koordinatensystem speichert dass man dann zuerst verschieben muss damit das Ding an der richtigen Stelle und in der richtigen Lage ist. Dafür ist Modelview da.

Projection erzeugt die Perspektive (logisch...)

Simon
2005-04-06, 16:15:56
Also auf der Grafikkarte landet eigentlich immer projection * modelview als matrix mit der transformiert wird.
Nein, denn zum Normalen Transformieren kann man nicht die ModelView nehmen. Ich meinte oben, dass ich nur in GLSL Zugriff und Benutzung damit gesehen hab. Wird also sonst intern gemacht.

Coda
2005-04-06, 16:26:45
Nein, denn zum Normalen Transformieren kann man nicht die ModelView nehmen.Seit wann ist Normalen transformieren der generelle Fall? Ohne Vertexshader trifft das ja gar nie zu.

Gast
2005-04-06, 16:34:49
Nein, denn zum Normalen Transformieren kann man nicht die ModelView nehmen. Ich meinte oben, dass ich nur in GLSL Zugriff und Benutzung damit gesehen hab. Wird also sonst intern gemacht.

Naja, die Sache stellt sich glaube ich etwas anders da. Unter Standard OpenGL muss man mittels glEnable(GL_NORMALIZE) und glEnable(GL_RESCALE_NORMAL) dafür sorgen, dass die Normalen wieder richtig "hingebogen" werden, automatisch läuft da intern gar nichts. Unter GLSL hast Du recht, da kann man die 3x3 Matrix gl_NormalMatrix dafür verwenden. Ich glaube aber, bin mir jedoch nicht sicher, dass man dann, falls in der ursprünglichen ModelViewMatrix auch eine Skalierung enthalten war, die resultierende Normale unter GLSL noch mit gl_NormalScale verrechnen muss. Falls nicht, weiß vielleicht jemand, wofür gl_NormalScale sonst da ist?

Ich persönlich mache es eh einfach so, dass ich an den GLSL-Shader noch eine 3x3 Matrix für die Normalen übergebe, die nur die relevanten Rotationen enthält, da spart man sich die Sache mit der inverstransponierten Matrix und der Rückrechnung.

Gruss, Carsten.

Asmodeus
2005-04-06, 16:35:28
Anmeldung vergessen.

Gruss, Carsten.

timberton
2005-04-12, 13:27:46
Vielen Dank, muß ich mir das dann so vorstellen, dass ich z.B. ein Schiff mit lokalem Kooridnatensystem habe, wo der Mast dann z.B. (0,10,5) vom Mittelpunkt (0,0,0) des Schiffes entfernt ist. Der Mast bzw. die vertices sind dann im Object Space? Und wenn ich das jetzt mit der ModelView Matrix multipliziere, habe ich die Kooridnaten des vertex in der Welt zu einem absoluten Ursprung (0,0,0) - WorldSpace (je nach dem wo das Schiff stand)? Und Projection/Eye Space bezieht sich auf die Kamera als Ursprung - dh. die Sachen werden so transformiert, dass die Kamera der 0-Punkt ist? Also wenn ich meinen Mast-vertex noch mit der Projection Matrix multiplizieren würde, dann wüßte ich wo von der Kamera aus gesehen der Punkt ist bzw. wie weit er z.B. weg ist? Habe ich das jetzt richtig verstanden *hoff* :)

muhkuh_rs
2005-04-12, 18:37:01
Vielen Dank, muß ich mir das dann so vorstellen, dass ich z.B. ein Schiff mit lokalem Kooridnatensystem habe, wo der Mast dann z.B. (0,10,5) vom Mittelpunkt (0,0,0) des Schiffes entfernt ist. Der Mast bzw. die vertices sind dann im Object Space? Und wenn ich das jetzt mit der ModelView Matrix multipliziere, habe ich die Kooridnaten des vertex in der Welt zu einem absoluten Ursprung (0,0,0) - WorldSpace (je nach dem wo das Schiff stand)? Und Projection/Eye Space bezieht sich auf die Kamera als Ursprung - dh. die Sachen werden so transformiert, dass die Kamera der 0-Punkt ist? Also wenn ich meinen Mast-vertex noch mit der Projection Matrix multiplizieren würde, dann wüßte ich wo von der Kamera aus gesehen der Punkt ist bzw. wie weit er z.B. weg ist? Habe ich das jetzt richtig verstanden *hoff* :)
Nur der letzte Teil stimmt noch nicht so ganz. Nach der Perspective Matrix bekommt man ein Vertex (x,y,z,w) raus. Wenn man eine Parallelprojektion hat, dann hat man wirklich schon x,y auf der Bildebene und z als Tiefe. Bei einer perspektivischen Projektion allerdings ist dann w nicht gleich 1. Die Koordinaten auf der Ebene ergeben sich erst durch x/w, y/w, z/w. Das macht allerdings i.d.R. die Hardware selbst, zwischen Vertex- und Pixelshader, so dass man sich meist keine Gedanken darüber machen muss.