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 場景進行高亮、裁剪等編輯操作。本文介紹高亮顯示相關操作:通過 2D 投影紋理、3D 幾何體或二者混合的方式圈選區域,讓選中區域高亮顯示,支持正選、反選等操作。

注意:

當前高亮功能僅是運行時的顯示效果,不會對原始數據文件產生任何修改,也不支持將編輯結果保存導出。如果需要調色、裁剪並保存數據,請使用其域創新(XGrids)LCC Editor 軟件工具處理。

如果不希望修改數據,也可以將操作記錄下來,下次在數據加載完成後重放操作。

前置條件

通過 SDK 對場景進行高亮,需要滿足以下條件:

  1. 在加載數據之前進入編輯狀態。 SDK 默認處於瀏覽狀態(View),該狀態能提供最佳性能,正常瀏覽時建議保持。要進行高亮等編輯操作,需在 Load 數據之前通過 SetEditorMode(true) 切換到編輯狀態。該方法只在加載所有數據之前調用才有效。
  2. 在數據加載完成後再執行高亮操作。 高亮接口需要在場景數據完全加載後調用。

步驟 1:搭建場景

參照下圖在場景中準備好高亮所需的遊戲對象。

高亮示例的場景層級結構

高亮示例的場景層級結構

  • Main Camera:場景相機,2D 高亮會用到它的視圖與投影矩陣。
  • LCCManager:空遊戲對象,Transform 歸一,添加 LCCManager 腳本。
  • LCCRenderer:空遊戲對象,Transform 設置為 Rotation.x = -90、Scale.x = -1(與 LCC 數據座標系對齊),用於掛載後面編寫的 Highlight 腳本。
  • 3D 選區幾何體:用於 3D 高亮的輔助對象。示例中準備了 3 個 Cube(Box1、Box2、Box3)和 1 個 Sphere(Clipsphere),移動、縮放這些對象即可控制高亮選區的位置和大小。

注意:

渲染相機、LCCManager、LCCRenderer 遊戲對象(GameObject)相關設置請參照PC 快速開發入門指南、工程設置優化指南 相關章節。

用於 3D 高亮的選區幾何體

用於 3D 高亮的選區幾何體(Box1 / Box2 / Box3 / Clipsphere)

步驟 2:了解數據結構

高亮涉及 2D、3D 和 2D/3D 混合三種操作方式,用到的枚舉和結構體如下。

public enum SelectMode    { normal, invert, clip }  // 正常選區、反選、實時裁剪
public enum OperationMode { normal, erase }         // 正常選區、擦除選區
public enum ShapeType     { box, sphere }           // 3D Box 選區、3D Sphere 選區
public enum EditType      { Edit2D, Edit3D }        // 2D 編輯、3D 編輯

// 2D 紋理選區
public struct Data2D
{
    public Texture2D texture;   // 2D 蒙版紋理
    public Matrix4x4 mv;        // 相機視圖矩陣
    public Matrix4x4 mvp;       // 相機視圖投影矩陣
    public SelectMode mode;     // 選擇模式
}

// 3D 幾何體選區
public struct Data3D
{
    public ShapeType type;          // 幾何體類型(box / sphere)
    public Matrix4x4 invMat;        // 幾何體的世界到局部(逆變換)矩陣
    public OperationMode operation; // 操作類型(normal 並集 / erase 差集)
    public SelectMode mode;         // 選擇模式
}

// 2D / 3D 混合選區
public struct DataMix
{
    public EditType editType;       // 編輯類型(必填,決定使用 2D 還是 3D 字段)
    public Texture2D texture;       // 2D 蒙版紋理(Edit2D 使用)
    public Matrix4x4 mv;            // 相機視圖矩陣(Edit2D 使用)
    public Matrix4x4 mvp;           // 相機視圖投影矩陣(Edit2D 使用)
    public ShapeType type;          // 幾何體類型(Edit3D 使用)
    public Matrix4x4 invMat;        // 幾何體逆變換矩陣(Edit3D 使用)
    public OperationMode operation; // 操作類型(Edit3D 使用)
    public SelectMode mode;         // 選擇模式(必填)
}

關於選區列表,有三點需要注意:

  1. 列表是有序的。 無論 2D 還是 3D,列表中的條目按順序依次生效,請確保添加順序符合預期。
  2. 反選是操作指令,可不關聯具體選區數據。 只需追加一個 mode = SelectMode.invert 的條目,即可把已圈選區域反選。
  3. 單個列表的條目數量上限為 255。 超出會返回錯誤碼。

