Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Hallo zusammen,
meine Frage betrifft diesmal eher guten OpenGL Stil. Ich habe mir eine 3D-Scene aufgebaut, und möchte mich gerne da drin bewegen. Könnte man also mit gltranslate, glrotate oder gar gluLookAt machen. Aber welche Matrix sollte dabei aktiv sein. Als erstes habe ich meine Welt in der ModelView Matrix aufgebaut, dann habe ich zum Schluß in die Projektionsmatrix gewechselt und mich darin bewegt. Diese Variante empfinde ich als sauber und übersichtlich getrennt.
Es geht aber auch anders, indem ich den Ausgangspunkt meiner Welt erst mal weit weg schiebe und dann zeichne. Ich selbst (oder meine Kamera) befindet sich aber immer noch im Koordinatenursprung der Weltmatrix.
Wo finden also jetzt Viewpoint-Transformationen statt? Was ist denn richtiger, oder was ist eher zu empfehlen bzw. trifft die Konvention?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde das in der Projektionsmatrix erledigen. Dann hast du den Vorteil, die Kameratransformationen und die Modeltransformationen getrennt zu haben, sodass du in Shadern beispielsweise die Modeltransformationen rückgängig machen kannst.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Ah ja, danke. Von Shadern bin ich zwar noch weiit, weiiit entfernt, aber mit der getrennten Betrachtung bzw. Behandlung von Szene und Kamerafahrten kann ich mich leichter anfreunden. Wenn beides erlaubt ist bleib ich bei der Projektionsmatrix.
Eigendlich ist es kein sauberer Stil, die Projektions matrix zum bewegen der kamera zu verwenden. Wenn man die Cam, als gewöhnliches objekt betrachtet. welches man mit translate und rotate bewegen kann. setzt sich die gl_ModelViewMatrix so zusammen:
CamMatrixInverse * ModelMatrix * ProjectionMatrix
Der Grund warum die ModelView und Projection matrizen in OpenGL getrennt sind ist, dass die ModelMatrix durch glRotate glTranslate u.Ä. verändert werden kann. Die multiplikation mit der projection matrix erfolgt erst unmitelbar vor der benutzung.
Die Camera matrix nun mit der projektion matrix zu implementieren geht nur in wenigen ausname fällen, da die reihen folge der matrizen nicht geändert werden kann. (Möglich sind z.B. 90 grad rotierte kamera ansichten zum erzeugen von Cubemaps in einem geometry shader)
Zurück zum altem GL... Da es keine getrennte cam und model matrix gibt, muss man die CamMatrix als erstes setzten. Wenn man nicht weiß wie man die inverse eine Matrix berechnet, kann man sich einfach damit behelfen, dann man die Welt und nicht sich selbst bewegt.
Grundsätzlich muss man die Projektionsmatrix nur dann ändern wenn man die kammera verändert (anderes Bildverhälltnis, Zoom....) Solnge Objeckte bewegt werden muss immer die ModelVieMatrix benutzt werden.
Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Vielen Dank nochmal für eure Antworten. Im "Red Book" habe ich noch folgendes gefunden:
Zitat:
Viewing and modeling transformations are inextricably related in OpenGL and are in fact combined into a single modelview matrix
Damit hätten wir das wohl geklärt, obwohl ich die Idee, eine von der Modellwelt unabhängige Matrix zur Kameraführung zu nutzen, eigentlich sehr verlockend fand.
Wieso wird die Projektionsmatrix rechts an die modelview matrix ranmultipliziert? Es wird doch zuerst der Vertex mit der Modelview matrix transformiert, und erst anschließend mit der Projektionsmatrix. Daher hätte ich erwartet dass die Projektionsmatrix links an die Modelviewmatrix ranmultipliziert wird.
Grundsätzlich muss man die Projektionsmatrix nur dann ändern wenn man die kammera verändert (anderes Bildverhälltnis, Zoom....) Solnge Objeckte bewegt werden muss immer die ModelVieMatrix benutzt werden.
*mal Thread rauskram*
Wie verhält sich das denn, wenn man eine Kamera hat die sich in Abhängig von der Szene bewegt? Ich hatte überlegt einen 3D Beat 'em Up Prototypen zus chreiben und für die Kamera beschlossen das sich ihr maximaler und minimaler Zoomfaktor in Abhängigkeit zur Entfernung der beiden Spielfiguren errechnet. Wenn ich deine Aussage richtig verstanden habe, müsste ich dann:
[Neue Figuren Positionen berechnen]
[Kamera in Abhängigkeit der Figuren platzieren/drehen]
[Welt zeichnen]
Wobei sich mir dann die Frage stellt ob ich die Welt relativ oder absolut zur Kamera zeichnen muss
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.