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
  • Accesorios

    • Stick Light

      • Guía de instalación
      • Operaciones básicas
      • Preguntas frecuentes
  • 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
      • Referencia de API

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

        • 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
      • Preguntas frecuentes
      • Referencia de API

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • 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::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • 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
      • Registro de cambios

        • 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

Guía de desarrollo del sistema de colisiones

El LCC Unity SDK tiene un sistema de colisiones integrado, centrado en resolver la aceleración de la construcción de colliders y la detección de colisiones — es decir, el problema de rendimiento de la colisión. El sistema Collider de Unity no puede manejar la detección en tiempo real en escenas muy grandes.

El LCC Unity SDK usa su propio sistema de colisiones integrado, que ya no depende del componente MeshCollider de Unity ni de capacidades relacionadas, por lo que no puede actuar directamente sobre GameObjects en una escena de Unity. El formato de datos LCC oficial generado por XGrids (LCC Studio) genera datos de malla usados para la colisión durante la reconstrucción al mismo tiempo, y el SDK usa estos datos de colisión para construir rápida y eficientemente la colisión de la escena. Debido a que es un sistema de colisiones propio, usar la función de colisión requiere llamar a los métodos correspondientes proporcionados por el SDK.

Nota:

El sistema de colisiones integrado del SDK es incompatible con el sistema Collider de Unity y no puede actuar directamente sobre objetos Rigidbody en Unity. La colisión para personajes como humanos digitales debe ser impulsada por los métodos de detección del SDK (consulta "Implementación de colisión de humanos digitales" a continuación).

Para escenas fijas, también puedes extraer los datos de malla y hornearlos en un NavMesh con anticipación, lo que puede ser compatible con el sistema Collider de Unity; consulta la guía de NavMesh para más detalles.

Requisitos previos de los datos

El requisito previo para que la detección de colisiones funcione es que la escena tenga los datos de colisión correspondientes. Los datos reconstruidos en versiones anteriores pueden no contener datos de colisión; en ese caso, llamar a SetColliderEnable(true) devuelve false, y todos los métodos de detección posteriores no están disponibles.

Por lo tanto, después de activar la colisión, asegúrate de comprobar el valor de retorno:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("Los datos actuales no contienen ningún collider, no se puede activar la detección de colisiones");
}

Flujo de trabajo de uso básico

El flujo de trabajo básico de la función de colisión tiene tres pasos:

  1. Carga los datos de la escena mediante el método Load().
  2. En la devolución de llamada de finalización de carga, activa la colisión mediante SetColliderEnable(true).
  3. Realiza la detección de colisiones mediante los diversos métodos de detección (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Carga la escena
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Activa la colisión después de que la carga finalice
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

void Update()
{
    if (!colliderReady) return;

    // 3. Realiza la detección de colisión en cada fotograma
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Nota:

SetColliderEnable() es un método de Renderer, mientras que los métodos de detección (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) están en LCCManager. Llámalos en los objetos correspondientes respectivamente.

Flujo de trabajo básico del sistema de colisiones: cargar escena → activar colisión → detección de colisión

Flujo de trabajo básico del sistema de colisiones

Implementación de colisión de humanos digitales

Debido a que el sistema de colisiones del SDK no actúa sobre el Rigidbody de Unity, la colisión para humanos digitales (personajes) debe ser impulsada por los métodos de detección. Hay tres enfoques comunes:

  • Detección de doble rayo: usa RaycastMesh() para disparar un rayo hacia abajo y otro hacia adelante, y juzga si el personaje puede caminar según los resultados de retorno del rayo (sondea el suelo hacia abajo, sondea obstáculos hacia adelante).
  • Detección de cápsula: usa IntersectsCapsule() para detectar si la cápsula en la que está el humano digital interseca con la malla de colisión, y juzga si puede caminar. El _delta de la versión sobrecargada devuelve el desplazamiento del siguiente punto alcanzable de forma segura.
  • Detección de esfera: usa IntersectsSphere() para detectar si la esfera en la que está el humano digital interseca con la malla de colisión, y juzga si puede caminar. El _delta de la versión sobrecargada también devuelve el desplazamiento de un punto alcanzable de forma segura.
Tres enfoques de implementación para la colisión de humanos digitales: detección de doble rayo, de cápsula y de esfera

Tres enfoques de implementación para la colisión de humanos digitales

Elegir entre RaycastMesh y Raycast

El SDK proporciona dos tipos de métodos de detección de rayos con propósitos diferentes:

MétodoObjetivo de detecciónPrecisiónVelocidadEscenario aplicable
RaycastMesh()Malla de colisión (datos Collider)Relativamente bajaRápidoColisión de humanos digitales, detección por fotograma
Raycast()Primitivas gaussianas (no depende de la malla de colisión)Relativamente altaLentoAplicaciones de tipo medición

Raycast() realiza la detección de rayos directamente sobre primitivas gaussianas, con mayor precisión pero menor velocidad, y no se recomienda para llamadas por fotograma, por lo que no es adecuado para la colisión de humanos digitales, solo para uso de tipo medición. Para la colisión de humanos digitales, prefiere RaycastMesh(), que depende de la malla de colisión.

API relacionadas

Entre los métodos relacionados con la colisión a continuación, SetColliderEnable() está en Renderer, mientras que los demás métodos de detección están en LCCManager. Todos los métodos de detección solo están disponibles después de que la escena termine de cargarse y se haya llamado con éxito a SetColliderEnable(true).

SetColliderEnable

// Valor de retorno: bool → true=configurado correctamente, false=los datos no contienen collider o la instancia no está activa
public bool SetColliderEnable(bool _enable)

Activa o desactiva la función de collider. Después de activarla, IntersectsSphere / IntersectsCapsule / RaycastMesh pasan a estar disponibles.

ParámetroTipoDescripción
_enableboolSi se habilita el collider

Ejemplo de uso:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Los datos no contienen collider");

Descripción:

  • Los datos deben contener datos de colisión (Mesh), de lo contrario devuelve false.
  • Requiere que el Renderer esté en estado activo.

RaycastMesh (coordenadas de pantalla)

// Valor de retorno: bool → true=impacto
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Dispara un rayo desde coordenadas de pantalla para detectar la malla de colisión. Usa datos Collider para la detección, más rápido que Raycast pero con menor precisión.

ParámetroTipoDescripción
mousePosVector3Coordenadas de pantalla
_finalResultout HitResultResultado del impacto
_disatncefloatDistancia máxima de detección, por defecto 70.0

Ejemplo de uso:

if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Descripción:

  • Requiere que la colisión se active correctamente primero.
  • Requiere llamar a SetColliderEnable(true) primero.

RaycastMesh (Ray + Bounds)

// Valor de retorno: bool → true=impacto
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Usa un Ray personalizado para la detección de malla de colisión, y también devuelve la información de la caja delimitadora del nodo impactado.

ParámetroTipoDescripción
rayRayEl rayo
resultout HitResultResultado del impacto
hitBoundsout BoundsCaja delimitadora del nodo impactado (caja delimitadora del nodo LOD impactado)
maxDistfloatDistancia máxima de detección, por defecto 70.0

Ejemplo de uso:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
    Debug.Log(bounds.center);
}

Descripción:

  • Requiere que la colisión se active correctamente primero.
  • Este método se usa comúnmente para la detección de doble rayo (hacia abajo, hacia adelante) para juzgar si un humano digital puede caminar.

IntersectsSphere

// Valor de retorno: bool → true=interseca
public bool IntersectsSphere(Sphere sphere)

// Valor de retorno: bool → true=interseca
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Detecta si una esfera interseca con la malla de colisión. La segunda sobrecarga devuelve además el vector de penetración delta (dirección y distancia de expulsión), que puede usarse para calcular el siguiente punto alcanzable de forma segura.

ParámetroTipoDescripción
sphereSphereLa esfera a detectar
deltaout Vector3Vector de penetración (dirección y distancia de expulsión)

Ejemplo de uso:

var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
    transform.position += delta;
}

