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

    • PortalCam P1

      • Productoverzicht
      • Basisbediening
      • De LCC Scan App gebruiken
      • Onderhoud en verzorging
      • Veelgestelde vragen
  • Lixel K-serie

    • Lixel K1

      • Productoverzicht
      • Basisbediening
      • Apparaat activeren en verbinden
      • Scanworkflow
      • Puntenwolkgegevens met absolute coördinaten verkrijgen
      • Kaartfusie
      • Suggesties voor routeplanning bij typische scènes
      • Voorzorgsmaatregelen
      • FAQ
    • Lixel K2

      • Productoverzicht
      • Basisbediening
      • Apparaat activeren en verbinden
      • Scanworkflow
      • Puntenwolkgegevens met absolute coördinaten verkrijgen
      • Kaartfusie
      • Suggesties voor routeplanning bij typische scènes
      • Voorzorgsmaatregelen
      • FAQ
  • Lixel L-serie

    • Lixel L2 Pro

      • Productoverzicht
      • Basisbediening
      • Apparaatactivering en -verbinding
      • Scanworkflow
      • Puntenwolkgegevens met absolute coördinaten opnemen
      • Meetpunt
      • Appendix
      • FAQ
    • Lixel L3

      • Productoverzicht
      • Basisfuncties van het apparaat
      • Apparaatactivering en -verbinding
      • Gegevensopname
      • Absolute coördinaten opnemen
      • Appendix
  • Accessoires

    • Stick Light

      • Installatiegids
      • Basisbediening
      • FAQ
  • Lixel Studio

    • Versie en copyright
    • Installatie en activering
    • Software-interface
    • Bestandsbewerkingen
    • Projectverwerking
    • Gereedschappen
    • 2D-tekenen
    • Toepassingen
    • Instellingen
    • Apparaatverbinding
  • 07-plugin-sdk

    • Unity

      • LCC Unity SDK Introductie
      • Technische functies
      • Vereisten voor de ontwikkelomgeving
      • Snelstartgids voor pc
      • Optimalisatiegids voor projectinstellingen
      • Ontwikkelgids voor Pico 4 Ultra
      • Pc-streaminggids voor Pico 4 Ultra
      • Ontwikkelgids voor Quest 3
      • Pc-streaminggids voor Quest 3
      • Ontwikkelgids voor OpenXR
      • Business Streaming-gids voor Pico 4 Ultra
      • Woordenlijst
      • Veelgestelde vragen
      • Contact opnemen
      • Ontwikkelingshandleiding voor functies

        • Ontwikkelgids voor gemengde rendering van meerdere scènes
        • Ontwikkelgids voor het ontvangen van schaduwen
        • Ontwikkelgids voor realtime belichting
        • Ontwikkelgids voor multi-camera rendering
        • Ontwikkelgids voor het renderen van afbeeldingen met hoge resolutie
        • Ontwikkelgids voor compatibiliteit van de gegevensformaten LCC en LCC2
        • Ontwikkelgids voor laadeffecten
        • Ontwikkelgids voor het schakelen tussen Mip-renderingmodi
        • Ontwikkelgids voor rand- en hoeksnapping
        • Ontwikkelgids voor geprojecteerde decal
        • Ontwikkelgids voor video-geprojecteerde decal
        • Ontwikkelgids voor markeren
        • Ontwikkelgids voor realtime knippen
        • Ontwikkelgids voor kleuraanpassing
        • Ontwikkelgids voor het ophalen van scène-Meshgegevens
        • Ontwikkelgids voor de Editor-modus
        • Configuratiegids voor renderprestatieparameters
        • Ontwikkelgids voor het samen verpakken van de applicatie en de gegevens
        • Ontwikkelgids voor het botsingssysteem
        • Gids voor macOS-ontwikkelingsmachtigingsproblemen
        • Ontwikkelgids voor compilatie en verpakking voor iOS-apparaten
      • API-referentie

        • LCCManager
        • Renderer
        • Gegevenstypen
      • Wijzigingslogboek

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

Ontwikkelgids voor het botsingssysteem

De LCC Unity SDK heeft een ingebouwd botsingssysteem, gericht op het oplossen van de versnelling van colliderconstructie en botsingsdetectie — dat wil zeggen het botsingsprestatieprobleem. Het Collider-systeem van Unity kan geen realtime detectie in zeer grote scènes aan.

De LCC Unity SDK gebruikt zijn eigen ingebouwde botsingssysteem en vertrouwt niet langer op de MeshCollider-component en de gerelateerde mogelijkheden van Unity, zodat het niet rechtstreeks op GameObjects in een Unity-scène kan inwerken. De officiële LCC-gegevensindeling die door XGrids (LCC Studio) wordt gegenereerd, genereert tijdens de reconstructie tegelijkertijd Mesh-gegevens die voor botsing worden gebruikt, en de SDK gebruikt deze botsingsgegevens om snel en efficiënt scènebotsing op te bouwen. Omdat het een zelfgebouwd botsingssysteem is, moet je voor het gebruik van de botsingsfunctie de bijbehorende methoden aanroepen die door de SDK worden aangeboden.

