Caminar por una escena 3DGS: compatibilidad con colisión
LCC4Unreal admite la carga dinámica de datos de colisión, de modo que los personajes pueden moverse e interactuar libremente en el mundo 3DGS.
Requisitos previos
La colisión depende del archivo de colisión incluido con los datos, y los requisitos difieren según el formato:
| Formato | Datos de colisión | Compatibilidad |
|---|---|---|
.lcc | collision.lci en el directorio de datos, collision.bin en versiones anteriores | Compatible |
.lcc2 | Archivos .ply en data/mesh/ dentro del directorio de datos | Compatible |
.sog / .spz / .ply | Ninguno | No compatible |
El plugin comprueba en el orden collision.lci → collision.bin → data/mesh/*.ply, y muestra una advertencia y desactiva la colisión cuando no existe ninguno de ellos. Tras cargar los datos, usar HaveValidCollisionData() para confirmar si los datos actuales contienen datos de colisión utilizables.
Nota:
collision.lcirequiere exportarse desde LCC Studio v1.6.1 o superior; los datos exportados por versiones anteriores usancollision.bin.
Alternativas para los formatos de archivo único
.sog, .spz y .ply son formatos de archivo único que no incluyen datos de colisión, por lo que el plugin no puede generar colisión para ellos. Construirla en la escena cuando se necesite colisión:
- Blocking Volume: usar los volúmenes de bloqueo del motor para construir el suelo, las paredes y otras zonas que deban bloquear. Adecuado para formas regulares y es la opción más económica
- Malla aproximada: colocar una malla que se ajuste a la forma del 3DGS y activar su colisión. Adecuado para escenas de formas complejas. Esta malla puede reutilizar la malla proxy cambiando su preset de colisión a bloqueo
Ninguno de los dos enfoques utiliza el mecanismo de carga de colisión de LCC, por lo que no les afecta CollisionLoadMaxDistance ni se intercambian a medida que la cámara se mueve.
Mecanismo de carga
Los datos de colisión se almacenan en bloques espaciales igual que los datos de renderizado. El plugin no carga toda la colisión de una vez: carga solo los bloques situados dentro de un cierto radio alrededor de la cámara y los intercambia dinámicamente a medida que la cámara se mueve.
Cambia la posición de la cámara
│
▼
Calcular el conjunto de bloques de colisión que deben cargarse en el radio
│
▼
Comparar con el conjunto anterior ── igual ──▶ omitir, no hacer nada
│ distinto
▼
Cargar los bloques nuevos → entregarlos al sistema de física para su horneado → generar los cuerpos de colisión
Algunos puntos de la implementación:
- El radio de carga se controla con
Max Load Collision Distance(m), y las zonas más allá de esa distancia no tienen colisión - La primera carga es síncrona, lo que evita que el personaje atraviese el suelo antes de que la colisión esté lista; todas las actualizaciones posteriores son asíncronas y no bloquean el hilo principal
- Las actualizaciones están limitadas por frecuencia, de modo que la colisión no se reconstruye en cada fotograma mientras la cámara se mueve de forma continua
- Las actualizaciones se omiten cuando el conjunto de bloques visibles no cambia, por lo que los movimientos pequeños en el sitio no provocan una reconstrucción
- Solo se usa la cámara principal para el cálculo, y SceneCapture no participa en la carga de colisión
Ventajas
- El uso de memoria depende únicamente del radio de carga, no del tamaño total de los datos, por lo que la colisión funciona incluso en escenas grandes
- El número de cuerpos de colisión que debe procesar el sistema de física se mantiene bajo control y no ralentiza la física a medida que crece la escena
Costes y mitigaciones
| Problema | Causa | Mitigación |
|---|---|---|
| El personaje atraviesa el suelo en el instante en que empieza el juego | La colisión aún no está construida | Elevar un poco el PlayerStart, o activar el movimiento del personaje solo cuando la colisión esté lista |
| Tirón al entrar en el rango de la escena 3DGS desde lejos | El punto de aparición está fuera del rango de carga de colisión; la primera carga sincrónica se activa al entrar | Colocar el punto de aparición dentro del rango de carga de colisión o cargar toda la colisión de una vez |
| No hay colisión a lo lejos, por lo que los line traces no impactan | Las zonas más allá del radio de carga no tienen cuerpos de colisión | Aumentar Max Load Collision Distance(m), o cambiar a una comprobación que no dependa de la colisión |
| No hay colisión durante un breve periodo tras teletransportarse o moverse rápido | Los bloques de colisión de la zona nueva todavía se están cargando | Cargar toda la colisión de una vez |
Tirones al moverse, con un coste alto de Update Collision | Los bloques de colisión se intercambian y se vuelven a hornear con frecuencia | Reducir el radio de carga, o confirmar si la colisión es realmente necesaria |
| La malla de navegación se reconstruye continuamente al usarla con navegación | Los cambios de colisión provocan actualizaciones del NavMesh | Aumentar el radio de carga para que la zona de destino se cargue en una sola pasada, y usar horneado Static; consultar Compatibilidad con Navigation System |
Cargar toda la colisión de una vez
La mayoría de los costes anteriores provienen del intercambio de bloques en tiempo de ejecución. Cuando el tamaño de la escena es limitado y la memoria lo permite, aumentar Max Load Collision Distance(m) lo suficiente para cubrir la escena completa, de modo que toda la colisión se construya en una sola pasada mientras se cargan los datos.
El intercambio de bloques de colisión en tiempo de ejecución desaparece entonces, y no se produce ninguno de los problemas anteriores: atravesar el suelo, falta de colisión tras teletransportarse, tirones al moverse y reconstrucciones repetidas de la navegación. Esto es especialmente recomendable al usar el sistema de navegación.
El coste es un tiempo de carga más largo al inicio y un uso de memoria fijo equivalente a la colisión de la escena completa. Para valorar si es viable, consultar Collision Data Usage en stat xgrids y confirmar que el uso de memoria después de una carga completa es aceptable.
Activación
LCCComponent->SetLCCCollisionEnable(true);
O marcar bEnableCollision en el panel Details.

Activar la colisión LCC en el panel Details

Colisión dinámica de un personaje en una escena LCC
Verificación
Usar los ajustes del modo de visualización y seleccionar player collision o visibility collision para observar si la colisión está activada.

Verificar los cuerpos de colisión con el modo player collision o visibility collision
Propiedades relacionadas
| Propiedad | Descripción |
|---|---|
| bEnableCollision | Activa la colisión |
| CollisionLoadMaxDistance | Distancia máxima de carga de los datos de colisión (300 metros por defecto) |

Configurar el estado de activación de la colisión y la distancia máxima de carga
Notas
- Una vez activada la colisión, se puede usar el LineTrace propio de Unreal Engine para realizar pruebas de rayos contra los cuerpos de colisión, y el alcance de la prueba también está limitado por el radio de carga
- La memoria utilizada por los datos de colisión se puede consultar en
Collision Data Usagedestat xgrids, el coste de actualización enUpdate Collision, y el significado de los elementos en Parámetros de rendimiento