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

      • 入门
      • 版本与更新
      • 下载与安装
      • 界面概览与导航
      • 重建前工作
      • 模型重建
      • 单模型重建
      • 地图融合
      • 空地融合
      • 航拍重建
      • 我的模型
      • 其他功能
      • 设置与账号
      • 转换工具
      • 视频重建
      • 常见问题 / FAQ
    • 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
    • X-Brain

      • 产品概述
      • 硬件接口
      • 快速开始
      • 核心概念
      • 集成指南
      • API 参考
      • 数据类型
      • ROS2 桥接
      • 示例程序
      • 部署与网络
      • 排障与 FAQ
      • 版本与发布
    • 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
    • Lixel OpenAPI

      • 概述
      • 连接与鉴权
      • 消息模型与编解码
      • 接口清单
      • 实时数据
      • 项目文件访问
      • 错误码
      • Python

        • 快速开始
        • 客户端封装与工具
        • 常见问题
      • C++

        • 快速开始
        • 客户端与示例
        • 常见问题

碰撞系统开发指南

LCC Unity SDK 内建了一套碰撞系统,重点解决碰撞体构建与碰撞检测的加速问题,也就是碰撞性能问题。Unity Collider 系统无法应付超大场景下的实时检测。

LCC Unity SDK 采用自建碰撞系统,不再借助 Unity 提供的 MeshCollider 组件及相关能力,因此不能直接对 Unity 场景中的 GameObject 产生作用。其域创新(XGrids)官方生成的 LCC 数据格式( LCC Studio )在重建时会同时生成用于碰撞的 Mesh 数据,SDK 利用这份碰撞数据快速高效地构建场景碰撞。由于是自建碰撞系统,使用碰撞功能需要调用 SDK 提供的相应方法来实现。

注意:

SDK 内建碰撞系统与 Unity Collider 碰撞系统不兼容,无法直接作用于 Unity 中的 Rigidbody 对象。数字人等角色的碰撞需要通过 SDK 的检测方法自行驱动(见下文「数字人碰撞实现方式」)。

如果是固定场景,也可以将 Mesh 数据提取出来提前烘焙成 NavMesh ,可与 Unity Collider 碰撞系统实现兼容,详见 NavMesh 指南。

数据前置条件

碰撞检测功能生效的前提是场景带有对应的碰撞数据。早期版本重建的数据可能不包含碰撞数据,此时调用 SetColliderEnable(true) 会返回 false,后续所有检测方法都不可用。

因此在开启碰撞后,请务必检查返回值:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("当前数据不含碰撞体,无法开启碰撞检测");
}

基本使用流程

碰撞功能的基本使用流程分三步:

  1. 通过 Load() 方法加载场景数据。
  2. 在加载完成回调中,通过 SetColliderEnable(true) 开启碰撞。
  3. 通过各类检测方法(RaycastMesh / IntersectsSphere / IntersectsCapsule)进行碰撞检测。
// 1. 加载场景
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. 加载完成后开启碰撞
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

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

    // 3. 每帧进行碰撞检测
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

说明:

SetColliderEnable() 是 Renderer 的方法,检测方法(RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast)挂在 LCCManager 上。请分别在对应对象上调用。

碰撞系统基本使用流程:加载场景 → 开启碰撞 → 碰撞检测

碰撞系统基本使用流程

数字人碰撞实现方式

由于 SDK 碰撞系统不作用于 Unity 的 Rigidbody,数字人(角色)的碰撞需要用检测方法自行驱动。常见做法有三种:

  • 双射线检测:使用 RaycastMesh() 向下、向前各发射一条射线,通过射线返回结果判断能否行走(向下探地面、向前探障碍)。
  • 胶囊体检测:使用 IntersectsCapsule() 检测数字人所在的胶囊体与碰撞网格是否相交,判定能否行走。重载版本的 _delta 返回下一个可安全到达的点的偏移量。
  • 球体检测:使用 IntersectsSphere() 检测数字人所在的球体与碰撞网格是否相交,判定能否行走。重载版本的 _delta 同样返回可安全到达点的偏移量。
数字人碰撞的三种实现方式:双射线、胶囊体、球体检测

数字人碰撞的三种实现方式

RaycastMesh 与 Raycast 的取舍

