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 Kanten- und Eckensnapping

Das LCC Unity SDK unterstützt die Kanten- und Eckenerkennung sowie die Snap-Vorschau auf 3DGS-Oberflächen, die in Interaktionsszenarien eingesetzt werden können, die eine präzise Positionierung erfordern, etwa Messung, Annotation und Platzierung. Im Folgenden werden die vollständigen Schritte zur Implementierung der Kanten-/Eckenerkennung und des Snappings beschrieben.

Hinweis:

Die Snapping-Funktion (Kanten-/Eckenerkennung, Snap-Vorschau und Raycasting mit Snapping) wird nur auf PC-/Mac-Plattformen unterstützt. Der Aufruf der zugehörigen APIs auf Mobil-/VR-Plattformen hat keine Wirkung und gibt eine Warnung aus.

Schritt 1: Die Szene und die GameObjects erstellen

Erstellen Sie in Unity eine brandneue Szene. Unity erstellt standardmäßig die Hauptkamera und das Richtungslicht.

Hauptkamera einrichten

Wählen Sie die Hauptkamera im Fenster Hierarchie aus und legen Sie deren Eigenschaften im Fenster Inspektor wie unten dargestellt fest.

Die Eigenschaften der Hauptkamera festlegen

Die Eigenschaften der Hauptkamera festlegen

LCCManager erstellen

Klicken Sie mit der rechten Maustaste in einen leeren Bereich des Fensters Hierarchie, wählen Sie im Popup-Menü Leeres GameObject erstellen, um ein leeres GameObject zu erstellen, benennen Sie es LCCManager, normalisieren Sie dessen Transform und fügen Sie über Komponente hinzufügen das Skript LCCManager hinzu.

Das GameObject LCCManager erstellen und das Skript LCCManager hinzufügen

Das GameObject LCCManager erstellen und das Skript LCCManager hinzufügen

LCCRenderer erstellen

Klicken Sie mit der rechten Maustaste in einen leeren Bereich des Fensters Hierarchie, wählen Sie Leeres GameObject erstellen, um ein leeres GameObject zu erstellen, benennen Sie es LCCRenderer und setzen Sie dessen Transform auf Rotation.x = -90 und Scale.x = -1.

LCCRenderer erstellen und dessen Transform festlegen

LCCRenderer erstellen und dessen Transform festlegen (Rotation.x = -90, Scale.x = -1)

Hinweis:

Die Transform-Einstellungen des GameObject LCCRenderer (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 2: Ein Render Feature hinzufügen

  1. Wählen Sie in der Unity-Menüleiste Datei → Projekteinstellungen, wählen Sie links Grafik und bestätigen Sie das aktuelle Standard-Render-Pipeline-Asset. Dieses Beispiel verwendet URP (Universal Render Pipeline Asset).
Das Standard-Render-Pipeline-Asset in den Grafikeinstellungen bestätigen

Das Standard-Render-Pipeline-Asset in den Grafikeinstellungen bestätigen

  1. Klicken Sie auf dieses Asset, lokalisieren Sie die entsprechende Asset-Datei im Fenster Projekt und suchen Sie den zugehörigen Renderer (URP_Renderer.asset in diesem Beispiel).

  2. Wählen Sie diese Renderer-Asset-Datei aus, klicken Sie im Fenster Inspektor auf Renderer-Feature hinzufügen und fügen Sie das Snap Frame Capture Feature hinzu.

Das Snap Frame Capture Feature zum URP-Renderer hinzufügen

Das Snap Frame Capture Feature zum URP-Renderer hinzufügen

Schritt 3: Ein Skript zum Aktivieren des Snappings schreiben

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

using LCCCore;
using UnityEngine;

public class Snap : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    private LCCCore.Renderer m_renderer;
    private bool m_loaded = false;
    private Camera m_camera;

    void Start()
    {
        m_camera = Camera.main;
        m_manager.SetPlatformType(PlatformType.PC);
        Debug.Log("Gestartet ");
        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath, onProgress, onComplete);
    }

    private void onProgress(float _progress)
    {
        Debug.Log($"[LCCRenderer] Datei-Ladefortschritt: {_progress:P1}");
    }

    private void onComplete()
    {
        Debug.Log($"[LCCRenderer] Datei geladen");
        m_loaded = true;
        // Kanten-/Eckenerkennung und Snap-Vorschau aktivieren
        m_manager.SetSnapEnabled(true);
        m_manager.SetSnapPreviewEnabled(true);
    }

    private void Update()
    {
        if (!m_loaded) return;
        // Die Snap-Vorschau in Echtzeit anhand der aktuellen Mausposition aktualisieren
        m_manager.UpdateSnapPreview(Input.mousePosition, m_camera);
        if (Input.GetMouseButtonDown(1))
        {
            m_manager.RaycastWithSnap(Input.mousePosition, m_camera, out HitResult result);
            if (result.isHit)
            {
                GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                sphere.transform.position = result.hitPos;
                sphere.GetComponent<UnityEngine.Renderer>().material.color = Color.red;
                sphere.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            }
        }
    }
}

