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 zur Kompatibilität der Datenformate LCC und LCC2

Das Datenformat LCC2 bietet bessere Datenkomprimierung und LOD-Mechanismen. Das ursprüngliche LCC-Format wird schrittweise durch LCC2 ersetzt, und das ursprüngliche LCC SDK (v1.x) wird nach und nach nicht mehr gepflegt. Da sich das alte und das neue Datenformat stark unterscheiden, ist das neue LCC SDK (v2.x) nicht abwärtskompatibel mit dem LCC-Format. Die Datenkompatibilität kann auf die folgenden beiden Arten erreicht werden:

  1. Verwenden Sie den offiziellen Konverter (LccConverter) als exe/dll, um das LCC-Datenformat in LCC2 zu konvertieren und es dann im SDK zu verwenden;
  2. Implementieren Sie die Kompatibilität der Datenformate LCC und LCC2 auf Anwendungsebene.

Diese Anleitung beschreibt hauptsächlich den Ablauf und die Schritte der Implementierung der Datenformat-Kompatibilität auf Anwendungsebene, also das gleichzeitige Importieren zweier SDK-Versionen in dasselbe Unity-Projekt und das automatische Auswählen der entsprechenden Version für Rendering und Verarbeitung anhand des Datenformats.

Schritt 1: Unity-Version und Projekteinstellungen

Die Unity-Version und die Projekteinstellungen sind identisch mit der eigenständigen Verwendung des SDK; es ist keine zusätzliche Konfiguration erforderlich. Siehe PC-Schnellstartanleitung und Leitfaden zur Optimierung der Projekteinstellungen.

Schritt 2: Die beiden SDK-Versionen importieren

Importieren Sie SDK v1.4.8 und neuer (empfohlen wird v1.4.32) und SDK v2.0.1 und neuer über Unity UPM. Nach dem Import wird die Version v1.x als Legacy angezeigt. Die beiden SDK-Versionen können koexistieren, ohne sich gegenseitig zu beeinflussen.

Hinweis:

  • SDK v1.4.32 kann von GitHub heruntergeladen werden: https://github.com/xgrids/LCC-Unity-SDK/releases
  • Der Namespace von SDK v1.4.32 lautet LCCCore_Legacy, und seine Manager-Komponente ist LCCManager_Legacy; der Namespace von v2.x lautet LCCCore, und seine Manager-Komponente ist LCCManager.

Schritt 3: Die Szene konfigurieren

Erstellen Sie ein leeres Objekt in der Szene namens LCCController und hängen Sie sowohl die Komponente LCCManager_Legacy als auch die Komponente LCCManager daran an.

Die Komponenten LCCManager_Legacy und LCCManager an das Objekt LCCController anhängen

Sowohl die Komponente LCCManager_Legacy als auch die Komponente LCCManager an das Objekt LCCController anhängen

Hinweis:

Die Transform-Einstellungen des GameObject LCCController (Rotation.x = -90, Scale.x = -1) richten es am LCC-Daten-Koordinatensystem aus. Details zur Ausrichtung am Koordinatensystem finden Sie unter „LCC-Daten-Koordinatensystem“ in Einführung in das Unity SDK.

Schritt 4: Das MultiSDKController-Skript schreiben

Erstellen Sie ein neues C#-Skript namens MultiSDKController.cs mit folgendem Code:

using LCCCore;
using LCCCore_Legacy;
using System.IO;
using UnityEngine;

public class MultiSDKController : MonoBehaviour
{
    public LCCManager_Legacy m_managerLegacy;          // für LCC SDK v1.4.8 und älter
    public LCCManager m_manager;                       // für LCC SDK v2.0.0 und neuer
    public string m_FilePath;                          // LCC-Dateipfad
    private LCCCore_Legacy.Renderer m_rendererLegacy;  // für LCC SDK v1.4.8 und älter
    private LCCCore.Renderer m_renderer;               // für LCC SDK v2.0.0 und neuer
    private DataType m_dataType;                       // Datentyp, dient zur Bestimmung, welches SDK zu verwenden ist

