In einer 3DGS-Szene gehen: Unterstützung von Kollision
LCC4Unreal unterstützt das dynamische Laden von Kollisionsdaten, damit sich Charaktere frei in der 3DGS-Welt bewegen und interagieren können.
Voraussetzungen
Kollision beruht auf der mit den Daten ausgelieferten Kollisionsdatei, die Anforderungen unterscheiden sich je Format:
| Format | Kollisionsdaten | Unterstützung |
|---|---|---|
.lcc | collision.lci im Datenverzeichnis, in älteren Versionen collision.bin | Unterstützt |
.lcc2 | .ply-Dateien in data/mesh/ unterhalb des Datenverzeichnisses | Unterstützt |
.sog / .spz / .ply | Keine | Nicht unterstützt |
Das Plugin prüft in der Reihenfolge collision.lci → collision.bin → data/mesh/*.ply und gibt eine Warnung aus und deaktiviert die Kollision, wenn keine davon existiert. Nach dem Laden der Daten mit HaveValidCollisionData() prüfen, ob die aktuellen Daten nutzbare Kollisionsdaten enthalten.
Hinweis:
collision.lcierfordert einen Export aus LCC Studio v1.6.1 oder höher; von früheren Versionen exportierte Daten verwendencollision.bin.
Alternativen für Einzeldateiformate
.sog, .spz und .ply sind Einzeldateiformate, die keine Kollisionsdaten mitbringen, das Plugin kann für sie also keine Kollision erzeugen. Wenn Kollision benötigt wird, sie in der Szene aufbauen:
- Blocking Volume: Blocking Volumes der Engine verwenden, um Boden, Wände und weitere blockierende Bereiche aufzubauen. Geeignet für regelmäßige Formen und die günstigste Option
- Näherungs-Mesh: Ein Mesh platzieren, das zur 3DGS-Form passt, und dessen Kollision aktivieren. Geeignet für Szenen mit komplexen Formen. Dieses Mesh kann das Proxy Mesh weiterverwenden, indem dessen Collision Preset auf Blockieren geändert wird
Keiner der beiden Wege betrifft den LCC-Lademechanismus für Kollisionen, sie sind daher von CollisionLoadMaxDistance unbeeinflusst und werden bei Kamerabewegung nicht ein- und ausgelagert.
Lademechanismus
Kollisionsdaten sind wie die Renderdaten in räumliche Chunks gegliedert. Das Plugin lädt nicht alle Kollisionen auf einmal: Es lädt nur die Chunks innerhalb eines bestimmten Umkreises um die Kamera und lagert sie mit der Kamerabewegung dynamisch ein und aus.
Kameraposition ändert sich
│
▼
Die Menge der Kollisions-Chunks berechnen, die im Umkreis geladen sein sollen
│
▼
Mit der vorherigen Menge vergleichen ── gleich ──▶ überspringen, nichts tun
│ unterschiedlich
▼
Neue Chunks laden → an das Physiksystem zum Backen übergeben → Kollisionskörper erzeugen
Einige Punkte zur Umsetzung:
- Den Laderadius steuert
Max Load Collision Distance(m), Bereiche jenseits dieser Distanz haben keine Kollision - Das erste Laden erfolgt synchron, was verhindert, dass der Charakter durch den Boden fällt, bevor die Kollision bereit ist; jede weitere Aktualisierung läuft asynchron und blockiert den Haupt-Thread nicht
- Aktualisierungen sind gedrosselt, die Kollision wird also nicht in jedem Bild neu aufgebaut, während sich die Kamera fortlaufend bewegt
- Aktualisierungen entfallen, wenn die sichtbare Chunk-Menge unverändert ist, kleine Bewegungen auf der Stelle lösen also keinen Neuaufbau aus
- Nur die Hauptkamera geht in die Berechnung ein, SceneCapture nimmt am Laden der Kollision nicht teil
Vorteile
- Der Arbeitsspeicherbedarf hängt nur vom Laderadius ab, nicht von der Gesamtgröße der Daten, Kollision funktioniert also auch bei großen Szenen
- Die Anzahl der Kollisionskörper, die das Physiksystem verarbeiten muss, bleibt unter Kontrolle und bremst die Physik nicht, wenn die Szene wächst
Kosten und Gegenmaßnahmen
| Problem | Ursache | Gegenmaßnahme |
|---|---|---|
| Der Charakter fällt im Moment des Spielstarts durch den Boden | Die Kollision ist noch nicht aufgebaut | PlayerStart etwas höher setzen oder die Charakterbewegung erst freigeben, wenn die Kollision bereit ist |
| Ruckler, wenn der Charakter von weit weg den Bereich der 3DGS-Szene betritt | Der Spawnpunkt liegt außerhalb des Kollisions-Ladebereichs; beim ersten Betreten wird synchron geladen | Den Spawnpunkt innerhalb des Kollisions-Ladebereichs platzieren oder alle Kollisionen auf einmal laden |
| Keine Kollision in der Ferne, Line Traces treffen daher nicht | Bereiche jenseits des Laderadius haben keine Kollisionskörper | Max Load Collision Distance(m) erhöhen oder auf eine Prüfung wechseln, die nicht auf Kollision beruht |
| Nach dem Teleportieren oder schneller Bewegung kurzzeitig keine Kollision | Die Kollisions-Chunks des neuen Bereichs werden noch geladen | Alle Kollisionen auf einmal laden |
Ruckeln bei Bewegung mit hohen Kosten bei Update Collision | Kollisions-Chunks werden häufig ein- und ausgelagert und neu gebacken | Den Laderadius verringern oder prüfen, ob Kollision wirklich nötig ist |
| Das Navigation Mesh wird bei Verwendung mit Navigation fortlaufend neu aufgebaut | Änderungen der Kollision lösen NavMesh-Aktualisierungen aus | Den Laderadius erhöhen, damit der Zielbereich in einem Durchgang geladen wird, und Static-Backen verwenden, siehe Unterstützung des Navigation System |
Alle Kollisionen auf einmal laden
Die meisten der obigen Kosten entstehen durch das Ein- und Auslagern von Chunks zur Laufzeit. Wenn die Szenengröße begrenzt ist und der Arbeitsspeicher es zulässt, Max Load Collision Distance(m) so weit erhöhen, dass der Radius die gesamte Szene abdeckt; dann wird die gesamte Kollision während des Ladens der Daten in einem Durchgang aufgebaut.
Das Ein- und Auslagern von Kollisions-Chunks zur Laufzeit entfällt damit, und keines der früher genannten Probleme tritt auf: Durchfallen durch den Boden, fehlende Kollision nach dem Teleportieren, Ruckeln bei Bewegung und wiederholte Neuaufbauten der Navigation. Bei Nutzung des Navigation System ist dies besonders empfohlen.
Der Preis sind eine längere Ladezeit beim Start und ein fester Arbeitsspeicherbedarf in Höhe der Kollision der gesamten Szene. Zur Beurteilung, ob das machbar ist, Collision Data Usage in stat xgrids prüfen und bestätigen, dass der Arbeitsspeicherbedarf nach vollständigem Laden akzeptabel ist.
Aktivieren
LCCComponent->SetLCCCollisionEnable(true);
Oder im Details-Panel bEnableCollision anhaken.

LCC-Kollision im Details-Panel aktivieren

Dynamische Kollision eines Charakters in einer LCC-Szene
Prüfung
Über die Einstellungen des View Mode Player Collision oder Visibility Collision auswählen, um zu beobachten, ob die Kollision aktiv ist.

Kollisionskörper über den Modus Player Collision oder Visibility Collision prüfen
Zugehörige Eigenschaften
| Eigenschaft | Beschreibung |
|---|---|
| bEnableCollision | Aktiviert die Kollision |
| CollisionLoadMaxDistance | Maximale Ladedistanz der Kollisionsdaten (standardmäßig 300 Meter) |

Den Aktivierungszustand der Kollision und die maximale Ladedistanz konfigurieren
Hinweise
- Sobald die Kollision aktiv ist, lässt sich der LineTrace von Unreal Engine selbst für Strahlentests gegen Kollisionskörper nutzen, und der Prüfbereich ist ebenfalls durch den Laderadius begrenzt
- Der von Kollisionsdaten belegte Arbeitsspeicher steht in
Collision Data Usagevonstat xgrids, die Kosten der Aktualisierung inUpdate Collision, und die Bedeutung der Einträge in Leistungsparameter