Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Hi,
ich spiele im Moment ein wenig mit OpenGL rum und bin momentan dabei einen Octree zu implementieren, mir stellt sich dabei jedoch folgende Frage:
Ich brauche um den Octree zu errechnen alle Vertex Daten (in dem Tutorial* werden diese dem Konstruktor als Array übergeben: "Constructor Create(const polygons : array of PPolygon);"). Damit diese Daten so vorliegen, muss ich dafür sorgen, dass sie als "TPolygon" im Speicher liegen, soweit so klar, ich muss also meine Zeichenprozeduren soweit umbauen, als das nichtmehr glVertex* aufgerufen wird, sondern die Vertex Daten in ein Array gelegt werden. Das klingt ja alles super toll, aber wie komme ich bspw. an Vertexdaten die von fremd-Methoden wie bspw. gluSphere gerendert werden? Diese würden dem Octree ja garnicht übergeben werden, da diese direkt gezeichnet werden. Gibt es eine elegante Lösung für dieses "Problem"?
aber wie komme ich bspw. an Vertexdaten die von fremd-Methoden wie bspw. gluSphere gerendert werden?
Üblicherweise benutzt man nicht gluSphere (etc.) sondern lädt die Geometriedaten aus einer Datei. Stichwort Model Loader. Dann hast du die Daten üblicherweise als Array gegeben.
Im übrigen sollte man erwähnen das in dem Tutorial z.B verschwiegen wird wie man mit Objekten verfährt die sich je zum Teil in mehreren Nodes befinden. Nicht alle Objekte sind so schön regelmäßig wie ein Terrain. Verschiedene Materialien (Texturen, etc.) für die Objekte sind ein Problem.
Ich würde da anders als im Tutorial rangehen:
Du brauchst das ganze gar nicht auf Polygon-Level betrachten. Die Objekte werden nur durch eine BoundingBox beschrieben. Große, komplexe Objekte wie ein Terrain müssen natürlich zerteilt werden. Aber auch hier zerteilst du nur bis zu einem bestimmten Level (sagen wir 1000-2000 Polygone) und betrachtest nur die BoundingBox.
Die ganzen BoundingBoxen sortierst du dann in deinen Oct-Tree ein. Du solltest das "Raster" des Oct-Trees natürlich so anpassen, das die BoundingBoxen möglichst immer genau in einer einzigen Node landen. Bei einem Terrain geht das leicht, bei beliebigen Objekten lässt es sich nicht vermeiden, dass Objekte in mehreren Blattknoten enthalten sind.
Dieses Problem lässt sich aber leicht lösen. Du gibst jedem Objekt und jedem Knoten im Baum ein Bool-Flag. Wenn du das Objekt in diesem Frame bereits gerendert hast bzw. der Knoten sichtbar ist, setzt du das Flag auf "true". Nach dem rendern durchläufst du den Baum erneut (ohne Sichtbarkeitstest) indem du einfach den auf "true" gesetzen Flags folgst und sie alle wieder auf "false" setzt.
Dieses Verfahren hat große Vorteile, den du kannst die Objekte unabhängig rendern. Nicht jedes Objekt soll z.B. die gleiche Textur bekommen.
Ok, ich habe gelogen...ich würde da nicht so rangehen, sondern wahrscheinlich einen R-Baum und natürlich Vertexbufferobjects benutzen. Aber das hier ist das Einsteiger-Forum
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Sehr kompetente Antwort, danke dir, ich habe nun neue Informationen um weiterbasteln zu können. Sollten Fragen auftreten werde ich mich wieder melden .
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.