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 de forma nativa; la edición Pro puede derivarla automáticamente de las gaussianas | Compatible (edición Pro) |
Para .lcc y .lcc2, el plugin comprueba el archivo de colisión incluido 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.
Los formatos de archivo único (.sog / .spz / .ply) no traen datos de colisión de forma nativa. La edición Pro puede derivar automáticamente la malla de colisión de las gaussianas, ver Generación automática de colisión para modelos de un solo archivo; en la edición gratuita hay que montar la colisión manualmente.
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.
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
Generación automática de colisión para modelos de un solo archivo
Función de la edición Pro. Los modelos de un solo archivo (.ply / .spz / .sog) no traen datos de colisión de forma nativa. El plugin deriva la malla de colisión de las propias gaussianas y la almacena en caché como <nombre>.collision.ply junto al modelo, de modo que después se carga y se reutiliza a través de la ruta de colisión PLY ya existente.
Es una función de la edición Pro: solo se genera después de registrar una App Key, consultar Ediciones y licencias. Sin licencia no se genera la malla de colisión y hay que montarla manualmente según la alternativa manual sin generación automática.
Pasos
- Marcar bEnableCollision en el panel del LCC Actor.
- Cargar el modelo de un solo archivo (
.ply/.spz/.sog). - La primera carga pasa al estado
Generatingy genera la malla de colisión sobre la marcha, lo que lleva de unos segundos a unos minutos según el volumen de datos; al terminar pasa aLoadedy escribe<nombre>.collision.plyjunto al modelo. - Al cargar de nuevo el mismo modelo, si el archivo de caché existe se pasa directamente a
Loadedy se omite la generación.

Con la colisión activada, en la primera carga de un modelo de un solo archivo un aviso en la esquina inferior derecha indica que se está generando la malla de colisión
El estado de la generación y de la colisión se puede consultar con GetCollisionState() o escuchando el evento OnCollisionStateChanged; para los valores, ver ULCCComponentBase - Consulta de estado.
Consejo: para evitar la generación en tiempo de ejecución, basta con distribuir o empaquetar el
<nombre>.collision.plyya generado junto al modelo; en tiempo de ejecución, si se detecta la caché, se reutiliza directamente.Consejo: al generar la colisión en un juego empaquetado no hay ningún aviso de UI integrado; para avisar al jugador de que «se está generando la colisión», escuchar el estado
GeneratingdeOnCollisionStateChangedy mostrarlo por cuenta propia.Consejo: si la generación falla, se pasa al estado
Failed; el motivo concreto está en el Output Log, y se puede reintentar desactivando y volviendo a activar la colisión. Para volver a probar el proceso de generación, eliminar primero el archivo de caché.collision.plyjunto al modelo.
Alternativa manual sin generación automática
Si se quiere controlar por completo la forma de la colisión, o los datos no son aptos para derivarla, también se puede dejar la generación automática desactivada y montar la colisión por cuenta propia en la escena:
- 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
Estos dos enfoques manuales no utilizan 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.
Zonas de recorte de colisión
La colisión puede recortarse junto con los volúmenes de recorte y los planos de sección, de modo que el alcance de la colisión se mantenga igual que la imagen renderizada. Por defecto, los volúmenes de recorte solo afectan al renderizado: la imagen de la zona recortada desaparece, pero la colisión sigue ahí y el personaje choca con una pared invisible. Al activar el recorte de colisión, la colisión también se elimina dentro de la zona recortada.
Pasos
- Añadir y configurar un volumen de recorte o un plano de sección en el LCC Actor según Edición de escenas y confirmar que la imagen renderizada se recorta como se espera.
- Marcar Activar colisión (bEnableCollision) en el panel del LCC Actor.
- Marcar Recorte de colisión en el panel; la colisión se recorta de inmediato según el volumen de recorte, y en la zona recortada ya no se generan cuerpos de colisión.
La imagen siguiente compara, con el modo de visualización «visibility collision», el contorno de colisión antes y después de activar el recorte de colisión. Cuando está desactivado, la colisión cubre toda la zona:

Sin marcar «Recorte de colisión»: el contorno de colisión cubre toda la zona
Una vez activado, la colisión dentro del volumen de recorte se elimina también, igual que el renderizado:

Con «Recorte de colisión» marcado: la colisión dentro de la zona recortada se elimina también
Consejo: el recorte de colisión requiere activar antes la colisión, y también funciona con la colisión generada automáticamente para los modelos de un solo archivo.
Consulta del estado de la colisión y eventos
Se puede consultar el estado actual de la colisión, o escuchar sus cambios de estado, para lógicas como «colocar al personaje solo cuando la colisión esté lista» o «mostrar el progreso durante la generación»:
GetCollisionState()devuelve el estado actual:NoCollision(desactivada o sin modelo) /Generating(el modelo de un solo archivo está generando la malla de colisión) /Loading(la colisión cercana a la cámara se está cargando / horneando) /Loaded(la colisión cercana a la cámara está lista) /Failed(no se puede proporcionar).- El evento
OnCollisionStateChangedse dispara cuando cambia el estado, lo que permite activar el movimiento del personaje después deLoaded, o mostrar un aviso duranteGenerating.
Para la interfaz completa y las convenciones de uso, ver ULCCComponentBase - Consulta de estado.
Consejo:
Loadedsignifica que la colisión cercana a la cámara está lista, no que todo el modelo tenga colisión; la colisión se sigue cargando por streaming a medida que la cámara se mueve. Cuando solo hace falta «no atravesar el suelo bajo los pies», basta con esperar aLoaded; para la colisión a lo lejos, aumentar la distancia 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