UNPKG

@realsee/five

Version:

Realsee Renderer SDK

187 lines (128 loc) • 6.78 kB
# Model (模型) - **Summary**: Model 是 Five 中三维场景的核心实体,负责管理三维模型数据的加载、渲染和交互。 - **Schema**: 继承自 THREE.Object3D,包含 ViewLayer 等子对象。 - **Concepts**: ViewLayer, Parameter, 3DTile, five.ready()。 - **Examples**: 模型操作与事件监听。 ## Schema ### Model > **Definition**: [Model](../../five/model/model.d.ts) Model 类继承自 `THREE.Object3D`,是三维场景中的顶级对象。 ```typescript // 简化版定义,完整定义参考 lib/five/model/model.ts class Model extends THREE.Object3D { /** 唯一标识 */ public fiveId: string; /** 对应的 Work 数据 */ public work: Work; /** 模型参数配置 */ public parameter: Parameter; /** 包含的视图层 (如 mesh, point_cloud, gaussian_splatting) */ public viewLayers: ViewLayer[]; /** 是否加载完成 (初次加载) */ public loaded: boolean; /** 是否细化完成 (高清纹理/模型加载完毕) */ public refined: boolean; /** 细化进度 [当前, 总数] */ public refineProgress: [number, number]; /** 外包围盒 */ public boundingBox: THREE.Box3; /** 楼层数量 */ public floorLength: number; } ``` > **refineProgress 说明**: > * 类型: `[number, number]` > * 含义: `[已处理的瓦片/纹理数量, 总瓦片/纹理数量]`。 > * 用途: 用于计算模型加载/细化的百分比进度 (progress = current / total)。 ## Concepts ### 1. `five.models` vs `five.model` * **`five.models`**: 这是一个数组,返回当前场景中所有已加载的 `Model` 实例列表。 * **`five.model`**: 这是一个便捷属性,直接返回 `five.models[0]`。 通常情况下,如果你只加载了一个 Work,可以直接使用 `five.model` 来操作当前模型。 ```typescript // 下面两种方式是等价的 const model1 = five.models[0]; const model2 = five.model; ``` ### 2. Model vs Work * **Work (数据)**: 它是静态的描述数据(JSON),包含了模型的下载地址(URL)、元数据(Metadata)、初始状态等。它是“菜谱”。 * **Model (实体)**: 它是运行时的三维对象(Object3D),包含了实际的几何体(Geometry)、材质(Material)和渲染状态。它是“菜肴”。 关系:`five.load(work)` 过程就是根据 Work 数据创建 Model 实体的过程。 ### 3. ViewLayer 分层思想 一个完整的 VR 模型通常由多个部分组成,Five 使用 **ViewLayer** 来管理这些分层。 常见的 ViewLayer 类型: * **`mesh` (网格层)**: 也就是可以看到的实体模型(墙面、地板等)。 * **`point_cloud` (点云层)**: 激光点云数据。它并非低精度数据,同样支持高精度的近距离观察,并支持碰撞检测。 * **`gaussian_splatting` (高斯泼溅层)**: 新一代三维重建渲染技术,用于展示极高真实感的场景细节。 **层级结构**: Model 加载完成后,会自动根据 Work 数据生成对应的 ViewLayer,并挂载为 `Model` 的子对象。开发者可以通过 `model.viewLayers` 访问它们。 ```text Model (Object3D) ├── ViewLayer (mesh) -> 负责网格模型渲染 └── ViewLayer (point_cloud) -> 负责点云渲染 ``` ### 4. Parameter (简述) `Model` 实例上挂载了一个 `parameter` 对象(`five.models[0].parameter`)。 它是专门用于控制 **模型渲染表现** 的配置器。 * **作用**: 控制模型的透明度、显示的楼层、相机裁剪范围等。 * **详情**: 详见 [Parameter](./parameter.md) (待创建)。 ### 5. 3DTile (简述) `ViewLayer` 的底层实现基于 **3DTile** 技术(类名为 `Tile3D`)。 * **作用**: 实现大规模三维数据的流式加载(LOD)。它能根据相机距离动态加载不同精度的模型块,保证渲染性能。 * **详情**: 详见 [3DTile](./3dtile.md) (待创建)。 ### 6. five.ready() `five.ready()` 是一个 Promise 方法,用于等待当前环境“准备就绪”。 * **对于 Model 模式**: 它会等待 Model 几何体加载完成(`model.loaded` 为 true)。 * **对于 Panorama 模式**: 它会等待全景图基本加载完成。 推荐在执行截图、复杂的模型操作前,先 `await five.ready()`。 ### 7. 射线碰撞 (Raycaster) Model 提供了高效的射线检测方法 `intersectRaycaster`,内置了 BVH 加速,性能优于 Three.js 原生方法。 * **API**: `model.intersectRaycaster(raycaster: THREE.Raycaster): THREE.Intersection[]` * **用途**: 鼠标点击拾取、视线检测、碰撞检测。 * **详情**: 详见 [Raycast](./raycast.md)。 ## Events Five 实例上会派发与 Model 相关的生命周期事件,开发者可以通过 `five.on()` 监听。 | 事件名 | 说明 | 回调参数 | | :--- | :--- | :--- | | **`model.load`** | 单个 Model 几何体加载完成时触发。此时模型可见,但纹理可能模糊。 | `{ model: Model, work: Work }` | | **`models.refined`** | 所有 Model 的纹理细化完成(变清晰)时触发。 | `{ modelScene: ModelScene }` | | **`model.changeShownFloor`** | Model 的楼层显隐状态发生变化时触发。 | `{ model: Model, work: Work }` | | **`model.error`** | Model 加载出错时触发。 | `{ error: Error, model: Model, work: Work }` | ## Examples ### 获取并操作当前模型 ```typescript // 获取当前模型 const model = five.models[0]; if (model) { console.log("模型对应 Work 名称:", model.work.name); console.log("模型是否细化完成:", model.refined); // 监听模型细化事件 five.on("model.refined", () => { console.log("模型高清资源加载完毕"); }); } ``` ### 遍历 ViewLayer ```typescript const model = five.models[0]; // model.viewLayers 即为 ViewLayer 列表 model.viewLayers.forEach((layer) => { console.log(`图层名称: ${layer.name}, 类型: ${layer.type}`); if (layer.type === 'mesh') { // 对网格层做特殊处理 layer.visible = true; } }); ``` ## Common Pitfalls 1. **直接修改 `model.children`**: 不要直接修改 `model.children` 数组。Model 的子对象是由 Five 内部管理的。如果需要隐藏某个图层,请设置 `layer.visible = false`。 2. **混淆 `five.model` 和 `five.work`**: `five.model` 是 Three.js 对象 (Object3D),用于渲染;`five.work` 是数据对象,用于描述。 ## Related * [Work](./work.md): 了解 Work 数据结构。 * [Parameter](./parameter.md): 了解模型参数配置。 * [3DTile](./3dtile.md): 了解 3DTile 技术。 * [Raycast](./raycast.md): 了解射线检测机制。 --- ```yaml tags: [模型, 三维模型, 点云, 高斯泼溅, 加载, 渲染, 图层, 楼层, 细化, model, viewlayer, object3d, mesh, refine] ```