Opmerking:

Het ingebouwde botsingssysteem van de SDK is niet compatibel met het Collider-systeem van Unity en kan niet rechtstreeks inwerken op Rigidbody-objecten in Unity. Botsing voor personages zoals digitale mensen moet worden aangestuurd door de detectiemethoden van de SDK (zie "Implementatie van botsing van digitale mensen" hieronder).

Voor vaste scènes kun je ook de Mesh-gegevens extraheren en deze vooraf in een NavMesh bakken, wat compatibel kan zijn met het Collider-systeem van Unity; zie de NavMesh-gids voor meer informatie.

Gegevensvereisten

De voorwaarde voor het functioneren van botsingsdetectie is dat de scène over de bijbehorende botsingsgegevens beschikt. Gegevens die in eerdere versies zijn gereconstrueerd, bevatten mogelijk geen botsingsgegevens; in dat geval retourneert het aanroepen van SetColliderEnable(true) false en zijn alle daaropvolgende detectiemethoden niet beschikbaar.

Controleer daarom na het inschakelen van botsing altijd de retourwaarde:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("De huidige gegevens bevatten geen collider, botsingsdetectie kan niet worden ingeschakeld");
}

Basisgebruiksworkflow

De basisworkflow voor de botsingsfunctie bestaat uit drie stappen:

  1. Laad de scènegegevens via de Load()-methode.
  2. Schakel botsing in via SetColliderEnable(true) in de laadvoltooiingscallback.
  3. Voer botsingsdetectie uit via de verschillende detectiemethoden (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Laad de scène
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Schakel botsing in nadat het laden is voltooid
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

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

    // 3. Voer elke frame botsingsdetectie uit
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Opmerking:

SetColliderEnable() is een methode van Renderer, terwijl de detectiemethoden (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) op LCCManager staan. Roep ze respectievelijk op de bijbehorende objecten aan.

Basisworkflow van het botsingssysteem: scène laden → botsing inschakelen → botsingsdetectie

Basisworkflow van het botsingssysteem

Implementatie van botsing van digitale mensen

Omdat het botsingssysteem van de SDK niet inwerkt op de Rigidbody van Unity, moet botsing voor digitale mensen (personages) worden aangestuurd door de detectiemethoden. Er zijn drie veelvoorkomende benaderingen:

  • Detectie met dubbele stralen: gebruik RaycastMesh() om één straal naar beneden en één naar voren te schieten en beoordeel op basis van de retourresultaten van de stralen of het personage kan lopen (peil de grond naar beneden, peil obstakels naar voren).
  • Capsuledetectie: gebruik IntersectsCapsule() om te detecteren of de capsule waarin de digitale mens zich bevindt de botsings-Mesh snijdt en beoordeel of deze kan lopen. De _delta van de overbelaste versie retourneert de verschuiving van het volgende veilig bereikbare punt.
  • Boldetectie: gebruik IntersectsSphere() om te detecteren of de bol waarin de digitale mens zich bevindt de botsings-Mesh snijdt en beoordeel of deze kan lopen. De _delta van de overbelaste versie retourneert eveneens de verschuiving van een veilig bereikbaar punt.
Drie implementatiebenaderingen voor botsing van digitale mensen: detectie met dubbele stralen, capsule en bol

Drie implementatiebenaderingen voor botsing van digitale mensen

Kiezen tussen RaycastMesh en Raycast

De SDK biedt twee soorten straaldetectiemethoden met verschillende doeleinden:

MethodeDetectiedoelPrecisieSnelheidToepasselijk scenario
RaycastMesh()Botsings-Mesh (Collider-gegevens)Relatief laagSnelBotsing van digitale mensen, detectie per frame
Raycast()Gaussiaanse primitieven (vertrouwt niet op de botsings-Mesh)Relatief hoogLangzaamMeettoepassingen

Raycast() voert straaldetectie rechtstreeks op Gaussiaanse primitieven uit, met een hogere precisie maar een lagere snelheid, en wordt niet aanbevolen voor aanroepen per frame, dus het is niet geschikt voor botsing van digitale mensen, alleen voor meettoepassingen. Geef voor botsing van digitale mensen de voorkeur aan RaycastMesh(), dat op de botsings-Mesh vertrouwt.

Gerelateerde API's

Van de onderstaande botsingsgerelateerde methoden staat SetColliderEnable() op Renderer, terwijl de overige detectiemethoden op LCCManager staan. Alle detectiemethoden zijn pas beschikbaar nadat de scène klaar is met laden en SetColliderEnable(true) met succes is aangeroepen.

SetColliderEnable

// Retourwaarde: bool → true=succesvol ingesteld, false=de gegevens bevatten geen collider of de instantie is niet actief
public bool SetColliderEnable(bool _enable)

Schakelt de colliderfunctie in of uit. Na het inschakelen worden IntersectsSphere / IntersectsCapsule / RaycastMesh beschikbaar.

ParameterTypeBeschrijving
_enableboolOf de collider moet worden ingeschakeld

Gebruiksvoorbeeld:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("De gegevens bevatten geen collider");

Beschrijving:

  • De gegevens moeten botsingsgegevens (Mesh) bevatten, anders wordt false geretourneerd.
  • Vereist dat de Renderer zich in een actieve staat bevindt.

RaycastMesh (schermcoördinaten)

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

Schiet een straal vanuit schermcoördinaten om de botsings-Mesh te detecteren. Maakt gebruik van Collider-gegevens voor detectie, sneller dan Raycast maar met een lagere precisie.

ParameterTypeBeschrijving
mousePosVector3Schermcoördinaten
_finalResultout HitResultHitresultaat
_disatncefloatMaximale detectieafstand, standaard 70.0

Gebruiksvoorbeeld:

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

Beschrijving:

  • Vereist dat botsing eerst met succes is ingeschakeld.
  • Vereist dat SetColliderEnable(true) eerst wordt aangeroepen.

RaycastMesh (Ray + Bounds)

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

Gebruikt een aangepaste Ray voor detectie van de botsings-Mesh en retourneert ook de begrenzingskaderinformatie van het geraakte knooppunt.

ParameterTypeBeschrijving
rayRayDe straal
resultout HitResultHitresultaat
hitBoundsout BoundsBegrenzingskader van het geraakte knooppunt (begrenzingskader van het geraakte LOD-knooppunt)
maxDistfloatMaximale detectieafstand, standaard 70.0

Gebruiksvoorbeeld:

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

Beschrijving:

  • Vereist dat botsing eerst met succes is ingeschakeld.
  • Deze methode wordt vaak gebruikt voor detectie met dubbele stralen (naar beneden, naar voren) om te beoordelen of een digitale mens kan lopen.

IntersectsSphere

// Retourwaarde: bool → true=snijdt
public bool IntersectsSphere(Sphere sphere)

// Retourwaarde: bool → true=snijdt
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Detecteert of een bol de botsings-Mesh snijdt. De tweede overbelasting retourneert bovendien de penetratievector delta (uitduwrichting en -afstand), die kan worden gebruikt om het volgende veilig bereikbare punt te berekenen.

ParameterTypeBeschrijving
sphereSphereDe te detecteren bol
deltaout Vector3Penetratievector (uitduwrichting en -afstand)

Gebruiksvoorbeeld:

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

Beschrijving:

  • Vereist dat botsing eerst met succes is ingeschakeld.
  • Vereist dat SetColliderEnable(true) eerst wordt aangeroepen.
  • Itereert over alle actieve Renderers.

IntersectsCapsule

// Retourwaarde: bool → true=snijdt
public bool IntersectsCapsule(Capsule capsule)

// Retourwaarde: bool → true=snijdt
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Detecteert of een capsule de botsings-Mesh snijdt. Wordt vaak gebruikt voor botsingsdetectie van de character controller. De tweede overbelasting retourneert de penetratievector delta, die kan worden gebruikt als verschuiving naar het volgende veilig bereikbare punt voor een digitale mens.

ParameterTypeBeschrijving
capsuleCapsuleDe te detecteren capsule
deltaout Vector3Penetratievector

Gebruiksvoorbeeld:

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

Beschrijving:

  • Vereist dat de gegevens botsingsknooppunten bevatten.
  • Vereist dat SetColliderEnable(true) eerst wordt aangeroepen.
  • Geschikt voor botsing van first-person / third-person personages.

Raycast

// Retourwaarde: bool → true=geraakt
public bool Raycast(Ray _ray, out HitResult _finalResult)

Gebruikt een aangepaste Ray om straaldetectie op Gaussiaanse primitieven uit te voeren, waarbij alle actieve Renderers worden doorlopen en de dichtstbijzijnde treffer wordt geretourneerd. Vertrouwt niet op de botsings-Mesh; hogere precisie maar langzamer.

ParameterTypeBeschrijving
_rayRayDe straal
_finalResultout HitResultHitresultaat

Gebruiksvoorbeeld:

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

Beschrijving:

  • Vertrouwt niet op de botsings-Mesh, geen SetColliderEnable nodig.
  • Hogere precisie maar langzamer, niet aanbevolen voor aanroepen per frame, geschikt voor meettoepassingen, niet geschikt voor botsing van digitale mensen.

HitResult

De hitresultaten van de bovenstaande detectiemethoden worden geretourneerd via de HitResult-struct:

public struct HitResult {
    public bool isHit;             // Of er een treffer is geweest
    public float distance;         // Afstand
    public Vector3 hitPos;         // Wereldcoördinaten van het trefpunt (de veldnaam is hitPos, niet position)
    public Vector3 normal;         // Treffernormaal
    public float hitAlpha;         // Alpha van de geraakte ellipsoïde
    public float dist2Origin;      // Afstand tot de straaloorsprong
    public float scale;            // Ellipsoïdeschaal
}

Opmerking:

De veldnaam van de wereldcoördinaten van het trefpunt is hitPos, niet position; benader deze via de daadwerkelijke veldnaam.