Erst kürzlich haben wir versucht, ein detailliertes System in Unity zu implementieren. Ich werde vier Netzebenen erzeugen, jede mit einer Höhenkarte, aber ich denke, das ist im Moment nicht so wichtig. Nachdem ich mich mit dieser Technik befasst habe, habe ich viele Fragen. Ich hoffe, dass dies nicht zu viel ist, um alles auf einmal zu fragen, aber ich wäre äußerst dankbar, wenn jemand mir helfen würde, diese Technik zu verstehen.
1 : Ich kann nicht verstehen, an welchem Punkt in der Chunked LOD- Pipeline das Netz in Blöcke aufgeteilt wird. Befindet sich dies während der anfänglichen Netzerzeugung oder gibt es einen separaten Algorithmus, der dies ausführt.
2 : Ich verstehe, dass eine Quadtree-Datenstruktur zum Speichern der Chunked-LOD- Daten verwendet wird. Ich glaube, ich vermisse den Punkt ein wenig. Speichert der Quadtree Scheitelpunkt- und Dreiecksdaten für jede Unterteilungsebene?
3a : Wie wird die Kameraentfernung normalerweise berechnet? Beim Nachlesen von Quadtrees werden häufig Bounding-Boxes mit Achsenausrichtung erwähnt. Würde in diesem Fall jeder Chunk einen Kollisionsbegrenzungsrahmen haben, um zu erkennen, ob sich die Kamera oder der Player in der Nähe befindet? oder gibt es einen besseren weg dies zu tun? (Raycast vielleicht?)
3b : Berechnen die Chunks die Kameraentfernung selbst?
4 : Hat jeder Chunk die gleiche "Auflösung". Auf der obersten Ebene ist das Netz beispielsweise 32 x 32, und jeder unterteilte Knoten ist auch 32 x 32. Beispiel unten:
quelle
Antworten:
1: Ich kann nicht verstehen, an welchem Punkt in der Chunked LOD-Pipeline das Netz in Blöcke aufgeteilt wird. Befindet sich dies während der anfänglichen Netzerzeugung oder gibt es einen separaten Algorithmus, der dies ausführt.
Das ist egal. Beispielsweise können Sie das Chunking in Ihren Algorithmus zur Netzgenerierung integrieren. Sie können dies sogar dynamisch tun, sodass niedrigere Ebenen mithilfe eines plasmaartigen Verfeinerungsalgorithmus dynamisch hinzugefügt werden (z. B. wenn der Spieler näher rückt). Sie können auch ein hochauflösendes Netz aus Künstlereingabe- oder Höhenmessdaten generieren und es zum Zeitpunkt der Finalisierung des Assets in allen LOD-Abschnitten zusammenfassen. Oder Sie können mischen und zusammenpassen. Das hängt wirklich von Ihrer Anwendung ab.
2: Ich verstehe, dass eine Quadtree-Datenstruktur zum Speichern der Chunked-LOD-Daten verwendet wird. Ich glaube, ich vermisse den Punkt ein wenig. Speichert der Quadtree Scheitelpunkt- und Dreiecksdaten für jede Unterteilungsebene?
Nicht unbedingt. Der Baum speichert nur Informationen über die Geometrie und wie sie gerendert werden soll. Dies kann bedeuten, dass an jedem Baumknoten eine Scheitelpunkt- / Flächenliste vorhanden ist. Realistischer in der heutigen Zeit würden Sie die Handles der Netze / Instanzen im GPU-Speicher speichern.
3a: Wie wird die Kameraentfernung normalerweise berechnet? Beim Nachlesen von Quadtrees werden häufig Bounding-Boxes mit Achsenausrichtung erwähnt. Wäre in diesem Fall für jeden Chunk ein Kollisionsbegrenzungsrahmen vorhanden, um zu erkennen, ob sich die Kamera oder der Player in der Nähe befindet? oder gibt es einen besseren weg dies zu tun? (Raycast vielleicht?)
Eine sehr kostengünstige und einfache Möglichkeit besteht darin, den Abstand zum Mittelpunkt des Blocks zu verwenden und ihn dann zu korrigieren. Sie wissen, dass dieser Abstand immer eine Unterschätzung ist: Wenn der Mittelpunkt auf Abstand liegt
Z
, bedeutet dies, dass die Hälfte des Abschnitts näher ist. Was wir jedoch nicht wissen, ist die Orientierung. Wenn wir ein Stück mit der Breite "w
Edge-On" anzeigen , befindet sich das nächstgelegene Stück auf DistanzZ-w
. Wenn wir jedoch den Block mit der Ecke voran betrachten, befindet sich das nächstgelegene Bit in einiger EntfernungZ-sqrt(2)*w
. Wenn Sie mit dieser Unsicherheit leben können (Sie können es fast immer), sind Sie fertig. Beachten Sie, dass Sie den Betrachtungswinkel auch mithilfe der grundlegenden Trigonometrie korrigieren können.Ich ziehe es vor, den absoluten Mindestabstand zwischen Kamera und Chunk zu berechnen, um Artefakte zu minimieren. In der Praxis bedeutet dies, einen Punkt-Quadrat-Abstandstest durchzuführen . Es ist ein bisschen mehr Arbeit, als die Abstände zu den Mittelpunkten zu berechnen, aber es ist nicht so, als würden Sie von jedem Frame eine Unmenge davon machen.
Wenn Sie Ihre Physik-Engine dazu nutzen können, tun Sie dies auf jeden Fall, aber Sie möchten wirklich mehr über "Entfernungsabfrage" als über "Kollision" nachdenken.
3b: Berechnen die Chunks die Kameraentfernung selbst?
Es hängt wirklich vom Design Ihres Motors ab. Ich würde empfehlen, die Blätter relativ leicht zu halten. Abhängig von Ihrer Plattform kann bereits der Aufwand für die Durchführung eines eigenen Updates durch einige tausend Terrain-Chunks für jeden Frame die Leistung erheblich beeinträchtigen.
4: Hat jeder Chunk die gleiche "Auflösung". Auf der obersten Ebene ist das Netz beispielsweise 32 x 32, und jeder unterteilte Knoten ist auch 32 x 32.
Sie müssen nicht, aber es ist praktisch, wenn alle Blöcke den gleichen Platz beanspruchen. Dann können Sie Ihre (GPU-) Speicherverwaltung in Einheiten von "Chunks" durchführen. Es ist auch einfacher, die Nähte zwischen zwei Blöcken unterschiedlicher Größe zu entfernen / zu verbergen, wenn eine Auflösung ein Vielfaches der anderen ist, da sie mehrere Scheitelpunkte gemeinsam haben. (zB: 32x32 und 64x64 ist einfacher zu verwalten als 32x32 und 57x57) (danke Guiber!). Wenn Sie einen guten Grund haben, die Größe der Blockgeometrie zu ändern, sollten Sie dies unbedingt tun.
quelle