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++

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

获取场景 Mesh 数据开发指南

LCC Unity SDK 在重建 LCC 数据时,会同时生成用于碰撞的 Mesh 数据。除了用于碰撞检测,SDK 还提供了将这份 Mesh 数据提取出来的能力,可将其转换为 Unity 的 Mesh 对象并可视化,便于导出、烘焙 NavMesh 等场景。

下面通过一个完整的示例,介绍同步获取全量 Mesh 数据、以及按需获取指定范围 Mesh 数据的步骤。

环境设置

在 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 数据坐标系」。

数据前置条件

获取 Mesh 数据生效的前提是场景带有对应的碰撞 Mesh 数据(由 LCC Studio 重建时生成)。此外,该能力有以下约束:

  • 仅 PC / Mac 平台,且仅支持本地数据源(HTTP 数据源不支持)。
  • 只能在主线程调用。
  • 原生格式数据(PLY / SOG / SPZ / splat / ksplat)不携带碰撞 Mesh 数据,调用相关方法会返回 null。

早期版本重建的数据可能不包含碰撞数据,此时调用 GetMeshes() 会返回 null。

同步获取全量 Mesh 数据

同步获取全量 Mesh 数据指一次性读取场景中所有碰撞 Mesh 分块的几何数据,通过 Renderer.GetMeshes() 方法实现。

新建一个 C# 脚本,命名为 Meshes.cs,代码如下:

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

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

    private const string kContainerName = "LCCVisualizedMeshes";

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

        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath,
            p => Debug.Log($"[Meshes] load progress: {p:P1}"),
            () =>
            {
                Debug.Log($"[Meshes] file loaded: {m_FilePath}");
                m_isLoaded = true;
                m_manager.SetAutoFov(false);
            },
            e => Debug.LogError($"[Meshes] file load error: {e}")
        );
    }

    public void onGetAllMeshes()
    {
        if (!m_isLoaded || m_renderer == null)
        {
            Debug.LogWarning("[Meshes] 数据尚未加载完成,无法获取 Mesh。");
            return;
        }

        var meshes = m_renderer.GetMeshes();
        if (meshes == null || meshes.Count == 0)
        {
            Debug.LogWarning("[Meshes] 未获取到 Mesh(数据可能不含碰撞体)。");
            return;
        }

        VisualizeMeshes(meshes);
    }

    private void VisualizeMeshes(List<LCCMeshBlock> meshes)
    {
        // 清理上一次的可视化结果,避免重复堆积
        Transform root = m_renderer.Transform;
        Transform old = root.Find(kContainerName);
        if (old != null) Destroy(old.gameObject);

        var container = new GameObject(kContainerName).transform;
        container.SetParent(root, false);

        Material material = CreateVisualMaterial();

        for (int i = 0; i < meshes.Count; i++)
        {
            LCCMeshBlock block = meshes[i];
            if (block.vertices == null || block.vertices.Length == 0) continue;
            if (block.triangles == null || block.triangles.Length < 3) continue;

            var go = new GameObject(string.IsNullOrEmpty(block.id) ? $"MeshBlock_{i}" : block.id);
            go.transform.SetParent(container, false);

            var mesh = new Mesh { name = go.name };
            // 单块顶点数可能超过 65535,必须使用 32 位索引,否则几何错乱
            mesh.indexFormat = IndexFormat.UInt32;
            mesh.vertices = block.vertices;
            mesh.triangles = block.triangles;
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            var mf = go.AddComponent<MeshFilter>();
            mf.sharedMesh = mesh;

            var mr = go.AddComponent<MeshRenderer>();
            mr.sharedMaterial = material;
        }

        Debug.Log($"[Meshes] 已为 {meshes.Count} 个 Mesh 分块创建 GameObject 并可视化。");
    }

    private Material CreateVisualMaterial()
    {
        Shader shader = Shader.Find("Universal Render Pipeline/Lit")
            ?? Shader.Find("Standard")
            ?? Shader.Find("Diffuse");
        if (shader == null) return null;

        var mat = new Material(shader) { color = new Color(0.7f, 0.7f, 0.7f, 1f) };
        // 碰撞网格三角形绕序不保证一致,关闭背面剔除以完整显示
        mat.SetFloat("_Cull", (float)CullMode.Off);
        return mat;
    }
}

