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 | Bringen keine mit; die Pro Edition kann sie aus den Gaussians ableiten | Unterstützt (Pro Edition) |
Bei .lcc und .lcc2 prüft das Plugin die mitgelieferte Kollisionsdatei in der Reihenfolge collision.lci → collision.bin → data/mesh/*.ply und gibt eine Warnung aus und deaktiviert die Kollision, wenn keine der drei existiert.
Einzeldateiformate (.sog / .spz / .ply) bringen selbst keine Kollisionsdaten mit. Die Pro Edition kann das Kollisionsnetz aus den Gaussians ableiten, siehe Automatische Kollisionsgenerierung für Einzeldateimodelle; in der kostenlosen Edition muss die Kollision selbst aufgebaut werden.
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.
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
Automatische Kollisionsgenerierung für Einzeldateimodelle
Funktion der Pro Edition. Einzeldateimodelle (.ply / .spz / .sog) bringen selbst keine Kollisionsdaten mit. Das Plugin leitet das Kollisionsnetz aus den Gaussians selbst ab, legt es als <Name>.collision.ply neben dem Modell ab und lädt es anschließend über den bestehenden PLY-Kollisionspfad erneut.
Dies ist eine Funktion der Pro Edition und wird erst nach der Registrierung eines App Key erzeugt, siehe Editionen und Lizenzierung. Ohne Lizenz wird kein Kollisionsnetz erzeugt; die Kollision muss dann gemäß Manueller Aufbau ohne automatische Generierung selbst aufgebaut werden.
Schritte
- Im Panel des LCC-Actors bEnableCollision anhaken.
- Das Einzeldateimodell (
.ply/.spz/.sog) laden. - Beim ersten Laden geht es in den Zustand
Generatingund erzeugt das Kollisionsnetz direkt; das dauert je nach Datenmenge einige Sekunden bis Minuten. Nach dem Abschluss wechselt es zuLoadedund schreibt<Name>.collision.plyneben das Modell. - Beim erneuten Laden desselben Modells geht es direkt auf
Loaded, wenn die Cache-Datei existiert, und überspringt die Generierung.

Nach dem Aktivieren der Kollision zeigt die rechte untere Ecke beim ersten Laden eines Einzeldateimodells an, dass das Kollisionsnetz erzeugt wird
Der Generierungs- und Kollisionszustand lässt sich mit GetCollisionState() abfragen oder über das Ereignis OnCollisionStateChanged beobachten; die Werte stehen unter ULCCComponentBase – Statusabfrage.
Tipp: Soll die Generierung zur Laufzeit entfallen, die erzeugte Datei
<Name>.collision.plyzusammen mit dem Modell ausliefern oder paketieren; zur Laufzeit wird der erkannte Cache direkt wiederverwendet.Tipp: Beim Erzeugen der Kollision im paketierten Spiel gibt es keinen eingebauten UI-Hinweis. Um den Spielern „Kollision wird erzeugt“ anzuzeigen, den Zustand
GeneratingvonOnCollisionStateChangedbeobachten und selbst eine Anzeige einblenden.Tipp: Schlägt die Generierung fehl, wechselt der Zustand zu
Failed; der genaue Grund steht im Output Log. Kollision aus- und wieder einschalten, um es erneut zu versuchen. Um den Generierungsvorgang erneut zu testen, zuerst die Cache-Datei.collision.plyneben dem Modell löschen.
Manueller Aufbau ohne automatische Generierung
Wer die Kollisionsform vollständig steuern will oder Daten hat, die sich nicht zur Ableitung eignen, kann die automatische Generierung auslassen und die Kollision selbst 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 dieser beiden manuellen Wege betrifft den LCC-Lademechanismus für Kollisionen, sie sind daher von CollisionLoadMaxDistance unbeeinflusst und werden bei Kamerabewegung nicht ein- und ausgelagert.
Kollisionsbereiche beschneiden
Die Kollision kann zusammen mit Clipping-Volumen und Schnittebenen beschnitten werden, sodass der Kollisionsbereich mit dem gerenderten Bild übereinstimmt. Ein Clipping-Volumen wirkt standardmäßig nur auf das Rendering: Im weggeschnittenen Bereich verschwindet das Bild, aber die Kollision bleibt, und die Spielfigur läuft gegen eine unsichtbare Wand. Nach dem Aktivieren von „Clip Collision“ wird auch die Kollision im beschnittenen Bereich entfernt.
Schritte
- Dem LCC-Actor gemäß Szenenbearbeitung ein Clipping-Volumen oder eine Schnittebene hinzufügen und konfigurieren und bestätigen, dass das gerenderte Bild wie erwartet beschnitten ist.
- Im Panel des LCC-Actors Kollision aktivieren (bEnableCollision) anhaken.
- Im Panel Clip Collision anhaken; die Kollision wird daraufhin gemäß dem Clipping-Volumen beschnitten, und im weggeschnittenen Bereich werden keine Kollisionskörper mehr erzeugt.
Die folgende Abbildung vergleicht im Ansichtsmodus „Visibility Collision“ das Kollisionsgitter vor und nach dem Umschalten von Clip Collision. Deaktiviert deckt die Kollision den vollständigen Bereich ab:

Ohne „Clip Collision“: Das Kollisionsgitter deckt den vollständigen Bereich ab
Aktiviert wird die Kollision innerhalb des Clipping-Volumens mit weggeschnitten, in Übereinstimmung mit dem Rendering:

Mit „Clip Collision“: Die Kollision innerhalb des beschnittenen Bereichs wird mit entfernt
Tipp: Clip Collision setzt aktivierte Kollision voraus und wirkt auch auf die automatisch für Einzeldateimodelle erzeugte Kollision.
Kollisionszustand abfragen und Ereignisse
Es lässt sich der aktuelle Kollisionszustand abfragen oder auf Änderungen des Kollisionszustands reagieren, etwa für Logik wie „den Charakter erst setzen, wenn die Kollision bereit ist“ oder „während der Generierung den Fortschritt anzeigen“:
GetCollisionState()gibt den aktuellen Zustand zurück:NoCollision(aus oder kein Modell) /Generating(das Einzeldateimodell erzeugt gerade das Kollisionsnetz) /Loading(die Kollision nahe der Kamera wird geladen/gecookt) /Loaded(die Kollision nahe der Kamera ist bereit) /Failed(kann nicht bereitgestellt werden).- Das Ereignis
OnCollisionStateChangedwird bei einer Zustandsänderung ausgelöst und kann die Charakterbewegung erst nachLoadedfreigeben oder beiGeneratingeinen Hinweis anzeigen.
Die vollständige Schnittstelle und die Nutzungskonventionen stehen unter ULCCComponentBase – Statusabfrage.
Tipp:
Loadedbedeutet, dass die Kollision nahe der Kamera bereit ist, nicht dass das gesamte Modell Kollision hat – die Kollision wird mit der Kamerabewegung fortlaufend gestreamt. Wenn es nur darum geht, „nicht durch den Boden zu fallen“, genügt das Abwarten vonLoaded; für Kollision in der Ferne die Ladedistanz erhöhen.
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