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

    • PortalCam P1

      • Produktübersicht
      • Grundlegende Bedienung
      • LCC Scan App verwenden
      • Wartung und Pflege
      • FAQ
  • Lixel K-Serie

    • Lixel K1

      • Produktübersicht
      • Grundlegende Bedienung
      • Geräteaktivierung und -verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Kartenfusion
      • Empfehlungen zur Routenplanung für typische Szenen
      • Hinweise
      • FAQ
    • Lixel K2

      • Produktübersicht
      • Grundlegende Bedienung
      • Aktivierung und Verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Kartenfusion
      • Empfehlungen zur Routenplanung für typische Szenen
      • Hinweise
      • FAQ
  • Lixel L-Serie

    • Lixel L2 Pro

      • Produktübersicht
      • Grundlegende Bedienung
      • Geräteaktivierung und -verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Messpunkt
      • Anhang
      • FAQ
    • Lixel L3

      • Produktübersicht
      • Grundlegende Bedienung
      • Aktivierung und Verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Anhang
  • Zubehör

    • Stick Light

      • Installationsanleitung
      • Grundlegende Bedienung
      • Häufige Fragen
  • Lixel Studio

    • Version und Copyright
    • Installation und Aktivierung
    • Softwareoberfläche
    • Dateioperationen
    • Projektverarbeitung
    • Werkzeuge
    • 2D-Zeichnung
    • Anwendungen
    • Einstellungen
    • Geräteverbindung
    • Häufige Fragen
  • Lixel CyberColor

    • LCC Studio

      • Erste Schritte
      • Version und Updates
      • Download und Installation
      • Oberfläche und Navigation
      • Vor der Rekonstruktion
      • Modellrekonstruktion
      • Einzelmodell-Rekonstruktion
      • Kartenfusion
      • Boden-Luft-Fusion
      • Luftbild-Rekonstruktion
      • Meine Modelle
      • Weitere Funktionen
      • Einstellungen und Konto
      • Converter
      • Videorekonstruktion
      • Häufige Fragen / FAQ
    • LCC Scene Editor

      • Version und Updates
      • Konto und Anmeldung
      • Produktübersicht und Startseite
      • Editor-Oberfläche
      • Navigationsmodi
      • Datei
      • Einstellungen
      • Bearbeiten
      • Fenster
      • Globale Symbolleiste
      • Assets und Eigenschaften
      • Linke Symbolleiste
      • Ansichtspunkte
      • Portal
      • Skybox
      • Markierungen
      • Messung
      • Flythrough
      • Szenenbericht
      • 3D-Layout
      • Minikarte
      • Vorschaumodus (Viewer)
      • Hilfe
      • Häufige Fragen (FAQ)
      • Spawn-Point
    • LCC Model Editor

      • Version und Updates
      • Benutzerhandbuch
      • Übersicht und Oberfläche
      • Dateioperationen
      • Selektoren
      • Modelle bearbeiten
      • Messung
      • Farbkorrektur
      • Asset-Verwaltung
      • Einstellungen und Hilfe
      • Häufige Fragen
    • Capture Guide

      • Überblick
      • Überblick über die Aufnahmegeräte
      • Allgemeine Aufnahmeprinzipien
      • Aufnahme von Innenszenen
      • Aufnahme von Außenszenen
      • Großflächige Aufnahme (Map Fusion)
      • Aerial-Ground Map Fusion – Aufnahme
      • Objektaufnahme
      • Personenaufnahme
      • Video-Rekonstruktionsaufnahme
      • HD Enhancement
      • Kontrollpunkte (Lixel P1)
      • FAQ und Fehlerbehebung
    • Best Practices

      • Zusammenführen mehrerer großer 3DGS-Modelle
    • Versionsgeschichte
  • Plugin & SDK

    • Unreal

      • Einführung
      • Schnellstart - Windows
      • Schnellstart - Linux
      • Schnellstart - Quest3
      • Editionen und Lizenzierung
      • Rendering
      • Tiled-Rasterisierung (experimentell)
      • Bildeinstellungen
      • Normalen und Beleuchtung
      • Szenenbearbeitung
      • Leistungsparameter
      • Leitfaden zur Leistung
      • Integration von Drittanbieter- und Engine-Plugins
      • Proxy Mesh
      • Ladeanimation
      • Kollision
      • Unterstützung des Navigation System
      • Unterstützung von Single Layer Water
      • Lokalisierung
      • FAQ
      • Fehlerbehebung
      • Logs und Diagnose
      • Kontakt
      • Bewährte Vorgehensweisen

        • 3DGS mit einem LixelStudio-Mesh neu beleuchten
      • API-Referenz

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG- / SPZ- / PLY-Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Änderungsprotokoll

        • 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

      • Einführung in das Unity SDK
      • Technische Funktionen
      • Anforderungen an die Entwicklungsumgebung
      • PC-Schnellstartanleitung
      • Leitfaden zur Optimierung der Projekteinstellungen
      • Pico 4 Ultra-Entwicklungsanleitung
      • Pico 4 Ultra-PC-Streaming-Anleitung
      • Quest 3-Entwicklungsanleitung
      • Quest 3-PC-Streaming-Anleitung
      • OpenXR-Entwicklungsanleitung
      • Pico 4 Ultra-Business-Streaming-Anleitung
      • Glossar
      • FAQ
      • Kontakt
      • Funktionsentwicklungsleitfaden

        • Entwicklungsanleitung für gemischtes Multi-Szenen-Rendering
        • Entwicklungsanleitung für Schattenempfang
        • Entwicklungsanleitung für Echtzeitbeleuchtung
        • Entwicklungsanleitung für Multi-Kamera-Rendering
        • Entwicklungsanleitung für hochauflösendes Bild-Rendering
        • Entwicklungsanleitung zur Kompatibilität der Datenformate LCC und LCC2
        • Entwicklungsanleitung für Ladeeffekte
        • Entwicklungsanleitung für das Umschalten des Mip-Rendering-Modus
        • Entwicklungsanleitung für Kanten- und Eckensnapping
        • Entwicklungsanleitung für projizierte Decals
        • Entwicklungsanleitung für projizierte Video-Decals
        • Entwicklungsanleitung für Hervorhebung
        • Entwicklungsanleitung für Echtzeit-Clipping
        • Entwicklungsanleitung für Farbanpassung
        • Entwicklungsanleitung für das Abrufen von Szenen-Mesh-Daten
        • Entwicklungsanleitung für den Editor-Modus
        • Konfigurationsanleitung für Render-Leistungsparameter
        • Entwicklungsanleitung zum gemeinsamen Paketieren von Anwendung und Daten
        • Entwicklungsanleitung für das Kollisionssystem
        • Anleitung zu macOS-Berechtigungsproblemen in der Entwicklung
        • Entwicklungsanleitung für Kompilierung und Paketierung auf iOS-Geräten
      • API-Referenz

        • LCCManager
        • Renderer
        • Datentypen
      • Changelog

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

      • Einführung
      • Leitfaden zur Rendering-Leistungsoptimierung
      • Grafikkonfiguration
      • Häufige Fragen
      • API-Referenz

        • 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
      • Änderungsprotokoll

        • 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