SDK 提供两类射线检测方法,用途不同:

方法检测对象精度速度适用场景
RaycastMesh()碰撞网格(Collider 数据)相对较低快数字人碰撞、逐帧检测
Raycast()高斯基元(不依赖碰撞网格)相对较高慢测量类应用

Raycast() 直接对高斯基元进行射线检测,精度更高,但速度慢,不建议每帧调用,因此不适合做数字人碰撞,只适合做测量类使用。数字人碰撞应优先使用依赖碰撞网格的 RaycastMesh()。

相关 API

以下碰撞相关方法中,SetColliderEnable() 挂在 Renderer 上,其余检测方法挂在 LCCManager 上。所有检测方法都需要在场景加载完成后、且成功调用 SetColliderEnable(true) 之后才可用。

SetColliderEnable

// 返回值:bool → true=设置成功,false=数据不含碰撞体或实例未激活
public bool SetColliderEnable(bool _enable)

开关碰撞体功能。启用后 IntersectsSphere / IntersectsCapsule / RaycastMesh 才可用。

参数类型说明
_enablebool是否启用碰撞体

调用示例:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("数据不含碰撞体");

说明:

  • 数据必须包含碰撞(Mesh)数据,否则返回 false。
  • 需要 Renderer 处于激活状态。

RaycastMesh(屏幕坐标)

// 返回值:bool → true=命中
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _distance= 70.0f)

从屏幕坐标发射射线检测碰撞网格。使用 Collider 数据检测,比 Raycast 更快但精度较低。

参数类型说明
mousePosVector3屏幕坐标
_finalResultout HitResult命中结果
_distancefloat最大检测距离,默认 70.0

调用示例:

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

说明:

  • 需要先成功开启碰撞。
  • 需先调用 SetColliderEnable(true)。

RaycastMesh(Ray + Bounds)

// 返回值:bool → true=命中
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

使用自定义 Ray 进行碰撞网格检测,同时返回命中节点的包围盒信息。

参数类型说明
rayRay射线
resultout HitResult命中结果
hitBoundsout Bounds命中节点的包围盒(命中的 LOD 节点包围盒)
maxDistfloat最大检测距离,默认 70.0

调用示例:

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

说明:

  • 需要先成功开启碰撞。
  • 双射线检测(向下、向前)判断数字人能否行走时常用此方法。

IntersectsSphere

// 返回值:bool → true=相交
public bool IntersectsSphere(Sphere sphere)

// 返回值:bool → true=相交
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

检测球体与碰撞网格是否相交。第二个重载额外返回穿透向量 delta(推出方向与距离),可用于计算下一个可安全到达的点。

参数类型说明
sphereSphere待检测的球体
deltaout Vector3穿透向量(推出方向和距离)

调用示例:

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

说明:

  • 需要先成功开启碰撞。
  • 需先调用 SetColliderEnable(true)。
  • 遍历所有激活的 Renderer。

IntersectsCapsule

// 返回值:bool → true=相交
public bool IntersectsCapsule(Capsule capsule)

// 返回值:bool → true=相交
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

检测胶囊体与碰撞网格是否相交。常用于角色控制器碰撞检测。第二个重载返回穿透向量 delta,可作为数字人下一个可安全到达的点偏移。

参数类型说明
capsuleCapsule待检测的胶囊体
deltaout Vector3穿透向量

调用示例:

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

说明:

  • 需要数据包含碰撞节点。
  • 需先调用 SetColliderEnable(true)。
  • 适合第一人称 / 第三人称角色碰撞。

Raycast

// 返回值:bool → true=命中
public bool Raycast(Ray _ray, out HitResult _finalResult)

使用自定义 Ray 对高斯基元进行射线检测,遍历所有激活的 Renderer 返回最近命中。不依赖碰撞网格,精度较高但速度慢。

参数类型说明
_rayRay射线
_finalResultout HitResult命中结果

调用示例:

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

说明:

  • 不依赖碰撞网格,无需 SetColliderEnable。
  • 精度较高但速度慢,不建议每帧调用,适合测量类应用,不适合数字人碰撞。

HitResult

上述检测方法的命中结果通过 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
}

注意:

命中点世界坐标的字段名是 hitPos,不是 position;请按实际字段名访问。