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

    • PortalCam P1

      • Panoramica del prodotto
      • Operazioni di base
      • Uso della LCC Scan App
      • Manutenzione e cura
      • FAQ
  • Serie Lixel K

    • Lixel K1

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Flusso di scansione
      • Ottenere una nuvola di punti con coordinate assolute
      • Fusione delle mappe
      • Consigli di pianificazione dei percorsi per scene tipiche
      • Precauzioni
      • FAQ
    • Lixel K2

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione
      • Flusso di scansione
      • Acquisire una nuvola di punti con coordinate assolute
      • Fusione mappe
      • Consigli di pianificazione dei percorsi per scene tipiche
      • Precauzioni
      • FAQ
  • Serie Lixel L

    • Lixel L2 Pro

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Flusso di scansione
      • Ottenere una nuvola di punti con coordinate assolute
      • Punto di misura
      • Appendice
      • FAQ
    • Lixel L3

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Acquisizione dei dati
      • Acquisizione di coordinate assolute
      • Appendice
  • Accessori

    • Stick Light

      • Guida all'installazione
      • Operazioni di base
      • Domande frequenti
  • Lixel Studio

    • Versione e copyright
    • Installazione e attivazione
    • Interfaccia del software
    • Operazioni sui file
    • Elaborazione del progetto
    • Strumenti
    • Disegno 2D
    • Applicazioni di settore
    • Impostazioni
    • Connessione del dispositivo
    • Domande Frequenti
  • Lixel CyberColor

    • LCC Studio

      • Introduzione
      • Versione e aggiornamenti
      • Download e installazione
      • Panoramica dell'interfaccia e navigazione
      • Operazioni preliminari alla ricostruzione
      • Prima della ricostruzione
      • Ricostruzione del modello
      • Ricostruzione modello singolo
      • Fusione delle mappe
      • Fusione aria-terra
      • Ricostruzione aerea
      • I miei modelli
      • Altre funzioni
      • Impostazioni e account
      • Convertitore
      • Ricostruzione video
      • Domande Frequenti / FAQ
    • LCC Scene Editor

      • Versione e aggiornamenti
      • Account e accesso
      • Panoramica del prodotto e home page
      • Interfaccia dell'editor
      • Modalità di navigazione
      • File
      • Impostazioni
      • Modifica
      • Finestra
      • Barra degli strumenti globale
      • Asset e proprietà
      • Barra degli strumenti sinistra
      • Punti di vista
      • Portale
      • Skybox
      • Annotazioni
      • Misurazione
      • Flythrough
      • Rapporto scena
      • 3D Layout
      • Mini-mappa
      • Modalità Anteprima (Viewer)
      • Aiuto
      • Domande frequenti (FAQ)
      • Punto di spawn
    • LCC Model Editor

      • Versione e aggiornamenti
      • Guida utente
      • Panoramica e interfaccia
      • Operazioni sui file
      • Selettori
      • Modifica dei modelli
      • Misurazione
      • Correzione colore
      • Gestione degli asset
      • Impostazioni e Aiuto
      • Domande frequenti
    • Capture Guide

      • Panoramica
      • Panoramica dei dispositivi di acquisizione
      • Principi generali di acquisizione
      • Acquisizione di scene interne
      • Acquisizione di scene esterne
      • Acquisizione su larga scala (map fusion)
      • Acquisizione per aerial-ground map fusion
      • Acquisizione di oggetti
      • Acquisizione di persone
      • Acquisizione per ricostruzione da video
      • HD Enhancement
      • Control points (Lixel P1)
      • FAQ e risoluzione dei problemi
    • Buone Pratiche

      • Unione di più modelli 3DGS di grandi dimensioni
    • Cronologia versioni
  • Plugin e SDK

    • Unreal

      • Introduzione
      • Avvio rapido - Windows
      • Avvio rapido - Linux
      • Avvio rapido - Quest3
      • Edizioni e licenze
      • Rendering
      • Rasterizzazione Tiled (sperimentale)
      • Impostazioni visive
      • Normali e illuminazione
      • Modifica della scena
      • Parametri di prestazione
      • Guida alle prestazioni
      • Integrazione con plugin di terze parti e del motore
      • Proxy Mesh
      • Animazione di caricamento
      • Collisioni
      • Supporto del Navigation System
      • Supporto di Single Layer Water
      • Localizzazione
      • FAQ
      • Risoluzione dei problemi
      • Log e diagnostica
      • Contattaci
      • Buone pratiche

        • Rilluminare il 3DGS con una mesh di LixelStudio
      • Riferimento API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actor SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enum
        • Struct
      • Registro delle modifiche

        • 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

      • Introduzione all'Unity SDK
      • Caratteristiche tecniche
      • Requisiti dell'ambiente di sviluppo
      • Guida rapida per PC
      • Guida all'ottimizzazione delle impostazioni di progetto
      • Guida allo sviluppo per Pico 4 Ultra
      • Guida allo streaming PC per Pico 4 Ultra
      • Guida allo sviluppo per Quest 3
      • Guida allo streaming PC per Quest 3
      • Guida allo sviluppo OpenXR
      • Guida allo streaming Business per Pico 4 Ultra
      • Glossario
      • FAQ
      • Contattaci
      • Guida allo sviluppo delle funzionalità

        • Guida allo sviluppo del rendering misto multi-scena
        • Guida allo sviluppo della ricezione delle ombre
        • Guida allo sviluppo dell'illuminazione in tempo reale
        • Guida allo sviluppo del rendering multi-camera
        • Guida allo sviluppo del rendering di immagini ad alta risoluzione
        • Guida allo sviluppo della compatibilità dei formati dati LCC e LCC2
        • Guida allo sviluppo dell'effetto di caricamento
        • Guida allo sviluppo del cambio di modalità di rendering Mip
        • Guida allo sviluppo dello snap a bordi e angoli
        • Guida allo sviluppo della decal proiettata
        • Guida allo sviluppo della decal proiettata video
        • Guida allo sviluppo dell'evidenziazione
        • Guida allo sviluppo del ritaglio in tempo reale
        • Guida allo sviluppo della regolazione del tono
        • Guida allo sviluppo dell'ottenimento dei dati Mesh della scena
        • Guida allo sviluppo della modalità Editor
        • Guida alla configurazione dei parametri di prestazioni di rendering
        • Guida allo sviluppo del co-impacchettamento di applicazione e dati
        • Guida allo sviluppo del sistema di collisione
        • Guida ai problemi di autorizzazione nello sviluppo su macOS
        • Guida allo sviluppo di compilazione e packaging per dispositivi iOS
      • Riferimento API

        • LCCManager
        • Renderer
        • Tipi di dati
      • Registro delle modifiche

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

      • Introduzione
      • Guida all'ottimizzazione delle prestazioni di rendering
      • Configurazione grafica
      • Domande frequenti
      • Riferimento 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 delle modifiche

        • 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

