Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Ich hab ja jetzt schon einiges an Code gelesen und gesehen. Was ich mir momentan aber noch nicht so richtig vorstellen kann, ist die Art und Weise wie man eine Scene aus Objekten aufbaut.
Nur mal als Beispiel:
Die Tutorials verwenden eine RENDER-Routine in der die Scene dargestellt und verarbeitet wird. Da gibt es dann z.B. 4 Würfel. Einer hat eine Textur, der andere nur Farbe und die beiden anderen drehen sich. Nun kann ich mir vorstellen das man bei einem Tutorial sicher keine MDS oder andere Formate benutzt. Allein schon wegen der Komplexität. Aber wenn man wirklich 100 Objekte darstellen möchte, wie geht man dann vor?
Ich stelle mir momentan vor für z.B. einen Würfel eine Klasse TWuerfel zu schreiben die von einer Klasse TMainRenderObject abstammt. Der übergibt man dann eine 3D-Koordinate und hängt diese Klasse in eine Liste der zu rendernden Objekte.
D.h. ich rufe in der Procedure RENDERN alle Objekte in der Liste auf mit TMainRenderObject(TList[i]).Render.
Ist das die richtige vorgehensweise? Oder lieg ich da jetzt völlig total unglaublich daneben?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Prinzipiell schon ziemlich gut. Man würde nur anstatt Positionen gleich eine komplette Transformationsmatrix (also Rotation + Translation + Skalierung) übergeben. Dann rendert man das in der entsprechenden Reihenfolge durch. Eventuell sortiert man die Liste vorher nach Z-Werten oder sonstwas, je nach dem, wie weit man gehen will, um Performance rauszuholen.
greetings
_________________ 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: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Ah ja.
Zu den Transformationen: Ist es eigentlich ziemlich GPU/CPU-Intensiv wenn ich bei jedem Objekt dann ein glLoadIdentity() durchführe? In Anbetracht der Tatsache das man nicht genau wissen kann in welcher Reihenfolge die Objekte gerendert werden, kann man ja kaum relative koordinaten verwenden. Ich müsste mich doch dann in jedem Objekt am 0 Punkt der ModelMatrix orientieren, oder?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Japp, müsstest du. Du wirst aber eher glLoadMatrix verwenden wollen und die Matrizen schon auf der CPU vorberechnen.
greetings
_________________ 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
Du kannst deine Objekte in eine Baumstruktur anordnen und so durch aus relative Koordinatensystem benutzen. Vor dem rendern erstellst du eine Liste der möglicherweise sichtbaren Objekte. D.h. du prüfst ob die BoundingBox des Objektes im Sichtbereich der Kamera liegt. Die Baumstruktur hilft hierbei natürlich....du kannst die BoundingBoxen von mehreren Objekten zu einer größeren Box zusammenfassen und so mehrere Objekte in einem Test auf Sichtbarkeit prüfen....die größeren Boxen kannst du wieder zusammenfassen, usw...
Für alle sichtbaren Objekte berechnest du dann deine absolute Transformationsmatrix (*) und sortierst die Liste ggf. nach der Z-Koordinate. Dann nur noch diese Liste der sichtbaren Objekte rendern. Das Verfahren ist insbesondere dann sinnvoll, wenn du die Szene mehrfach renderst möchtest. Für diverse Effekte ist das notwendig.
(*) wahrscheinlich hast du die beim prüfen der BoundingBox sowieso schon benötigt.
Zitat:
Hab ich das richtig verstanden: Du meinst die Matrix im Objekt speichern und in der Renderfunktion des Objekts dann glLoadMatrix ?
Ja, ggf. aber auch glMultMatrix. Ich werfe normalerweise erst die View-Matrix (z.B. von gluLookAt) auf den Matrix-Stack, mache ein glPushMatrix und arbeite dann auf Objekt-Ebene mit immer gleich ausgerichteten "World"-Matrizen.
Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Coolcat hat geschrieben:
Ja, ggf. aber auch glMultMatrix. Ich werfe normalerweise erst die View-Matrix (z.B. von gluLookAt) auf den Matrix-Stack, mache ein glPushMatrix und arbeite dann auf Objekt-Ebene mit immer gleich ausgerichteten "World"-Matrizen.
World-Matrizen sind dann wohl Matrizen die sich je nach Objekt Position vom tatsächlichen 0 Punkt durch einen festen Vektor unterscheiden?
Richtig, World-Matrizen gehen einfach vom festen Welt-Koordinatensystem aus. Wenn du ein Objekt bewegen willst, wird dies normalerweise in diesem Welt-Koordinatensystem passieren und nicht irgendwie relativ zur Kamera. Die Koordinaten die du bei gluLookAt angibst sind auch in diesem Welt-Koordinatensystem.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.