Hinweis:

Die Kanten-/Eckenerkennung (SetSnapEnabled) und die Snap-Vorschau (SetSnapPreviewEnabled) müssen nach Abschluss des Ladens der LCC-Szene aktiviert werden; daher werden beide im Callback onComplete aufgerufen. Die Snap-Vorschau muss außerdem kontinuierlich über UpdateSnapPreview in Update aktualisiert werden.

Das obige Beispiel veranschaulicht die folgenden Punkte:

  • Kanten- und Eckenerkennung aktivieren: m_manager.SetSnapEnabled(true)
  • Snap-Vorschau aktivieren: m_manager.SetSnapPreviewEnabled(true)
  • Snap-Vorschau in Echtzeit aktualisieren: m_manager.UpdateSnapPreview(Input.mousePosition, m_camera)
  • Raycasting am Snap-Punkt und Erstellen einer Kugel am Trefferpunkt: m_manager.RaycastWithSnap(...); bei einem Treffer wird eine rote Kugel an result.hitPos erstellt

Schritt 4: Das Skript anhängen und den Datenpfad festlegen

  1. Hängen Sie das Skript Snap.cs im Fenster Hierarchie an das GameObject LCCRenderer.
  2. Ziehen Sie im Fenster Inspektor das GameObject LCCManager auf die Eigenschaft Manager des Skripts.
  3. Tragen Sie den LCC-Dateipfad in die Eigenschaft File Path des Skripts ein.

Schritt 5: Ausführen

Klicken Sie im Fenster Spiel auf die Schaltfläche Play, um die in Echtzeit erkannten Kanten und Ecken sowie das Vorschau-Symbol des Snap-Ziels zu sehen. Wenn Sie die Maus bewegen, folgt das Vorschau-Symbol in Echtzeit dem nächstgelegenen Snap-Ziel; ein Rechtsklick führt ein Raycasting am Snap-Punkt aus und erstellt eine rote Kugel.

Nach dem Ausführen in Echtzeit erkannte Kanten, Ecken und das Snap-Vorschau-Symbol

Nach dem Ausführen in Echtzeit erkannte Kanten, Ecken und das Snap-Vorschau-Symbol

FAQ: Kompatibilitätsmodus deaktivieren

Wenn das Unity-Fenster Konsole Fehler meldet und kein Snap-Vorschau-Symbol erscheint, deaktivieren Sie den Kompatibilitätsmodus: Öffnen Sie das Einstellungsfenster über Bearbeiten → Projekteinstellungen → Grafik, wählen Sie den Tab URP und aktivieren Sie das Kontrollkästchen hinter Render Graph → Compatibility Mode (Render Graph Disabled) nicht.

Den Render-Graph-Kompatibilitätsmodus nicht aktivieren

Den Render-Graph-Kompatibilitätsmodus nicht aktivieren (Render Graph Disabled)

Schlüsselschritte

Die Schlüsselschritte zur Implementierung der Kanten-/Eckenerkennung und des Snappings:

  1. Sicherstellen, dass das Snap Frame Capture Feature zum URP-Renderer hinzugefügt wurde.
  2. Sicherstellen, dass die Kanten-/Eckenerkennung (SetSnapEnabled(true)) und die Snap-Vorschau (SetSnapPreviewEnabled(true)) im Code nach Abschluss des Ladens der LCC-Szene aktiviert werden.
  3. Sicherstellen, dass UpdateSnapPreview in Update in Echtzeit aufgerufen wird, um das Vorschau-Symbol zu aktualisieren.