Guida allo sviluppo del sistema di collisione

L'LCC Unity SDK dispone di un sistema di collisione integrato, focalizzato sulla risoluzione dell'accelerazione della costruzione dei collider e del rilevamento delle collisioni — ovvero il problema delle prestazioni di collisione. Il sistema Collider di Unity non può gestire il rilevamento in tempo reale in scene molto grandi.

L'LCC Unity SDK usa il proprio sistema di collisione integrato, non basandosi più sul componente MeshCollider di Unity e sulle capacità correlate, quindi non può agire direttamente sui GameObject di una scena Unity. Il formato dati LCC ufficiale generato da XGrids (LCC Studio) genera contemporaneamente, durante la ricostruzione, i dati Mesh usati per la collisione, e l'SDK usa questi dati di collisione per costruire in modo rapido ed efficiente la collisione della scena. Poiché si tratta di un sistema di collisione autonomo, l'uso della funzionalità di collisione richiede la chiamata dei metodi corrispondenti forniti dall'SDK.

Nota:

Il sistema di collisione integrato dell'SDK è incompatibile con il sistema Collider di Unity e non può agire direttamente sugli oggetti Rigidbody in Unity. La collisione per i personaggi come gli umani digitali deve essere guidata dai metodi di rilevamento dell'SDK (vedi "Implementazione della collisione dell'umano digitale" di seguito).

Per le scene fisse, puoi anche estrarre i dati Mesh e farne il baking in una NavMesh in anticipo, che può essere compatibile con il sistema Collider di Unity; vedi la guida alla NavMesh per i dettagli.

Prerequisiti dei dati

Il prerequisito affinché il rilevamento delle collisioni funzioni è che la scena disponga dei corrispondenti dati di collisione. I dati ricostruiti in versioni precedenti potrebbero non contenere dati di collisione; in tal caso, la chiamata di SetColliderEnable(true) restituisce false e tutti i successivi metodi di rilevamento non sono disponibili.

