Hallo! Mein erster Post hier
.
Also, ich zunächst einmal mein aktueller Status:
Meine Klasse erstellt momentan einen Würfel. Jede dieser Seiten stellt eine Wurzel dar.
Daraus mache ich sechs Quad-Trees.
Das wird alles noch in der INIT-Phase vollzogen, also ohne Auswirkungen auf die Framerate.
Während der Update Phase wird der Baum unter folgenden Kriterien rekursiv durchlaufen:
Es gibt eine minimale und maximale Tiefe die erreicht werden muss/kann. Diese werden bei jedem
Aufruf dekrementiert. Zusätzlich gibt es eine Variable die die momentane Tiefe angibt.
Minimale Tiefe:
(Funktionsname BerechneWerte(Node, minTiefe, maxTiefe,maxEntfernung, EntfernungsMod)
Wenn min > 0
{
Wenn MomTiefe > 0
{
Wenn Winke (CamToViewTarget, CenterSphereToPoint) > 90°
Mach Nichts
Sonst
BerechneWerte(Node.Child[1 bis 4], minTiefe-1, maxTiefe-1, maxEntferung, EntfernungsMod)
}
}
Sonst
Wenn MaxTiefe > 0
Wenn Winkel(CamToViewTarget, CamToPoint) < SichtFeld
Wenn Entfernung(Cam, Punkt) < maxEntfernung
BerechneWerte(Node.Child[1 bis 4], minTiefe, maxTiefe-1, maxEntfernung--EntfernungsMod, EntfernungsMod
Sonst
Key = ÜberprüfeObPunkteBereitsInArray(Node) (Gibt entweder den Index des schon Bestehenden oder einen neuen Index wieder)
BerechneNormale(Node)
BerechneIndizes(Node)
Kopiere NodePunkte in Array
Füge Keys als Indizes hinzu.
So das läuft jede Update-Phase.
Ich habe es schon probiert als ÜberBedingung zu stellen, Sobald die Kameraposition oder Planetenposition sich von ihren alten Werten zu viel unterscheiden.
Das Problem ist dann aber, dass das ganze sehr stockend aussieht (Center of More Detail ist nicht in der Mitte bzw beim herauszoomen viel zu klein).
Es werden somit in jedem Update maximal 6*4^Tiefe Rekursionen durchgeführt. Was einiges an Rechenzeit brauch, selbst mit den Bedingungen:
Nicht Hintereinander liegende und nicht solche, die Außerhalb des Sichtfeldes liegen zu beachten.
Jetzt ist meine Überlegung Folgendes.
Init:
Ich erstelle für ALLE Planeten nur EINEN Quadtree. Somit habe ich die Ladezeit vor Eintritt im Spiel reduziert.
Der Quadtree speichert die Vertex-Positionen in globalen Lists und zwar in so vielen, wie MaxDepth-MinDepth.
Der Quadtree speichert die Indices in zu den Vertex-List passenden Index-Lists.
Da das vorher alles im Update war, wird der ganze Aufwand in Update beträchtlich reduziert.
Es werden nun so viele Buffer (Index/Vertex) erstellt, wie MinDepth Faces hat.
Update:
Berechnung der Nähe zu jedem MinLevel-Face (Nicht Sichtbar wegen Entfernung, Detail-Level-Entfernung)
Berechnung der Sichtbarkeit des MinLevels(Im Bezug auf Hintereinander liegen)
Daraus resultierend wird berechnet welcher Buffer welchen Anteil von welcher List bekommt.
Somit kann jedes Face detaillierter werden, ohne, dass die Listen berechnet werden müssen oder Quadtree durchlaufen,
da es alles vorher berechnet wurde. Das Ganze ist natürlich minimal so groß wie ein MinLevel-Face.
So dürften weitaus mehr Planeten darstellbar sein als einer, ohne die Performance-Einbuße eines ständigen Ladens.
Das kopieren in den Buffer an sich ist relativ einfach zu bewerkstelligen, da sich die Anzahl der Einträge pro Level
vervierfacht. Somit muss einfach nur das vierfache dessen geladen werden, wie zuvor. Der nächste Buffer muss dementsprechend
erst ab einer vierfach größeren Stelle laden usw.
Um natürlich unterschiedliche Planeten zu machen, kopiert sich jeder Planet die Listen (Index/Vertex) und manipuliert sie so.
Was haltet ihr davon?