Snap-bezogene APIs

Das LCC Unity SDK stellt über LCCManager die folgenden snap-bezogenen APIs bereit. Sie werden nur auf PC-/Mac-Plattformen unterstützt — der Aufruf auf Mobil-/VR-Plattformen hat keine Wirkung und gibt eine Warnung aus — und müssen alle nach Abschluss des Ladens der LCC-Szene aufgerufen werden.

SetSnapEnabled

// Rückgabewert: void
public void SetSnapEnabled(bool enable)

Schaltet die Snapping-Funktion um. Wenn aktiviert, sucht RaycastWithSnap automatisch nach nahegelegenen Kanten/Ecken zum Einrasten.

ParameterTypBeschreibung
enableboolOb das Snapping aktiviert werden soll

Verwendungsbeispiel:

m_manager.SetSnapEnabled(true);

Hinweise:

  • Standardmäßig deaktiviert.
  • Nur auf PC/Mac unterstützt; der Aufruf auf Mobil/VR hat keine Wirkung und gibt eine Warnung aus.
  • Wenn aktiviert, werden GPU-Ressourcen zugewiesen (EdgeDetect / CornerDetect / SnapSearch).

SetSnapRadius

// Rückgabewert: void
public void SetSnapRadius(float pixels)

Legt den Suchradius für das Snapping fest. Innerhalb dieses Pixelbereichs wird nach der nächstgelegenen Kante/Ecke gesucht.

ParameterTypBeschreibung
pixelsfloatSuchradius für das Snapping (Pixel)

Verwendungsbeispiel:

m_manager.SetSnapRadius(30f);

Hinweise:

  • Standard ist 20 Pixel.
  • Je größer der Wert, desto breiter der Suchbereich, es kann jedoch an unbeabsichtigten Zielen eingerastet werden.
  • Nur auf PC/Mac unterstützt.

SetEdgeThreshold

// Rückgabewert: void
public void SetEdgeThreshold(float threshold)

Legt den Sobel-Kantenerkennungs-Schwellenwert fest. Je kleiner der Wert, desto mehr Kanten werden erkannt.

ParameterTypBeschreibung
thresholdfloatSchwellenwert der Kantenerkennung

Verwendungsbeispiel:

m_manager.SetEdgeThreshold(0.2f);

Hinweise:

  • Standard ist 0.3.
  • Empfohlener Bereich [0.1, 0.8].
  • Ein zu kleiner Wert erzeugt viele verrauschte Kanten.
  • Nur auf PC/Mac unterstützt.

SetSnapPreviewEnabled

// Rückgabewert: void
public void SetSnapPreviewEnabled(bool enable)

Schaltet die Snap-Vorschau-Funktion um. Wenn aktiviert, wird das Anzeigesymbol des nächstgelegenen Snap-Ziels in Echtzeit angezeigt, während sich die Maus bewegt.

ParameterTypBeschreibung
enableboolOb die Snap-Vorschau aktiviert werden soll

Verwendungsbeispiel:

m_manager.SetSnapPreviewEnabled(true);

Hinweise:

  • Erfordert, dass zuerst SetSnapEnabled(true) aufgerufen wurde.
  • Die Vorschau verbraucht kontinuierlich GPU-Ressourcen (Erkennung in jedem Frame).
  • Nur auf PC/Mac unterstützt.

UpdateSnapPreview

// Rückgabewert: void
public void UpdateSnapPreview(Vector2 mousePos, Camera cam)

Aktualisiert den Zustand der Snap-Vorschau. Rufen Sie die Methode bei Mausbewegungen auf, um die Position des Vorschau-Anzeigers zu aktualisieren.

ParameterTypBeschreibung
mousePosVector2Aktuelle Bildschirmkoordinate der Maus
camCameraKamera

Verwendungsbeispiel:

void Update()
{
    m_manager.UpdateSnapPreview(Input.mousePosition, Camera.main);
}

Hinweise:

  • Erfordert, dass zuerst SetSnapPreviewEnabled(true) aufgerufen wurde.
  • Es wird empfohlen, die Methode kontinuierlich in Update aufzurufen.
  • Nur auf PC/Mac unterstützt.