Entwicklungsanleitung für das Kollisionssystem

Das LCC Unity SDK verfügt über ein eingebautes Kollisionssystem, das sich darauf konzentriert, die Beschleunigung der Collider-Konstruktion und der Kollisionserkennung zu lösen — also das Kollisionsleistungsproblem. Das Collider-System von Unity kann Echtzeit-Erkennung in sehr großen Szenen nicht bewältigen.

Das LCC Unity SDK verwendet sein eigenes eingebautes Kollisionssystem und stützt sich nicht mehr auf die Komponente MeshCollider von Unity und zugehörige Fähigkeiten, daher kann es nicht direkt auf GameObjects in einer Unity-Szene einwirken. Das offizielle LCC-Datenformat, das von XGrids (LCC Studio) erzeugt wird, erzeugt während der Rekonstruktion gleichzeitig Mesh-Daten, die für Kollisionen verwendet werden, und das SDK nutzt diese Kollisionsdaten, um die Szenenkollision schnell und effizient aufzubauen. Da es sich um ein selbstgebautes Kollisionssystem handelt, erfordert die Verwendung der Kollisionsfunktion den Aufruf der entsprechenden, vom SDK bereitgestellten Methoden.

Hinweis:

Das eingebaute Kollisionssystem des SDK ist mit dem Collider-System von Unity inkompatibel und kann nicht direkt auf Rigidbody-Objekte in Unity einwirken. Die Kollision für Figuren wie digitale Menschen muss durch die Erkennungsmethoden des SDK angetrieben werden (siehe „Implementierung der Kollision digitaler Menschen“ unten).

Für feste Szenen können Sie die Mesh-Daten auch extrahieren und im Voraus in ein NavMesh backen, das mit dem Collider-System von Unity kompatibel ist; Einzelheiten finden Sie in der NavMesh-Anleitung.

Datenvoraussetzungen

Die Voraussetzung für das Funktionieren der Kollisionserkennung ist, dass die Szene über entsprechende Kollisionsdaten verfügt. In früheren Versionen rekonstruierte Daten enthalten möglicherweise keine Kollisionsdaten; in diesem Fall gibt der Aufruf von SetColliderEnable(true) false zurück, und alle nachfolgenden Erkennungsmethoden sind nicht verfügbar.

Überprüfen Sie daher nach dem Aktivieren der Kollision unbedingt den Rückgabewert:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("Die aktuellen Daten enthalten keinen Collider, die Kollisionserkennung kann nicht aktiviert werden");
}