Pertanto, dopo aver abilitato la collisione, assicurati di controllare il valore restituito:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("I dati correnti non contengono alcun collider, impossibile abilitare il rilevamento delle collisioni");
}

Flusso di lavoro di base

Il flusso di lavoro di base per la funzionalità di collisione prevede tre passaggi:

  1. Carica i dati della scena tramite il metodo Load().
  2. Nel callback di completamento del caricamento, abilita la collisione tramite SetColliderEnable(true).
  3. Esegui il rilevamento delle collisioni tramite i vari metodi di rilevamento (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Carica la scena
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Abilita la collisione dopo il completamento del caricamento
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

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

    // 3. Esegui il rilevamento delle collisioni a ogni fotogramma
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Nota:

SetColliderEnable() è un metodo di Renderer, mentre i metodi di rilevamento (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) sono su LCCManager. Chiamali rispettivamente sugli oggetti corrispondenti.

Flusso di lavoro di base del sistema di collisione: carica la scena → abilita la collisione → rilevamento delle collisioni

Flusso di lavoro di base del sistema di collisione

Implementazione della collisione dell'umano digitale

Poiché il sistema di collisione dell'SDK non agisce sul Rigidbody di Unity, la collisione per gli umani digitali (personaggi) deve essere guidata dai metodi di rilevamento. Esistono tre approcci comuni:

  • Rilevamento a doppio raggio: usa RaycastMesh() per emettere un raggio verso il basso e uno in avanti, e giudica se il personaggio può camminare in base ai risultati restituiti dai raggi (sonda il terreno verso il basso, sonda gli ostacoli in avanti).
  • Rilevamento a capsula: usa IntersectsCapsule() per rilevare se la capsula in cui si trova l'umano digitale interseca la mesh di collisione, e giudica se può camminare. La versione con overload restituisce in _delta l'offset del prossimo punto raggiungibile in sicurezza.
  • Rilevamento a sfera: usa IntersectsSphere() per rilevare se la sfera in cui si trova l'umano digitale interseca la mesh di collisione, e giudica se può camminare. La versione con overload restituisce anch'essa in _delta l'offset di un punto raggiungibile in sicurezza.
Tre approcci di implementazione per la collisione dell'umano digitale: rilevamento a doppio raggio, a capsula e a sfera

Tre approcci di implementazione per la collisione dell'umano digitale

Scelta tra RaycastMesh e Raycast

L'SDK fornisce due tipi di metodi di rilevamento a raggio con scopi diversi:

MetodoObiettivo di rilevamentoPrecisioneVelocitàScenario applicabile
RaycastMesh()Mesh di collisione (dati Collider)Relativamente bassaVeloceCollisione dell'umano digitale, rilevamento per fotogramma
Raycast()Primitive gaussiane (non si basa sulla mesh di collisione)Relativamente altaLentaApplicazioni di tipo misurazione

Raycast() esegue il rilevamento a raggio direttamente sulle primitive gaussiane, con precisione maggiore ma velocità minore, ed è sconsigliato per le chiamate per fotogramma, quindi non è adatto alla collisione dell'umano digitale, ma solo per usi di tipo misurazione. Per la collisione dell'umano digitale, preferisci RaycastMesh(), che si basa sulla mesh di collisione.

API correlate

Tra i metodi relativi alla collisione di seguito, SetColliderEnable() è su Renderer, mentre i restanti metodi di rilevamento sono su LCCManager. Tutti i metodi di rilevamento sono disponibili solo dopo che la scena ha terminato il caricamento e dopo che SetColliderEnable(true) è stato chiamato con successo.

SetColliderEnable

// Valore restituito: bool → true=impostato con successo, false=i dati non contengono alcun collider o l'istanza non è attiva
public bool SetColliderEnable(bool _enable)

Attiva/disattiva la funzionalità del collider. Dopo l'abilitazione, IntersectsSphere / IntersectsCapsule / RaycastMesh diventano disponibili.

ParametroTipoDescrizione
_enableboolIndica se abilitare il collider

Esempio di utilizzo:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("I dati non contengono alcun collider");

Descrizione:

  • I dati devono contenere dati di collisione (Mesh), altrimenti restituisce false.
  • Richiede che il Renderer sia in uno stato attivo.

RaycastMesh (coordinate schermo)

// Valore restituito: bool → true=impatto
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Emette un raggio dalle coordinate schermo per rilevare la mesh di collisione. Usa i dati Collider per il rilevamento, più veloce di Raycast ma con precisione minore.

ParametroTipoDescrizione
mousePosVector3Coordinate schermo
_finalResultout HitResultRisultato dell'impatto
_disatncefloatDistanza massima di rilevamento, predefinita 70.0

Esempio di utilizzo:

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

Descrizione:

  • Richiede che la collisione sia stata abilitata con successo prima.
  • Richiede di chiamare prima SetColliderEnable(true).

RaycastMesh (Ray + Bounds)

// Valore restituito: bool → true=impatto
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Usa un Ray personalizzato per il rilevamento della mesh di collisione e restituisce anche le informazioni del box di delimitazione del nodo colpito.

ParametroTipoDescrizione
rayRayIl raggio
resultout HitResultRisultato dell'impatto
hitBoundsout BoundsBox di delimitazione del nodo colpito (box di delimitazione del nodo LOD colpito)
maxDistfloatDistanza massima di rilevamento, predefinita 70.0

Esempio di utilizzo:

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

Descrizione:

  • Richiede che la collisione sia stata abilitata con successo prima.
  • Questo metodo è comunemente usato per il rilevamento a doppio raggio (verso il basso, in avanti) per giudicare se un umano digitale può camminare.

IntersectsSphere

// Valore restituito: bool → true=intersezione
public bool IntersectsSphere(Sphere sphere)

// Valore restituito: bool → true=intersezione
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Rileva se una sfera interseca la mesh di collisione. Il secondo overload restituisce inoltre il vettore di penetrazione delta (direzione e distanza di espulsione), che può essere usato per calcolare il prossimo punto raggiungibile in sicurezza.

ParametroTipoDescrizione
sphereSphereLa sfera da rilevare
deltaout Vector3Vettore di penetrazione (direzione e distanza di espulsione)

Esempio di utilizzo:

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

Descrizione:

  • Richiede che la collisione sia stata abilitata con successo prima.
  • Richiede di chiamare prima SetColliderEnable(true).
  • Itera su tutti i Renderer attivi.

IntersectsCapsule

// Valore restituito: bool → true=intersezione
public bool IntersectsCapsule(Capsule capsule)

// Valore restituito: bool → true=intersezione
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Rileva se una capsula interseca la mesh di collisione. Comunemente usato per il rilevamento delle collisioni del character controller. Il secondo overload restituisce il vettore di penetrazione delta, che può essere usato come offset verso il prossimo punto raggiungibile in sicurezza per un umano digitale.

ParametroTipoDescrizione
capsuleCapsuleLa capsula da rilevare
deltaout Vector3Vettore di penetrazione

Esempio di utilizzo:

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

Descrizione:

  • Richiede che i dati contengano nodi di collisione.
  • Richiede di chiamare prima SetColliderEnable(true).
  • Adatto alla collisione dei personaggi in prima / terza persona.

Raycast

// Valore restituito: bool → true=impatto
public bool Raycast(Ray _ray, out HitResult _finalResult)

Usa un Ray personalizzato per eseguire il rilevamento a raggio sulle primitive gaussiane, iterando su tutti i Renderer attivi e restituendo l'impatto più vicino. Non si basa sulla mesh di collisione; precisione maggiore ma più lento.

ParametroTipoDescrizione
_rayRayIl raggio
_finalResultout HitResultRisultato dell'impatto

Esempio di utilizzo:

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

Descrizione:

  • Non si basa sulla mesh di collisione, non necessita di SetColliderEnable.
  • Precisione maggiore ma più lento, sconsigliato per le chiamate per fotogramma, adatto alle applicazioni di tipo misurazione, non adatto alla collisione dell'umano digitale.

HitResult

I risultati dell'impatto dei metodi di rilevamento sopra vengono restituiti tramite la struct HitResult:

public struct HitResult {
    public bool isHit;             // Se ha colpito
    public float distance;         // Distanza
    public Vector3 hitPos;         // Coordinate mondo del punto colpito (il nome del campo è hitPos, non position)
    public Vector3 normal;         // Normale del punto colpito
    public float hitAlpha;         // Alfa dell'ellissoide colpito
    public float dist2Origin;      // Distanza dall'origine del raggio
    public float scale;            // Scala dell'ellissoide
}

Nota:

Il nome del campo delle coordinate mondo del punto colpito è hitPos, non position; accedi tramite il nome effettivo del campo.