说明:

  • GetMeshes() 是同步重操作:会同步读盘、解析并分配内存。大场景下,如一份 262 块的数据,可能需读取大量磁盘数据、分配数GB至数十GB托管内存,请调用一次并自行缓存,切勿每帧调用。
  • vertices / boundsLocal 位于物体本地坐标系,因此把可视化 GameObject 挂到 Renderer.Transform 下即可自动对齐。
  • 单块顶点数可能超过 65535(实测最大 390,656),自建 Mesh 前必须设置 mesh.indexFormat = IndexFormat.UInt32,否则几何会错乱。
  • 碰撞网格三角形绕序不保证一致,示例中关闭了背面剔除(_Cull = Off)以便完整显示。

将脚本挂载到 LCCRenderer 游戏对象上,并在 Inspector 中把 LCCManager 游戏对象拖到 Manager 属性、填写 File Path。

然后创建一个 Button,将 onGetAllMeshes() 方法关联到其 onClick 事件。

运行后点击 Button,即可看到场景中的全量碰撞 Mesh。

同步获取全量 Mesh 数据并可视化

点击按钮后可视化全量碰撞 Mesh 数据

按需获取 Mesh 数据

按需获取指只读取指定的部分Mesh数据,而不是一次性读取全部的Mesh数据,避免造成大的IO和内存开销,下面以读取相机周围一定范围内的 Mesh 分块为例。

先通过 GetMeshBlockInfos() 拿到所有分块的元信息(含世界空间包围盒),在世界坐标系下计算渲染相机中心点到分块 BBOX 表面的距离,筛选出距离小于 100 m 的分块 id,再用带参的 GetMeshes(ids) 只读取这些分块。

在 Meshes.cs 中新增以下方法:

public void onRequireMeshes()
{
    if (!m_isLoaded || m_renderer == null)
    {
        Debug.LogWarning("[Meshes] 数据尚未加载完成,无法获取 Mesh。");
        return;
    }

    // 1. 零 I/O 读取全部分块元信息,按相机到 BBOX 表面距离筛选 100 m 内的分块
    var infos = m_renderer.GetMeshBlockInfos();
    if (infos == null || infos.Count == 0)
    {
        Debug.LogWarning("[Meshes] 未获取到 Mesh 信息(数据可能不含碰撞体)。");
        return;
    }

    Vector3 camPos = m_camera.transform.position;
    var ids = new List<string>();
    foreach (var info in infos)
    {
        // 相机位于 BBOX 内部时 ClosestPoint 返回相机自身、距离为 0,同样会被选中
        if (calculateMinDistanceToAABB(info.boundsWorld, camPos) < 100f)
            ids.Add(info.id);
    }

    if (ids.Count == 0)
    {
        Debug.LogWarning("[Meshes] 相机周围 100m 内没有 Mesh 分块。");
        return;
    }

    // 2. 按 id 只读取筛选出的分块并可视化
    var meshes = m_renderer.GetMeshes(ids);
    if (meshes == null || meshes.Count == 0)
    {
        Debug.LogWarning("[Meshes] 按 id 获取 Mesh 失败。");
        return;
    }

    VisualizeMeshes(meshes);
    Debug.Log($"[Meshes] 相机周围 100m 内选中 {ids.Count} 个分块,可视化 {meshes.Count} 个。");
}

// 计算点到 AABB 表面的最近距离(点位于 AABB 内部时返回 0)
private static float calculateMinDistanceToAABB(Bounds _aabb, Vector3 _point)
{
    Vector3 p = _aabb.ClosestPoint(_point);
    return Vector3.Distance(p, _point);
}

说明:

  • GetMeshBlockInfos() 是零 I/O、零解析操作,只读内存中已有的元信息,可放心调用。
  • 距离筛选用的是 boundsWorld(世界空间包围盒),相机中心点取 Camera.transform.position。
  • 使用 Bounds.ClosestPoint 计算点到 AABB 表面的最近距离:当相机位于 BBOX 内部时,ClosestPoint 返回相机自身、距离为 0,该分块同样会被选中。
  • 示例中的筛选半径 100f(单位:米)可按需调整。

创建一个 Button,将 onRequireMeshes() 关联到其 onClick 事件。

运行后点击按钮,即可看到相机周围 100 m 范围内的 Mesh 分块。

按需获取相机周围 100m 内的 Mesh 数据并可视化

按需获取相机周围 100m 内的 Mesh 数据

关键步骤

获取并可视化场景 Mesh 数据的关键步骤:

  1. 完成 SetPlatformType 等前置配置,并通过 GetRender + Load 加载 LCC 场景。
  2. 确认数据携带碰撞 Mesh 数据(原生格式或早期重建的数据可能不含)。
  3. 全量获取:调用 GetMeshes() 一次性读取所有分块,并自行缓存结果,避免重复调用。
  4. 按需获取:先 GetMeshBlockInfos() 拿分块世界包围盒,按相机距离筛选 id,再 GetMeshes(ids) 只读目标分块。
  5. 可视化时把 GameObject 挂到 Renderer.Transform 下对齐本地坐标,并用 IndexFormat.UInt32 构建 Mesh。