Grundlegender Verwendungsablauf

Der grundlegende Ablauf der Kollisionsfunktion besteht aus drei Schritten:

  1. Die Szenendaten über die Methode Load() laden.
  2. Im Abschluss-Callback des Ladens die Kollision über SetColliderEnable(true) aktivieren.
  3. Die Kollisionserkennung über die verschiedenen Erkennungsmethoden (RaycastMesh / IntersectsSphere / IntersectsCapsule) ausführen.
// 1. Die Szene laden
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Kollision nach Abschluss des Ladens aktivieren
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

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

    // 3. Kollisionserkennung in jedem Frame ausführen
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Hinweis:

SetColliderEnable() ist eine Methode von Renderer, während sich die Erkennungsmethoden (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) auf LCCManager befinden. Rufen Sie sie jeweils auf den entsprechenden Objekten auf.

Grundlegender Ablauf des Kollisionssystems: Szene laden → Kollision aktivieren → Kollisionserkennung

Grundlegender Ablauf des Kollisionssystems

Implementierung der Kollision digitaler Menschen

Da das Kollisionssystem des SDK nicht auf das Rigidbody von Unity einwirkt, muss die Kollision für digitale Menschen (Figuren) durch die Erkennungsmethoden angetrieben werden. Es gibt drei gängige Ansätze:

  • Dual-Ray-Erkennung: RaycastMesh() verwenden, um einen Strahl nach unten und einen nach vorn abzufeuern, und anhand der Strahlergebnisse beurteilen, ob die Figur laufen kann (nach unten den Boden sondieren, nach vorn Hindernisse sondieren).
  • Kapsel-Erkennung: IntersectsCapsule() verwenden, um zu erkennen, ob die Kapsel, in der sich der digitale Mensch befindet, das Kollisions-Mesh schneidet, und beurteilen, ob er laufen kann. Die _delta der überladenen Version gibt den Versatz des nächsten sicher erreichbaren Punkts zurück.
  • Kugel-Erkennung: IntersectsSphere() verwenden, um zu erkennen, ob die Kugel, in der sich der digitale Mensch befindet, das Kollisions-Mesh schneidet, und beurteilen, ob er laufen kann. Die _delta der überladenen Version gibt ebenfalls den Versatz eines sicher erreichbaren Punkts zurück.
Drei Implementierungsansätze für die Kollision digitaler Menschen: Dual-Ray-, Kapsel- und Kugel-Erkennung

Drei Implementierungsansätze für die Kollision digitaler Menschen

Wahl zwischen RaycastMesh und Raycast

Das SDK stellt zwei Arten von Strahlerkennungsmethoden mit unterschiedlichen Zwecken bereit:

MethodeErkennungszielPräzisionGeschwindigkeitGeeignetes Szenario
RaycastMesh()Kollisions-Mesh (Collider-Daten)Relativ niedrigSchnellKollision digitaler Menschen, Erkennung pro Frame
Raycast()Gauß-Primitive (stützt sich nicht auf das Kollisions-Mesh)Relativ hochLangsamMessungsartige Anwendungen

Raycast() führt die Strahlerkennung direkt auf Gauß-Primitiven aus, mit höherer Präzision, aber langsamerer Geschwindigkeit, und wird nicht für Aufrufe pro Frame empfohlen, daher ist es nicht für die Kollision digitaler Menschen geeignet, sondern nur für messungsartige Verwendungen. Für die Kollision digitaler Menschen bevorzugen Sie RaycastMesh(), das sich auf das Kollisions-Mesh stützt.

Zugehörige APIs

Bei den folgenden kollisionsbezogenen Methoden befindet sich SetColliderEnable() auf Renderer, während sich die übrigen Erkennungsmethoden auf LCCManager befinden. Alle Erkennungsmethoden sind erst verfügbar, nachdem die Szene das Laden abgeschlossen hat und SetColliderEnable(true) erfolgreich aufgerufen wurde.

SetColliderEnable

// Rückgabewert: bool → true=erfolgreich gesetzt, false=Daten enthalten keinen Collider oder Instanz ist nicht aktiv
public bool SetColliderEnable(bool _enable)

Schaltet die Collider-Funktion um. Nach dem Aktivieren werden IntersectsSphere / IntersectsCapsule / RaycastMesh verfügbar.

ParameterTypBeschreibung
_enableboolOb der Collider aktiviert werden soll

Verwendungsbeispiel:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Daten enthalten keinen Collider");

Beschreibung:

  • Die Daten müssen Kollisions- (Mesh-) Daten enthalten, andernfalls wird false zurückgegeben.
  • Erfordert, dass der Renderer sich in einem aktiven Zustand befindet.

RaycastMesh (Bildschirmkoordinaten)