GetSnapPreviewState

// Rückgabewert: SnapPreviewState (screenPos liegt in Bildschirmkoordinaten vor)
public SnapPreviewState GetSnapPreviewState()

Ruft den aktuellen Zustand der Snap-Vorschau ab, einschließlich ob ein Snap-Ziel vorhanden ist, des Zieltyps, der Bildschirmposition des Ziels und der Pixeldistanz zur Maus.

Verwendungsbeispiel:

var state = m_manager.GetSnapPreviewState();
if (state.hasTarget)
{
    // state.snapType: Corner / Edge
    // state.screenPos: Bildschirmposition des Snap-Ziels
    // state.distanceToMouse: Pixeldistanz
}

Hinweise:

  • Erfordert, dass zuerst SetSnapPreviewEnabled(true) und UpdateSnapPreview aufgerufen wurden.
  • Gibt default(SnapPreviewState) zurück, wenn kein Ziel vorhanden ist.
  • screenPos ist eine Bildschirmkoordinate, keine Weltkoordinate; wenn Sie die Weltkoordinate benötigen, verwenden Sie RaycastWithSnap, um HitResult.hitPos zu erhalten.
  • Nur auf PC/Mac unterstützt.

RaycastWithSnap

// Rückgabewert: bool (true = Treffer)
public bool RaycastWithSnap(Vector2 screenPos, Camera cam, out HitResult result)

Raycasting mit Snapping. Zuerst wird ein normales Raycast ausgeführt, anschließend wird nach Kanten/Ecken in der Nähe des Trefferpunkts zum Einrasten gesucht.

ParameterTypBeschreibung
screenPosVector2Bildschirmkoordinate
camCameraKamera
resultout HitResultTrefferergebnis (einschließlich Snapping-Informationen)

Verwendungsbeispiel:

if (m_manager.RaycastWithSnap(Input.mousePosition, m_camera, out HitResult hit))
{
    // hit.snapType: Corner / Edge / None
    // hit.hitPos: Weltposition nach dem Snapping
    // hit.originalHitPos: ursprünglicher Trefferpunkt vor dem Snapping
}

Hinweise:

  • Erfordert, dass zuerst SetSnapEnabled(true) aufgerufen wurde.
  • Snap-Priorität: Corner > Edge > None.
  • Dieser Einstiegspunkt blockiert den Hauptthread synchron (wartet auf das GPU-Rückleseergebnis); es wird empfohlen, ihn nur bei Interaktionsereignissen (z. B. Klicks) aufzurufen, nicht in jedem Frame.
  • Im Vorschau-Modus (SetSnapPreviewEnabled(true)), wenn bereits ein Snap-Ziel vorhanden ist, wird der Vorschau-Cache direkt ohne Neuberechnung wiederverwendet; andernfalls wird der normale Snap-Ablauf verwendet.
  • Nur auf PC/Mac unterstützt.

Zugehörige Datenstrukturen

SnapType

public enum SnapType { None, Edge, Corner }

Snap-Zieltyp: keiner / Kante / Ecke.

SnapPreviewState

public struct SnapPreviewState {
    public bool hasTarget;          // Ob ein Snap-Ziel vorhanden ist
    public SnapType snapType;       // None / Edge / Corner
    public Vector2 screenPos;       // Bildschirmposition des Snap-Ziels (keine Weltposition)
    public float distanceToMouse;   // Pixeldistanz zur Mausposition
}

⚠️ screenPos ist eine Bildschirmpixelkoordinate, keine Weltkoordinate. Wenn Sie die Weltkoordinate benötigen, verwenden Sie RaycastWithSnap, um HitResult.hitPos zu erhalten.

HitResult

public struct HitResult {
    public bool isHit;             // Ob ein Treffer aufgetreten ist
    public float distance;         // Distanz
    public Vector3 hitPos;         // Weltposition des Trefferpunkts (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
    public SnapType snapType;      // Snap-Typ (None / Edge / Corner)
    public Vector3 originalHitPos; // Ursprünglicher Trefferpunkt vor dem Snapping
}

⚠️ Unterschied im Feldnamen: Das Feld für die Weltposition des Trefferpunkts heißt hitPos (nicht position); Aufrufer sollten es über den tatsächlichen Feldnamen abrufen.