    void Start()
    {
        string extension = Path.GetExtension(m_FilePath);
        if (extension == ".lcc")
        {
            m_manager.Enable = false; // Manager ab v2.0.0 deaktivieren
            m_dataType = DataType.LCC;
            m_rendererLegacy = m_managerLegacy.GetRender(this.transform);
            m_rendererLegacy.Load(m_FilePath, LCCCore_Legacy.PlatformType.PC, onLoadCallback);
        }
        else if (extension == ".lcc2")
        {
            m_managerLegacy.Enable = false; // Manager ab v1.4.8 und älter deaktivieren
            m_dataType = DataType.LCC2;
            m_renderer = m_manager.GetRender(this.transform);
            m_renderer.Load(m_FilePath, LCCCore.PlatformType.PC, onLoadCallback);
        }
    }

    private void onLoadCallback()
    {
        Debug.Log("Daten geladen !!!");
    }

    // Methodenaufruf-Beispiel: Anhand des Datentyps bestimmen, welcher SDK-Renderer bedient werden soll
    public void onRenderPointClick()
    {
        if (m_dataType == DataType.LCC)
            m_rendererLegacy.SwitchRenderMode(LCCCore_Legacy.RenderMode.PointCloud);
        else if (m_dataType == DataType.LCC2)
            m_renderer.SwitchRenderMode(LCCCore.RenderMode.PointCloud);
    }

    void OnDestroy()
    {
        if (m_dataType == DataType.LCC)
            m_rendererLegacy?.Dispose();
        else if (m_dataType == DataType.LCC2)
            m_renderer?.Dispose();
    }

    public enum DataType { LCC, LCC2 }
}

Hinweis:

  • Der Skriptdateiname muss mit dem Klassennamen übereinstimmen (MultiSDKController.cs entspricht class MultiSDKController), andernfalls kann es nicht an ein GameObject angehängt werden.
  • Die beiden Versionen besitzen unterschiedliche Namespaces (LCCCore und LCCCore_Legacy). Bei der Verwendung gleichnamiger Typen wie Renderer, PlatformType und RenderMode müssen Sie sie mit dem Namespace präfixieren, um sie zu unterscheiden.
  • Das Beispiel bestimmt das Datenformat anhand der Dateiendung (.lcc / .lcc2) und wählt die entsprechende SDK-Version aus.

Schritt 5: Das Skript anhängen und Eigenschaften festlegen

  1. Hängen Sie das Skript MultiSDKController.cs ebenfalls an das Objekt LCCController in der Szene.
  2. Ziehen Sie im Fenster Inspektor die Komponenten LCCManager und LCCManager_Legacy auf die entsprechenden Skript-Eigenschaften.
  3. Tragen Sie den LCC- / LCC2-Dateipfad in die Eigenschaft File Path des Skripts ein.
Das MultiSDKController-Skript anhängen und dessen Eigenschaften festlegen

Das MultiSDKController-Skript anhängen und dessen Eigenschaften im Inspektor festlegen

Wenn Sie den Code nun ausführen, wird anhand des LCC-Datenformats automatisch die entsprechende SDK-Version für das Rendering verwendet, wodurch die Datenformat-Kompatibilität erreicht wird.

Schlüsselschritte

Die Schlüsselschritte zur Implementierung der Kompatibilität der Datenformate LCC und LCC2 auf Anwendungsebene:

  1. Importieren Sie sowohl die SDK-Version v1.x (Legacy) als auch v2.x über UPM; die beiden können koexistieren.
  2. Hängen Sie sowohl die Manager-Komponente LCCManager_Legacy als auch LCCManager an dasselbe Objekt.
  3. Wählen Sie den Manager der entsprechenden Version, um anhand des Datenformats (Dateiendung .lcc / .lcc2) einen Renderer zu erstellen und Daten zu laden.
  4. Deaktivieren Sie nach der Bestimmung, welche Version zu verwenden ist, den Manager der anderen Version (Manager.Enable = false).
  5. Entladen Sie beim Datenwechsel oder bei der Zerstörung die aktuell gerenderten Daten über Renderer.Dispose().