Descripción:

  • Requiere que la colisión se active correctamente primero.
  • Requiere llamar a SetColliderEnable(true) primero.
  • Itera sobre todos los Renderers activos.

IntersectsCapsule

// Valor de retorno: bool → true=interseca
public bool IntersectsCapsule(Capsule capsule)

// Valor de retorno: bool → true=interseca
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Detecta si una cápsula interseca con la malla de colisión. Se usa comúnmente para la detección de colisiones del controlador de personaje. La segunda sobrecarga devuelve el vector de penetración delta, que puede usarse como desplazamiento al siguiente punto alcanzable de forma segura para un humano digital.

ParámetroTipoDescripción
capsuleCapsuleLa cápsula a detectar
deltaout Vector3Vector de penetración

Ejemplo de uso:

var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
    characterController.Move(delta);
}

Descripción:

  • Requiere que los datos contengan nodos de colisión.
  • Requiere llamar a SetColliderEnable(true) primero.
  • Adecuado para la colisión de personajes en primera / tercera persona.

Raycast

// Valor de retorno: bool → true=impacto
public bool Raycast(Ray _ray, out HitResult _finalResult)

Usa un Ray personalizado para realizar la detección de rayos sobre primitivas gaussianas, iterando sobre todos los Renderers activos y devolviendo el impacto más cercano. No depende de la malla de colisión; mayor precisión pero más lento.

ParámetroTipoDescripción
_rayRayEl rayo
_finalResultout HitResultResultado del impacto

Ejemplo de uso:

Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Descripción:

  • No depende de la malla de colisión, no necesita SetColliderEnable.
  • Mayor precisión pero más lento, no se recomienda para llamadas por fotograma, adecuado para aplicaciones de tipo medición, no adecuado para la colisión de humanos digitales.

HitResult

Los resultados de impacto de los métodos de detección anteriores se devuelven mediante el struct HitResult:

public struct HitResult {
    public bool isHit;             // Si hubo impacto
    public float distance;         // Distancia
    public Vector3 hitPos;         // Coordenadas de mundo del punto de impacto (el nombre del campo es hitPos, no position)
    public Vector3 normal;         // Normal del impacto
    public float hitAlpha;         // Alfa del elipsoide impactado
    public float dist2Origin;      // Distancia al origen del rayo
    public float scale;            // Escala del elipsoide
}

Nota:

El nombre del campo de las coordenadas de mundo del punto de impacto es hitPos, no position; accede a él mediante el nombre de campo real.