XGRIDS文檔
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 靈視 P 系列

    • 靈視 P1

      • 產品概述
      • 設備基本操作
      • 使用 LCC Scan App
      • 維護及保養
      • 常見問題
  • 靈光 K 系列

    • 靈光 K1

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 地圖融合
      • 典型場景路線規劃建議
      • 注意事項
      • 常見問題
    • 靈光 K2

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 地圖融合
      • 典型場景路線規劃建議
      • 注意事項
      • 常見問題
  • 靈光 L 系列

    • 靈光 L2 Pro

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 實時測量功能
      • 附錄
      • 常見問題
    • 靈光 L3

      • 產品概述
      • 設備基本功能
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據操作流程
      • 附錄
  • 配件

    • 補光燈

      • 安裝指導
      • 基本操作
      • 常見問題
  • Lixel Studio

    • 版權
    • 安裝與激活
    • 界面說明
    • 文件
    • 工程處理
    • 工具
    • 平面繪製
    • 行業應用
    • 設置
    • 設備感知
    • 常見問題 / FAQ
  • Lixel CyberColor

    • LCC Studio

      • 入門
      • 版本與更新
      • 下載及安裝
      • 介面概覽及導覽
      • 重建前準備
      • 模型重建
      • 單模型重建
      • 地圖融合
      • 空地融合
      • 航拍重建
      • 我的模型
      • 其他功能
      • 設定與帳戶
      • 設置與賬號
      • Converter
      • 影片重建
      • 視頻重建
      • 常見問題
    • LCC Scene Editor

      • 版本與更新
      • 賬號與登錄
      • 產品概覽與主頁
      • 編輯器界面介紹
      • 三種場景漫游快捷操作
      • 文件
      • 設置
      • 編輯操作
      • 窗口
      • 全局工具欄
      • 資產與屬性
      • 左側工具欄
      • 視點
      • 跳轉點
      • 天空盒
      • 標注
      • 測量
      • 場景漫游
      • 場景報告
      • 智能戶型圖(3D Layout)
      • 小地圖
      • 預覽模式(Viewer)
      • 幫助
      • 常見問題 / FAQ
      • 出生點
    • LCC Model Editor

      • 版本與更新
      • 新手指引
      • 概覽與界面
      • 文件操作
      • 選擇器
      • 編輯操作
      • 測量
      • 調色
      • 資產管理
      • 設置與幫助
      • 常見問題 / FAQ
    • 採集指南

      • 概述
      • 採集設備總覽
      • 通用採集原則
      • 室內場景採集
      • 室外場景採集
      • 大場景採集(地圖融合)
      • 空地融合採集
      • 物體採集
      • 人物採集
      • 影片重建採集
      • 高清補拍
      • 控制點(靈視 P1)
      • 常見問題與排查
    • LCC Studio Linux

      • 產品概要說明
      • 基本架構說明書
      • 安裝部署說明書
      • 容器啟動參數說明書
      • CodeMeter離線授權部署說明書
      • API指令集說明書
      • 附錄-開發者數據說明書
      • 附錄-錯誤碼列表
      • 單機多卡集群部署QuickStart
    • 使用技巧

      • 多個大型 3DGS 模型融合工作流
    • 歷史版本
  • Plugin & SDK

    • Unreal

      • 介紹
      • 快速入門 - Windows
      • 快速入門 - Linux
      • 快速入門 - Quest3
      • 版本與授權
      • 渲染
      • Tiled 光柵化(實驗性)
      • 畫面調節
      • 法線與光照
      • 場景編輯
      • 性能參數說明
      • 性能優化指南
      • 第三方與引擎插件集成
      • 代理網格
      • 加載動畫
      • 碰撞
      • 尋路系統支持
      • 單層水支持
      • 本地化
      • 常見問題
      • 故障排查
      • 日誌與診斷
      • 聯繫我們
      • 最佳實踐

        • 用 LixelStudio 網格為 3DGS 重打光
      • API 參考

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG / SPZ / PLY Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • 更新日誌

        • 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

      • Unity SDK 簡介
      • 技術特性
      • 開發環境要求
      • PC 快速開發入門指南
      • 工程設置優化指南
      • Pico 4 Ultra 開發指南
      • Pico 4 Ultra PC 串流指南
      • Quest 3 開發指南
      • Quest 3 PC 串流指南
      • OpenXR 開發指南
      • Pico 4 Ultra 企業串流指南
      • 術語表
      • 常見問題
      • 聯絡我們
      • 功能開發指南

        • 多場景混合渲染開發指南
        • 陰影接收開發指南
        • 實時光照開發指南
        • 多相機渲染開發指南
        • 高清圖像渲染開發指南
        • LCC 與 LCC2 數據格式兼容開發指南
        • 加載特效開發指南
        • Mip 渲染模式切換開發指南
        • 邊角點吸附開發指南
        • 投影貼花開發指南
        • 視頻流投影開發指南
        • 高亮顯示開發指南
        • 實時裁剪開發指南
        • 調色開發指南
        • 獲取場景 Mesh 數據開發指南
        • 編輯器模式開發指南
        • 渲染性能參數設置指南
        • 應用與數據協同打包開發指南
        • 碰撞系統開發指南
        • macOS 開發權限問題操作指南
        • iOS 設備編譯打包開發指南
      • API 參考

        • LCCManager
        • Renderer
        • 數據類型
      • 更新日誌

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

      • 介紹
      • 渲染性能優化指南
      • 顯卡配置
      • 常見開發問題
      • 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
      • 更新日誌

        • 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