步驟 3:了解高亮 API

高亮相關接口都由 LCCManager 提供,包含三個 SetHighlight 重載和一個退出方法。

SetHighlight(2D 紋理高亮)

// 返回值:int
// 0:執行成功
// 1:列表為 null 或元素個數為 0
// 2:列表元素超出最大值 255
public int SetHighlight(List<Data2D> _2Ds)

使用 2D 投影紋理蒙版對場景進行高亮,高亮區域外的部分變暗。

SetHighlight(3D 幾何體高亮)

// 返回值:int
// 0:執行成功
// 1:列表為 null 或元素個數為 0
// 2:列表元素超出最大值 255
// 3:用於選擇的幾何框數量為 0
public int SetHighlight(List<Data3D> _3Ds)

使用 3D 幾何體(長方體、正方體、球體)定義高亮區域,支持並集與差集組合。至少需要一個 operation == OperationMode.normal 的幾何體。

SetHighlight(混合模式高亮)

// 返回值:int
// 0:執行成功
// 1:列表為 null 或元素個數為 0
// 2:列表元素超出最大值 255
public int SetHighlight(List<DataMix> _Mix)

同時使用 2D 紋理和 3D 幾何體混合定義高亮區域,每個條目通過 editType 決定按 2D 還是 3D 處理。

QuitHighlightMode

// 返回值:void
public void QuitHighlightMode()

退出高亮模式,恢復場景正常顯示。

提示:

三個 SetHighlight 重載互斥。切換高亮方式或清除當前高亮時,先調用 QuitHighlightMode() 再設置新的高亮。

步驟 4:2D 蒙版紋理規範

2D 高亮通過一張蒙版紋理來描述選區,可支持四邊形、三角形、筆刷、套索等各種圈選方式——在紋理上把對應像素標記為選中值即可。使用 2D 操作時應鎖定相機,在固定視角下標識紋理。紋理和像素值有如下約定:

  • 紋理規格固定為 1024 × 1024,R8 單通道,不生成 Mipmap,使用點濾波(FilterMode.Point),採樣夾斷(TextureWrapMode.Clamp)。
  • 像素值約定:
像素值含義
128默認(未選中)
240選中
180減選(擦除已選區域)
0裁剪

在高亮場景下,通常只用到 128(默認)和 240(選中)兩個值。

步驟 5:編寫腳本

新建一個 C# 腳本,命名為 Highlight.cs。先完成基礎框架:在 Start 中進入編輯狀態並加載數據,加載完成後置位加載標記,供後續高亮方法判斷。

using LCCCore;
using System.Collections.Generic;
using UnityEngine;

public class Highlight : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    public GameObject m_Box1;
    public GameObject m_Box2;
    public GameObject m_Box3;
    public GameObject m_Clipsphere;

    private LCCCore.Renderer m_renderer;
    private Camera m_camera;
    private bool m_isLoaded = false;

    void Start()
    {
        m_camera = Camera.main;
        m_manager.SetPlatformType(PlatformType.PC);

        // 進入編輯狀態,必須在 Load 之前調用
        m_manager.SetEditorMode(true);

        m_renderer = m_manager.GetRender(this.transform);
        if (m_renderer == null)
            Debug.LogError("GetRender failed, check if the manager is set correctly and the file path is valid.");

        m_renderer.Load(m_FilePath, onLoadProgress, onLoadCallback);
    }

    private void onLoadProgress(float value)
    {
        Debug.Log($"loading progress: {value}");
    }

    private void onLoadCallback()
    {
        Debug.Log("data loaded !!!");
        m_isLoaded = true;
    }

    // 2D / 3D / 混合高亮方法見下文
}

注意:

SetEditorMode(true) 必須在 Load 之前調用才有效;而 SetHighlight 必須在數據加載完成(onLoadCallback 回調觸發)之後調用。

步驟 6:掛載腳本並設置屬性

  1. 將 Highlight.cs 腳本掛載到 LCCRenderer 遊戲對象上。
  2. 在 Inspector 窗口中,將 LCCManager 遊戲對象拖動到腳本的 Manager 屬性上。
  3. 在 File Path 屬性中填寫 LCC 文件的路徑地址。
  4. 將場景中的 Box1、Box2、Box3、Clipsphere 分別拖動到腳本對應的屬性上。