// Rückgabewert: bool → true=Treffer
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Feuert einen Strahl aus Bildschirmkoordinaten ab, um das Kollisions-Mesh zu erkennen. Verwendet Collider-Daten für die Erkennung, schneller als Raycast, aber mit niedrigerer Präzision.

ParameterTypBeschreibung
mousePosVector3Bildschirmkoordinaten
_finalResultout HitResultTrefferergebnis
_disatncefloatMaximale Erkennungsdistanz, Standard 70.0

Verwendungsbeispiel:

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

Beschreibung:

  • Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
  • Erfordert, dass zuerst SetColliderEnable(true) aufgerufen wurde.

RaycastMesh (Ray + Bounds)

// Rückgabewert: bool → true=Treffer
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Verwendet einen benutzerdefinierten Ray für die Kollisions-Mesh-Erkennung und gibt außerdem die Bounding-Box-Informationen des getroffenen Knotens zurück.

ParameterTypBeschreibung
rayRayDer Strahl
resultout HitResultTrefferergebnis
hitBoundsout BoundsBounding Box des getroffenen Knotens (Bounding Box des getroffenen LOD-Knotens)
maxDistfloatMaximale Erkennungsdistanz, Standard 70.0

Verwendungsbeispiel:

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

Beschreibung:

  • Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
  • Diese Methode wird üblicherweise für die Dual-Ray-Erkennung (nach unten, nach vorn) verwendet, um zu beurteilen, ob ein digitaler Mensch laufen kann.

IntersectsSphere

// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsSphere(Sphere sphere)

// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Erkennt, ob eine Kugel das Kollisions-Mesh schneidet. Die zweite Überladung gibt zusätzlich den Durchdringungsvektor delta (Ausschieberichtung und -distanz) zurück, der verwendet werden kann, um den nächsten sicher erreichbaren Punkt zu berechnen.

ParameterTypBeschreibung
sphereSphereDie zu erkennende Kugel
deltaout Vector3Durchdringungsvektor (Ausschieberichtung und -distanz)

Verwendungsbeispiel:

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

Beschreibung:

  • Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
  • Erfordert, dass zuerst SetColliderEnable(true) aufgerufen wurde.
  • Iteriert über alle aktiven Renderer.

IntersectsCapsule

// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsCapsule(Capsule capsule)

// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Erkennt, ob eine Kapsel das Kollisions-Mesh schneidet. Wird üblicherweise für die Kollisionserkennung von Character Controllern verwendet. Die zweite Überladung gibt den Durchdringungsvektor delta zurück, der als Versatz zum nächsten sicher erreichbaren Punkt für einen digitalen Menschen verwendet werden kann.

ParameterTypBeschreibung
capsuleCapsuleDie zu erkennende Kapsel
deltaout Vector3Durchdringungsvektor

Verwendungsbeispiel:

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

Beschreibung:

  • Erfordert, dass die Daten Kollisionsknoten enthalten.
  • Erfordert, dass zuerst SetColliderEnable(true) aufgerufen wurde.
  • Geeignet für die Kollision von Erst-Person-/Dritt-Person-Figuren.

Raycast

// Rückgabewert: bool → true=Treffer
public bool Raycast(Ray _ray, out HitResult _finalResult)

Verwendet einen benutzerdefinierten Ray, um eine Strahlerkennung auf Gauß-Primitiven auszuführen, iteriert über alle aktiven Renderer und gibt den nächsten Treffer zurück. Stützt sich nicht auf das Kollisions-Mesh; höhere Präzision, aber langsamer.

ParameterTypBeschreibung
_rayRayDer Strahl
_finalResultout HitResultTrefferergebnis

Verwendungsbeispiel:

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

Beschreibung:

  • Stützt sich nicht auf das Kollisions-Mesh, kein SetColliderEnable erforderlich.
  • Höhere Präzision, aber langsamer, nicht für Aufrufe pro Frame empfohlen, geeignet für messungsartige Anwendungen, nicht geeignet für die Kollision digitaler Menschen.

HitResult

Die Trefferergebnisse der obigen Erkennungsmethoden werden über die Struktur HitResult zurückgegeben:

public struct HitResult {
    public bool isHit;             // Ob ein Treffer aufgetreten ist
    public float distance;         // Distanz
    public Vector3 hitPos;         // Trefferpunkt in Weltkoordinaten (Feldname ist hitPos, nicht position)
    public Vector3 normal;         // Treffernormale
    public float hitAlpha;         // Alpha des getroffenen Ellipsoids
    public float dist2Origin;      // Distanz zum Strahlursprung
    public float scale;            // Ellipsoid-Skalierung
}

Hinweis:

Der Feldname der Trefferpunkt-Weltkoordinaten lautet hitPos, nicht position; greifen Sie über den tatsächlichen Feldnamen darauf zu.