邊角點吸附開發指南

LCC Unity SDK 支持對 3DGS 表面進行邊緣、角點檢測和吸附預覽,可用於測量、標註、放置等需要精確定位的交互場景。下面介紹實現邊緣/角點檢測及吸附的完整步驟。

說明:

吸附功能(邊緣/角點檢測、吸附預覽、帶吸附的射線檢測)僅在 PC / Mac 平台支持,移動端 / VR 平台調用相關 API 無效並會輸出警告。

步驟 1:創建場景與遊戲對象

在 Unity 中創建一個全新的場景,Unity 默認會創建 Main Camera 和 Directional Light。

設置 Main Camera

在 Hierarchy 窗口中選擇 Main Camera,在 Inspector 窗口中按下圖設置其屬性。

設置 Main Camera 的屬性

設置 Main Camera 的屬性

創建 LCCManager

在 Hierarchy 窗口空白處單擊鼠標右鍵,在彈出的菜單中選擇 Create Empty,創建一個空遊戲對象,命名為 LCCManager,將其 Transform 歸一,並通過 Add Component 為其添加 LCCManager 腳本。

創建 LCCManager 遊戲對象並添加 LCCManager 腳本

創建 LCCManager 遊戲對象並添加 LCCManager 腳本

創建 LCCRenderer

在 Hierarchy 窗口空白處單擊鼠標右鍵,選擇 Create Empty,創建一個空遊戲對象,命名為 LCCRenderer,將其 Transform 設置為 Rotation.x = -90、Scale.x = -1。

創建 LCCRenderer 並設置 Transform

創建 LCCRenderer 並設置 Transform(Rotation.x = -90、Scale.x = -1)

注意:

LCCRenderer 遊戲對象的 Transform 設置(Rotation.x = -90、Scale.x = -1)是與 LCC 數據座標系的對齊。關於座標系對齊的詳細說明,參見 Unity SDK 簡介 中的「LCC 數據座標系」。

步驟 2:添加 Render Feature

  1. 在 Unity 菜單欄中選擇 File → Project Settings,在左側選擇 Graphics,確認當前使用的 Default Render Pipeline Asset。本示例為 URP(Universal Render Pipeline Asset)。
在 Graphics 設置中確認 Default Render Pipeline Asset

在 Graphics 設置中確認 Default Render Pipeline Asset

  1. 點擊該 Asset,在 Project 窗口中定位到對應的資源文件,找到與之關聯的 Renderer(本示例為 URP_Renderer.asset)。

  2. 選中該 Renderer 資源文件,在 Inspector 窗口中點擊 Add Renderer Feature,添加 Snap Frame Capture Feature。

在 URP Renderer 中添加 Snap Frame Capture Feature

在 URP Renderer 中添加 Snap Frame Capture Feature

步驟 3:編寫腳本開啟吸附功能

新建一個 C# 腳本,命名為 Snap.cs,代碼如下:

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("Started ");
        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath, onProgress, onComplete);
    }

    private void onProgress(float _progress)
    {
        Debug.Log($"[LCCRenderer] file load progress: {_progress:P1}");
    }

    private void onComplete()
    {
        Debug.Log($"[LCCRenderer] file loaded");
        m_loaded = true;
        // 開啟邊緣/角點檢測與吸附預覽
        m_manager.SetSnapEnabled(true);
        m_manager.SetSnapPreviewEnabled(true);
    }

    private void Update()
    {
        if (!m_loaded) return;
        // 根據當前鼠標位置實時更新吸附預覽
        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);
            }
        }
    }
}