在 Inspector 中設置 Highlight 腳本的屬性

在 Inspector 中設置 Highlight 腳本的屬性

步驟 7:高亮操作示例

將下面的方法補充到 Highlight 類中,並在運行、數據加載完成後調用對應方法。

2D 紋理高亮

構造兩張 R8 蒙版紋理,把要高亮的像素標記為 240、其餘標記為 128,再用相機矩陣構造 Data2D 加入列表。

public void on2DHighlight()
{
    // 紋理尺寸固定 1024*1024,其它屬性保持與示例一致
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 240;    // 240 表示選中,128 表示默認,0 表示裁剪
        else
            _values[i] = 128;
    }
    _texture.SetPixelData(_values, 0);

    Texture2D _texture2 = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture2.filterMode = FilterMode.Point;
    _texture2.wrapMode = TextureWrapMode.Clamp;
    byte[] _values2 = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i > _count * 0.75 && i < _count * 0.9)
            _values2[i] = 240;
        else
            _values2[i] = 128;
    }
    _texture2.SetPixelData(_values2, 0);

    List<Data2D> _2Ds = new List<Data2D>();
    Data2D _2d01 = new Data2D();
    _2d01.mv = m_camera.worldToCameraMatrix;
    _2d01.texture = _texture;
    _2d01.mode = SelectMode.normal;
    _2d01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix;
    _2Ds.Add(_2d01);

    Data2D _2d02 = new Data2D();
    _2d02.mv = m_camera.worldToCameraMatrix;
    _2d02.texture = _texture2;
    _2d02.mode = SelectMode.normal;
    _2d02.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix;
    _2Ds.Add(_2d02);

    m_manager.SetHighlight(_2Ds);
}

代碼解釋 : 構建了兩張紋理蒙板,第一張蒙板將屏幕下半區域選中(屏幕以左下角為原點),第二張蒙板將上半屏幕 0.75 到 0.9 的區域選中,示例效果如下。

在實際使用時,可使用矩形框、三角形、筆刷、套索等各種圈選工具對蒙板對應位置進行選擇。

2D 紋理高亮效果

2D 紋理高亮效果

3D 幾何體高亮

用幾何體的 worldToLocalMatrix 作為選區逆變換矩陣,通過 operation 組合並集(normal)與差集(erase),可通過 mode = SelectMode.invert 的條目實現反選。

public void on3DHighlight()
{
    List<Data3D> _3Ds = new List<Data3D>();
    var _mat1 = m_Box1.transform.worldToLocalMatrix;
    var _mat2 = m_Box2.transform.worldToLocalMatrix;
    var _mat3 = m_Box3.transform.worldToLocalMatrix;
    var _mat4 = m_Clipsphere.transform.worldToLocalMatrix;

    // Box 選區
    Data3D _3d01 = new Data3D();
    _3d01.type = ShapeType.box;
    _3d01.operation = OperationMode.normal;
    _3d01.mode = SelectMode.normal;
    _3d01.invMat = _mat1;
    _3Ds.Add(_3d01);

    Data3D _3d02 = new Data3D();
    _3d02.type = ShapeType.box;
    _3d02.operation = OperationMode.normal;
    _3d02.mode = SelectMode.normal;
    _3d02.invMat = _mat2;
    _3Ds.Add(_3d02);

    // Sphere 選區
    Data3D _3d04 = new Data3D();
    _3d04.type = ShapeType.sphere;
    _3d04.operation = OperationMode.normal;
    _3d04.mode = SelectMode.normal;
    _3d04.invMat = _mat4;
    _3Ds.Add(_3d04);

    // 擦除 Box/Sphere(差集)
    Data3D _3d03 = new Data3D();
    _3d03.type = ShapeType.box;
    _3d03.operation = OperationMode.erase;
    _3d03.mode = SelectMode.normal;
    _3d03.invMat = _mat3;
    _3Ds.Add(_3d03);

    // 反選
    //Data3D _3d05 = new Data3D();
    //_3d05.mode = SelectMode.invert;
    //_3Ds.Add(_3d05);

    m_manager.SetHighlight(_3Ds);
}

代碼解釋 : 使用了 4 個幾何體,其中Box1、Box2、 Sphere 為正常選擇,而Box3為擦除選擇,即將之前已選中的區域進行擦除。註釋反選相關代碼,效果示例如下:

3D 幾何體高亮效果

3D 幾何體高亮效果

取消註釋反選代碼,即讓反選生效時,效果示例如下,反選即是將之前所選的選區反置,這是一條指令,可不與操作數據關聯。

特別需要注意的是,列表是有序的,不同的操作步驟會產生不同的最終效果。

3D 幾何體+反選高亮效果

3D 幾何體+反選高亮效果

混合模式高亮

在同一個列表中混用 2D 紋理和 3D 幾何體條目,每個條目通過 editType 指明處理方式。

public void onMixHighlight()
{
    // --- 2D 選框準備 ---
    // 紋理尺寸固定 1024*1024,其它屬性保持與示例一致
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 128;    // 128 表示默認,240 表示選中,0 表示裁剪
        else
            _values[i] = 240;
    }
    _texture.SetPixelData(_values, 0);

    List<DataMix> _Mixs = new List<DataMix>();
    DataMix _mix01 = new DataMix();
    _mix01.editType = EditType.Edit2D;
    _mix01.mv = m_camera.worldToCameraMatrix;
    _mix01.texture = _texture;
    _mix01.mode = SelectMode.normal;
    _mix01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix;
    _Mixs.Add(_mix01);

    // --- 3D 選框準備 ---
    var _mat1 = m_Box1.transform.worldToLocalMatrix;
    var _mat2 = m_Box2.transform.worldToLocalMatrix;
    var _mat3 = m_Box3.transform.worldToLocalMatrix;
    var _mat4 = m_Clipsphere.transform.worldToLocalMatrix;

    // Box 選區
    DataMix _mix02 = new DataMix();
    _mix02.editType = EditType.Edit3D;
    _mix02.type = ShapeType.box;
    _mix02.operation = OperationMode.normal;
    _mix02.mode = SelectMode.normal;
    _mix02.invMat = _mat1;
    _Mixs.Add(_mix02);

    DataMix _mix03 = new DataMix();
    _mix03.editType = EditType.Edit3D;
    _mix03.type = ShapeType.box;
    _mix03.operation = OperationMode.normal;
    _mix03.mode = SelectMode.normal;
    _mix03.invMat = _mat2;
    _Mixs.Add(_mix03);

    // Sphere 選區
    DataMix _mix04 = new DataMix();
    _mix04.editType = EditType.Edit3D;
    _mix04.type = ShapeType.sphere;
    _mix04.operation = OperationMode.normal;
    _mix04.mode = SelectMode.normal;
    _mix04.invMat = _mat4;
    _Mixs.Add(_mix04);

    // 擦除 Box/Sphere(差集)
    DataMix _mix05 = new DataMix();
    _mix05.editType = EditType.Edit3D;
    _mix05.type = ShapeType.box;
    _mix05.operation = OperationMode.erase;
    _mix05.mode = SelectMode.normal;
    _mix05.invMat = _mat3;
    _Mixs.Add(_mix05);

    // 反選(按需啟用)
    DataMix _mix06 = new DataMix();
    _mix06.editType = EditType.Edit3D;
    _mix06.type = ShapeType.box;
    _mix06.mode = SelectMode.invert;
    //_Mixs.Add(_mix06);

    m_manager.SetHighlight(_Mixs);
}

代碼解釋 : 使用了 4 個幾何體和 1 張 2D紋理,可 2D 與 3D 混合處理,效果示例如下:

混合模式高亮效果

混合模式高亮效果

步驟 8:退出高亮

調用 QuitHighlightMode() 即可清除當前高亮,恢復場景正常顯示。

public void onClearHighlight()
{
    m_manager.QuitHighlightMode();
}

關鍵步驟

對 3DGS 場景進行高亮顯示的關鍵步驟:

  1. 在 Load 數據之前調用 SetEditorMode(true) 進入編輯狀態。
  2. 在數據加載完成後(onLoadCallback 回調觸發 或者通過按鈕/事件觸發)再調用 SetHighlight。
  3. 根據需要選擇 2D 紋理、3D 幾何體或混合方式,並保證選區列表的添加順序符合預期。
  4. 2D 蒙版紋理固定為 1024 × 1024、R8 單通道,按約定填充像素值(128 默認、240 選中)。
  5. 需要清除或切換高亮時,先調用 QuitHighlightMode()。