Hinweise zur Datenformat-Kompatibilität

  • Das gleichzeitige Rendern von LCC und LCC2 wird nicht unterstützt. Daher müssen Sie beim Datenwechsel zuerst die aktuell gerenderten Daten entladen (Aufruf von Renderer.Dispose()), andernfalls kann es zu Arbeitsspeicher- und Grafikspeicher-Leaks kommen.

  • Den ungenutzten Manager deaktivieren. Nach der Bestimmung, welche SDK-Version zu verwenden ist, deaktivieren Sie am besten das Manager-Objekt der anderen SDK-Version (Manager.Enable = false), andernfalls kann es zu einem gewissen ineffektiven Leistungs-Overhead kommen.

  • Die API-Schnittstellen sind konsistent, aber Sie müssen den korrekten Renderer aufrufen. Die API-Schnittstellen der beiden SDK-Versionen sind exakt gleich (in v2.x wurden viele APIs in die Manager-Klasse verschoben; siehe das API-Handbuch), aber Sie müssen sicherstellen, dass Sie den Renderer der korrekten Version aufrufen (m_rendererLegacy oder m_renderer). Darüber hinaus unterstützen v2.0.0 und neuer das Speichern von Farbanpassung und Clipping-Daten nicht mehr, und einige weitere APIs sind ebenfalls veraltet; prüfen Sie bitte die Entwicklerdokumentation der entsprechenden Version.

Zugehörige APIs

Diese Lösung betrifft hauptsächlich die Manager- und Renderer-APIs der beiden SDK-Versionen. Im Folgenden wird v2.x (LCCCore) als Beispiel verwendet; v1.x (LCCCore_Legacy) besitzt dieselbe Schnittstelle mit lediglich einem anderen Namespace.

LCCManager.Enable

// Eigenschaft
public bool Enable { get; set; }

Der Aktivierungsschalter des Managers. Wird er auf false gesetzt, deaktiviert er den Manager dieser SDK-Version und vermeidet ineffektiven Leistungs-Overhead durch das gleichzeitige Arbeiten mit der anderen Version.

Verwendungsbeispiel:

// Bei Verwendung von LCC2-Daten den Legacy-Manager deaktivieren
m_managerLegacy.Enable = false;

Hinweise:

  • Nach der Bestimmung, welche Version zu verwenden ist, wird empfohlen, den Manager der anderen Version zu deaktivieren.

GetRender

// Rückgabewert: Renderer → Render-Instanz, null bei Fehler
public Renderer GetRender(Transform _transform)

Erstellt eine Render-Instanz und bindet sie an die angegebene Transform.

ParameterTypBeschreibung
_transformTransformDie Transform, an die die Render-Instanz angehängt ist

Verwendungsbeispiel:

m_renderer = m_manager.GetRender(this.transform);

Hinweise:

  • Muss über den Manager der entsprechenden Version erstellt werden, um sicherzustellen, dass der Renderer zum Datenformat passt.

Renderer.Dispose

// Rückgabewert: void
public void Dispose()

Zerstört die Render-Instanz und gibt alle GPU-Ressourcen und den Speicher frei. Die Instanz kann nach der Zerstörung nicht mehr verwendet werden.

Verwendungsbeispiel:

m_renderer?.Dispose();

Hinweise:

  • Vor dem Datenwechsel müssen Sie zuerst die aktuellen Daten entladen, andernfalls kann es zu Arbeitsspeicher- und Grafikspeicher-Leaks kommen.
  • Nach dem Aufruf benachrichtigt es automatisch den Manager, die Referenz zu entfernen.
  • Es wird empfohlen, es bei Zerstörung des Objekts (OnDestroy) aufzurufen.