注意:

邊緣/角點檢測(SetSnapEnabled)與吸附預覽(SetSnapPreviewEnabled)需要在 LCC 場景加載完成後開啟,因此二者都在 onComplete 回調中調用。吸附預覽還需要在 Update 中通過 UpdateSnapPreview 持續更新。

上述示例演示了以下要點:

  • 開啟邊緣、角點檢測:m_manager.SetSnapEnabled(true)
  • 開啟吸附預覽:m_manager.SetSnapPreviewEnabled(true)
  • 實時更新吸附預覽:m_manager.UpdateSnapPreview(Input.mousePosition, m_camera)
  • 在吸附點進行射線檢測並創建碰撞點小球:m_manager.RaycastWithSnap(...),命中後在 result.hitPos 處創建紅色小球

步驟 4:掛載腳本並設置數據路徑

  1. 將 Snap.cs 腳本掛載到 Hierarchy 窗口中的 LCCRenderer 遊戲對象上。
  2. 在 Inspector 窗口中,將 LCCManager 遊戲對象拖動到腳本的 Manager 屬性上。
  3. 在腳本的 File Path 屬性中填寫 LCC 文件的路徑地址。

步驟 5:運行

在 Game 窗口中點擊 Play 按鈕,即可看到實時檢測到的邊緣、角點以及吸附目標的預覽圖標。移動鼠標時預覽圖標會實時跟隨最近的吸附目標;單擊鼠標右鍵會在吸附點處進行射線檢測並創建一個紅色小球。

運行後實時檢測到的邊緣、角點及吸附預覽圖標

運行後實時檢測到的邊緣、角點及吸附預覽圖標

常見問題:關閉兼容模式

如果 Unity Console 窗口報錯且沒有出現吸附預覽圖標,請關閉兼容模式:通過 Edit → Project Settings → Graphics 打開設置面板,選擇 URP 選項卡,不要勾選 Render Graph → Compatibility Mode (Render Graph Disabled) 後的多選框。

不要勾選 Render Graph 兼容模式

不要勾選 Render Graph 兼容模式(Render Graph Disabled)

關鍵步驟

實現邊緣/角點檢測及吸附的關鍵步驟:

  1. 確保在 URP Renderer 中添加了 Snap Frame Capture Feature 渲染特性。
  2. 確保在 LCC 場景加載完成後通過代碼開啟了邊緣/角點檢測功能(SetSnapEnabled(true))和吸附預覽功能(SetSnapPreviewEnabled(true))。
  3. 確保在 Update 中實時調用 UpdateSnapPreview 更新預覽圖標。

吸附相關 API

LCC Unity SDK 通過 LCCManager 提供了以下吸附相關 API。它們僅在 PC / Mac 平台支持,移動端 / VR 平台調用無效並輸出警告;且都需要在 LCC 場景加載完成後調用。

SetSnapEnabled

// 返回值:void
public void SetSnapEnabled(bool enable)

開關吸附功能。啟用後 RaycastWithSnap 會自動搜索附近的邊緣/角點進行吸附。

參數類型說明
enablebool是否啟用吸附

調用示例:

m_manager.SetSnapEnabled(true);

說明:

  • 默認關閉。
  • 僅 PC / Mac 平台支持,移動端 / VR 調用無效並輸出警告。
  • 啟用後會分配 GPU 資源(EdgeDetect / CornerDetect / SnapSearch )。

SetSnapRadius

// 返回值:void
public void SetSnapRadius(float pixels)

設置吸附搜索半徑。在此像素範圍內搜索最近的邊緣/角點。

參數類型說明
pixelsfloat吸附搜索半徑(像素)

調用示例:

m_manager.SetSnapRadius(30f);

說明:

  • 默認 20 像素。
  • 值越大搜索範圍越廣,但可能吸附到非預期目標。
  • 僅 PC / Mac 平台支持。

SetEdgeThreshold

// 返回值:void
public void SetEdgeThreshold(float threshold)

設置 Sobel 邊緣檢測的閾值。值越小檢測到的邊緣越多。

參數類型說明
thresholdfloat邊緣檢測閾值

調用示例:

m_manager.SetEdgeThreshold(0.2f);

