XGRIDSDocumentación
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Serie Lixel PortalCam

    • PortalCam P1

      • Descripción del producto
      • Operaciones básicas
      • Uso de la LCC Scan App
      • Mantenimiento y cuidado
      • FAQ
  • Serie Lixel K

    • Lixel K1

      • Descripción del producto
      • Operaciones básicas
      • Activación y conexión del dispositivo
      • Flujo de escaneo
      • Obtener nube de puntos con coordenadas absolutas
      • Fusión de mapas
      • Recomendaciones de planificación de rutas para escenas típicas
      • Precauciones
      • FAQ
    • Lixel K2

      • Descripción del producto
      • Operaciones básicas
      • Activación y conexión
      • Flujo de escaneo
      • Obtener nube de puntos con coordenadas absolutas
      • Fusión de mapas
      • Recomendaciones de planificación de rutas para escenas típicas
      • Precauciones
      • FAQ
  • Serie Lixel L

    • Lixel L2 Pro

      • Descripción del producto
      • Operaciones básicas
      • Activación y conexión del dispositivo
      • Flujo de escaneo
      • Obtener nube de puntos con coordenadas absolutas
      • Punto de medición
      • Apéndice
      • FAQ
    • Lixel L3

      • Descripción del producto
      • Operaciones básicas
      • Activación y conexión del dispositivo
      • Flujo de escaneo
      • Obtener nube de puntos con coordenadas absolutas
      • Apéndice
  • Lixel Studio

    • Versión y derechos de autor
    • Instalación y activación
    • Interfaz del software
    • Operaciones de archivo
    • Procesamiento de proyectos
    • Herramientas
    • Dibujo 2D
    • Aplicaciones
    • Ajustes
    • Conexión de dispositivo
    • Preguntas Frecuentes
  • Lixel CyberColor

    • LCC Studio

      • Primeros pasos
      • Versión y actualizaciones
      • Descarga e instalación
      • Descripción general de la interfaz y navegación
      • Antes de la reconstrucción
      • Reconstrucción de modelos
      • Reconstrucción de modelo único
      • Fusión de mapas
      • Fusión aire-tierra
      • Reconstrucción aérea
      • Mis modelos
      • Otras funciones
      • Ajustes y cuenta
      • Converter
      • Reconstrucción por vídeo
      • Preguntas frecuentes
    • LCC Scene Editor

      • Versión y actualizaciones
      • Cuenta e inicio de sesión
      • Descripción general del producto y página de inicio
      • Interfaz del editor
      • Modos de navegación
      • Archivo
      • Configuración
      • Editar
      • Ventana
      • Barra de herramientas global
      • Activos y propiedades
      • Barra de herramientas izquierda
      • Puntos de vista
      • Portal
      • Skybox
      • Anotaciones
      • Medición
      • Flythrough
      • Informe de escena
      • 3D Layout
      • Minimapa
      • Modo Vista previa (Viewer)
      • Ayuda
      • Preguntas frecuentes (FAQ)
      • Punto de inicio
    • LCC Model Editor

      • Versión y actualizaciones
      • Guía del usuario
      • Visión general e interfaz
      • Operaciones de archivo
      • Selectores
      • Edición de modelos
      • Medición
      • Corrección de color
      • Gestión de activos
      • Configuración y ayuda
      • Preguntas frecuentes
    • Capture Guide

      • Descripción general
      • Descripción general de los dispositivos de captura
      • Principios generales de captura
      • Captura de escenas interiores
      • Captura de escenas exteriores
      • Captura a gran escala (Map Fusion)
      • Captura con aerial-ground map fusion
      • Captura de objetos
      • Captura de personas
      • Captura para reconstrucción a partir de vídeo
      • HD Enhancement
      • Puntos de control (Lixel P1)
      • Preguntas frecuentes y resolución de problemas
    • Buenas Prácticas

      • Fusión de varios modelos 3DGS de gran tamaño
    • Historial de versiones
  • Plugins y SDK

    • Unreal

      • Introducción
      • Inicio rápido - Windows
      • Inicio rápido - Linux
      • Inicio rápido - Quest3
      • Ediciones y licencias
      • Renderizado
      • Rasterización Tiled (experimental)
      • Ajustes visuales
      • Normales e iluminación
      • Edición de escenas
      • Parámetros de rendimiento
      • Guía de rendimiento
      • Integración con plugins de terceros y del motor
      • Proxy Mesh
      • Animación de carga
      • Colisión
      • Compatibilidad con Navigation System
      • Compatibilidad con Single Layer Water
      • Localización
      • Preguntas frecuentes
      • Resolución de problemas
      • Logs y diagnóstico
      • Contacto
      • Buenas prácticas

        • Reiluminar 3DGS con una malla de LixelStudio
        • Renderizado independiente por cámara
      • Referencia de API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actors SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enumeraciones
        • Structs
      • Registro de cambios

        • v3.5.0
        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Introducción al SDK de Unity
      • Funciones técnicas
      • Requisitos del entorno de desarrollo
      • Guía de inicio rápido para PC
      • Guía de optimización de ajustes del proyecto
      • Guía de desarrollo para Pico 4 Ultra
      • Guía de streaming desde PC para Pico 4 Ultra
      • Guía de desarrollo para Quest 3
      • Guía de streaming desde PC para Quest 3
      • Guía de desarrollo con OpenXR
      • Guía de Business Streaming para Pico 4 Ultra
      • Glosario
      • Preguntas frecuentes
      • Contáctanos
      • Guía de desarrollo de funciones

        • Guía de desarrollo de renderizado mixto de varias escenas
        • Guía de desarrollo de recepción de sombras
        • Guía de desarrollo de iluminación en tiempo real
        • Guía de desarrollo de renderizado multicámara
        • Guía de desarrollo de renderizado de imágenes de alta resolución
        • Guía de desarrollo de compatibilidad de formatos de datos LCC y LCC2
        • Guía de desarrollo del efecto de carga
        • Guía de desarrollo de cambio de modo de renderizado Mip
        • Guía de desarrollo de ajuste a bordes y esquinas
        • Guía de desarrollo de decal proyectado
        • Guía de desarrollo de decal proyectado de vídeo
        • Guía de desarrollo de resaltado
        • Guía de desarrollo de recorte en tiempo real
        • Guía de desarrollo de ajuste de color
        • Guía de desarrollo para obtener los datos de malla de la escena
        • Guía de desarrollo del modo Editor
        • Guía de configuración de parámetros de rendimiento de renderizado
        • Guía de desarrollo de co-empaquetado de aplicación y datos
        • Guía de desarrollo del sistema de colisiones
        • Guía de problemas de permisos de desarrollo en macOS
        • Guía de desarrollo de compilación y empaquetado para dispositivos iOS
      • Referencia de API

        • LCCManager
        • Renderer
        • Tipos de datos
      • Registro de cambios

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
    • Web

      • Introducción
      • Guía de optimización del rendimiento de renderizado
      • Configuración de gráficos
      • Guía de desarrollo con WebGPU
      • Preguntas frecuentes
      • Referencia de API

        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setClipPrism
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setMipFilter
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
      • Registro de cambios

        • v0.6.4
        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0
  • API

    • Modelado espacial estructurado

      • Guía de acceso
      • Flujo de modelado
      • Referencia de la API
      • Credenciales temporales de carga
      • Códigos de error

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:

FormatoDatos de colisiónCompatibilidad
.lcccollision.lci en el directorio de datos, collision.bin en versiones anterioresCompatible
.lcc2Archivos .ply en data/mesh/ dentro del directorio de datosCompatible
.sog / .spz / .plyNinguno de forma nativa; la edición Pro puede derivarla automáticamente de las gaussianasCompatible (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.lci requiere exportarse desde LCC Studio v1.6.1 o superior; los datos exportados por versiones anteriores usan collision.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

ProblemaCausaMitigación
El personaje atraviesa el suelo en el instante en que empieza el juegoLa colisión aún no está construidaElevar 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 lejosEl punto de aparición está fuera del rango de carga de colisión; la primera carga sincrónica se activa al entrarColocar 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 impactanLas zonas más allá del radio de carga no tienen cuerpos de colisiónAumentar 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ápidoLos bloques de colisión de la zona nueva todavía se están cargandoCargar toda la colisión de una vez
Tirones al moverse, con un coste alto de Update CollisionLos bloques de colisión se intercambian y se vuelven a hornear con frecuenciaReducir 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ónLos cambios de colisión provocan actualizaciones del NavMeshAumentar 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

Activar la colisión LCC en el panel Details

Demostración de la colisión dinámica de LCC

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.

Mostrar los cuerpos de colisión en el modo de visualización

Verificar los cuerpos de colisión con el modo player collision o visibility collision

Propiedades relacionadas

PropiedadDescripción
bEnableCollisionActiva la colisión
CollisionLoadMaxDistanceDistancia máxima de carga de los datos de colisión (300 metros por defecto)
Propiedades de activación de la colisión y de distancia máxima de carga

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

  1. Marcar bEnableCollision en el panel del LCC Actor.
  2. Cargar el modelo de un solo archivo (.ply / .spz / .sog).
  3. La primera carga pasa al estado Generating y 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 a Loaded y escribe <nombre>.collision.ply junto al modelo.
  4. Al cargar de nuevo el mismo modelo, si el archivo de caché existe se pasa directamente a Loaded y se omite la generación.
Generación de la malla de colisión sobre la marcha en la primera carga de un modelo de un solo archivo

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.ply ya 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 Generating de OnCollisionStateChanged y 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.ply junto 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

  1. 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.
  2. Marcar Activar colisión (bEnableCollision) en el panel del LCC Actor.
  3. 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:

Contorno de colisión completo sin el recorte de colisión

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:

La colisión de la zona recortada se elimina al activar el recorte de colisión

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 OnCollisionStateChanged se dispara cuando cambia el estado, lo que permite activar el movimiento del personaje después de Loaded, o mostrar un aviso durante Generating.

Para la interfaz completa y las convenciones de uso, ver ULCCComponentBase - Consulta de estado.

Consejo: Loaded significa 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 a Loaded; 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 Usage de stat xgrids, el coste de actualización en Update Collision, y el significado de los elementos en Parámetros de rendimiento