获取 Mesh 相关 API

以下方法都挂在 Renderer 上,需要场景加载完成后调用,且数据需携带碰撞 Mesh 数据。

GetMeshBlockInfos

// 返回值:List<LCCMeshBlockInfo> → 碰撞 Mesh 分块元信息;无 Mesh 或不可用时返回 null
public List<LCCMeshBlockInfo> GetMeshBlockInfos()

返回全部碰撞 Mesh 分块的元信息(id、世界/本地包围盒、顶点数、面数)。零 I/O、零解析,只读内存中已有的 meta。

调用示例:

var infos = renderer.GetMeshBlockInfos();
foreach (var info in infos)
{
    Debug.Log($"{info.id}: verts={info.vertexCount}, faces={info.faceCount}, bbox={info.boundsWorld.size}");
}

说明:

  • 仅 PC / Mac 平台 + 本地数据源;只能主线程调用。
  • 典型用法:先用它拿各块世界 BBox,挑出需要的 id,再调 GetMeshes(ids) 只读那几块。
  • 原生格式(PLY / SOG / SPZ / splat / ksplat)无 Mesh,返回 null(属正常情况,不打日志)。

GetMeshes

// 返回值:List<LCCMeshBlock> → 全部碰撞 Mesh 几何数据;不可用时返回 null
public List<LCCMeshBlock> GetMeshes()

同步返回全部碰撞 Mesh 分块的几何数据(顶点 + 三角形索引,本地坐标系)。这是重操作(同步读盘 + 解析 + 分配),请调用一次并自行缓存,切勿每帧调用。

调用示例:

var meshes = renderer.GetMeshes();
foreach (var block in meshes)
{
    // block.vertices / block.triangles 在物体本地坐标系
}

说明:

  • 仅 PC / Mac 平台 + 本地数据源;只能主线程调用。
  • 大场景请改用 GetMeshBlockInfos() 挑 id + GetMeshes(ids),避免一次性分配海量托管内存。
  • 单块顶点数可超 65535,自建 Mesh 前必须设 mesh.indexFormat = IndexFormat.UInt32。

GetMeshes(按 id)

// 返回值:List<LCCMeshBlock> → 指定 id 的碰撞 Mesh 几何数据;无命中时返回 null
public List<LCCMeshBlock> GetMeshes(IEnumerable<string> _ids)

同步返回指定 id 的碰撞 Mesh 分块几何数据(本地坐标系)。id 由 GetMeshBlockInfos() 提供。

参数类型说明
_idsIEnumerable<string>目标分块 id 集合(由 GetMeshBlockInfos() 提供)

调用示例:

var ids = new List<string> { "block-0", "block-3" };
var meshes = renderer.GetMeshes(ids);

说明:

  • 未知 id 跳过并告警;重复 id 去重(不重复读盘);返回顺序为 ids 的遍历顺序(去重后)。
  • 入参为 null、为空、或无一命中时返回 null 并告警。
  • 其余约束同 GetMeshes()。

LCCMeshBlockInfo 数据结构

public struct LCCMeshBlockInfo {
    public string id;           // 节点 id,与 LCCMeshBlock.id 对应
    public Bounds boundsWorld;  // 世界空间 AABB,用于挑选 id
    public Bounds boundsLocal;  // 本地空间 AABB
    public int vertexCount;     // 顶点数
    public int faceCount;       // 面数
}
字段类型说明
idstring节点 id,与 LCCMeshBlock.id 对应
boundsWorldBounds世界空间 AABB,用于挑选 id
boundsLocalBounds本地空间 AABB
vertexCountint顶点数
faceCountint面数

LCCMeshBlock 数据结构

public struct LCCMeshBlock {
    public string id;           // 节点 id
    public Vector3[] vertices;  // 顶点,本地坐标系
    public int[] triangles;     // 三角形索引,每 3 个一组
    public Bounds boundsLocal;  // 与 vertices 同空间的包围盒
}
字段类型说明
idstring节点 id
verticesVector3[]顶点数组,物体本地坐标系
trianglesint[]三角形索引,每 3 个一组
boundsLocalBounds与 vertices 同空间的包围盒

注意:

vertices / boundsLocal 都在物体本地坐标系。要在 Unity 中可视化,把承载 Mesh 的 GameObject 挂到 Renderer.Transform 之下即可自动对齐。单块顶点数可超过 65535,自建 Mesh 前必须设置 mesh.indexFormat = IndexFormat.UInt32。