說明:

  • 默認 0.3。
  • 建議取值範圍 [0.1, 0.8]。
  • 值過小會產生大量噪聲邊緣。
  • 僅 PC / Mac 平台支持。

SetSnapPreviewEnabled

// 返回值:void
public void SetSnapPreviewEnabled(bool enable)

開關吸附預覽功能。啟用後鼠標移動時實時顯示最近的吸附目標指示器。

參數類型說明
enablebool是否啟用吸附預覽

調用示例:

m_manager.SetSnapPreviewEnabled(true);

說明:

  • 需先調用 SetSnapEnabled(true)。
  • 預覽會持續消耗 GPU 資源(每幀檢測)。
  • 僅 PC / Mac 平台支持。

UpdateSnapPreview

// 返回值:void
public void UpdateSnapPreview(Vector2 mousePos, Camera cam)

更新吸附預覽狀態。在鼠標移動時調用,更新預覽指示器位置。

參數類型說明
mousePosVector2當前鼠標屏幕座標
camCamera相機

調用示例:

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

說明:

  • 需先調用 SetSnapPreviewEnabled(true)。
  • 建議在 Update 中持續調用。
  • 僅 PC / Mac 平台支持。

GetSnapPreviewState

// 返回值:SnapPreviewState(screenPos 為屏幕座標)
public SnapPreviewState GetSnapPreviewState()

獲取當前吸附預覽狀態,包括是否有吸附目標、目標類型、目標屏幕位置和到鼠標的像素距離。

調用示例:

var state = m_manager.GetSnapPreviewState();
if (state.hasTarget)
{
    // state.snapType: Corner / Edge
    // state.screenPos: 吸附目標屏幕座標
    // state.distanceToMouse: 像素距離
}

說明:

  • 需先調用 SetSnapPreviewEnabled(true) 和 UpdateSnapPreview。
  • 無目標時返回 default(SnapPreviewState)。
  • screenPos 是屏幕座標,不是世界座標;需要世界座標時請用 RaycastWithSnap 取 HitResult.hitPos。
  • 僅 PC / Mac 平台支持。

RaycastWithSnap

// 返回值:bool(true = 命中)
public bool RaycastWithSnap(Vector2 screenPos, Camera cam, out HitResult result)

帶吸附功能的射線檢測。先進行普通 Raycast,再在命中點附近搜索邊緣/角點進行吸附。

參數類型說明
screenPosVector2屏幕座標
camCamera相機
resultout HitResult命中結果(含吸附信息)

調用示例:

if (m_manager.RaycastWithSnap(Input.mousePosition, m_camera, out HitResult hit))
{
    // hit.snapType: Corner / Edge / None
    // hit.hitPos: 吸附後的世界座標
    // hit.originalHitPos: 吸附前的原始命中點
}

說明:

  • 需先調用 SetSnapEnabled(true)。
  • 吸附優先級:Corner > Edge > None。
  • 本入口同步阻塞主線程(等待 GPU 回讀結果),建議僅在交互事件(如點擊)時調用,不要每幀調用。
  • 預覽模式(SetSnapPreviewEnabled(true))下若已有吸附目標,則直接複用預覽緩存,不再重新計算;否則走正常吸附流程。
  • 僅 PC / Mac 平台支持。

相關數據結構

SnapType

public enum SnapType { None, Edge, Corner }

吸附目標類型:無 / 邊緣 / 角點。

SnapPreviewState

public struct SnapPreviewState {
    public bool hasTarget;          // 是否有吸附目標
    public SnapType snapType;       // None / Edge / Corner
    public Vector2 screenPos;       // 吸附目標屏幕座標(非世界座標)
    public float distanceToMouse;   // 到鼠標位置的像素距離
}

⚠️ screenPos 是屏幕像素座標,不是世界座標。需要世界座標時請用 RaycastWithSnap 取 HitResult.hitPos。

HitResult

public struct HitResult {
    public bool isHit;             // 是否命中
    public float distance;         // 距離
    public Vector3 hitPos;         // 命中點世界座標(字段名為 hitPos,非 position)
    public Vector3 normal;         // 命中法線
    public float hitAlpha;         // 被擊中橢球的 Alpha
    public float dist2Origin;      // 到射線源的距離
    public float scale;            // 橢球 scale
    public SnapType snapType;      // 吸附類型(None / Edge / Corner)
    public Vector3 originalHitPos; // 吸附前原始命中點
}

⚠️ 字段命名差異:命中點世界座標的字段是 hitPos(而非 position),調用方代碼請按實際字段名訪問。