MergedObjects
基于Three.js的合并对象管理模块,用于管理大量相似对象的渲染。通过合并几何体技术,将相同材质的多个对象合并为单个几何体,减少绘制调用次数。
类定义
javascript
class MergeInfo
class MergedObject3D extends Object3D
class MergedMesh extends MergedObject3D
class MergedLine extends MergedObject3D
class MergedLineSegments extends MergedObject3D
class MergedLineLoop extends MergedObject3D常量
MERGED_OBJECT3D_TYPE
合并对象类型枚举,定义支持的合并对象类型。
类型: {Object}
静态: true
只读: true
属性:
MESH{string} - 合并网格对象类型LINE{string} - 合并线条对象类型LINE_SEGMENTS{string} - 合并线段对象类型LINE_LOOP{string} - 合并闭合线条对象类型
静态方法
MergedMesh.Create(meshArray, callback)
从网格对象数组创建合并网格,自动计算包围盒和BVH树。
参数:
meshArray{Array<Mesh>} - 网格对象数组callback{Function} - 回调函数,接收(uniqueId, index)参数
返回值:
- {MergedMesh} 合并网格对象
MergedLine.Create(lineArray, callback)
从线条对象数组创建合并线条。
参数:
lineArray{Array<Line>} - 线条对象数组callback{Function} - 回调函数
返回值:
- {MergedLine} 合并线条对象
MergedLineSegments.Create(lineSegmentsArray, callback)
从线段对象数组创建合并线段。
参数:
lineSegmentsArray{Array<LineSegments>} - 线段对象数组callback{Function} - 回调函数
返回值:
- {MergedLineSegments} 合并线段对象
MergedLineLoop.Create(lineLoopArray, callback)
从闭合线条对象数组创建合并闭合线条。
参数:
lineLoopArray{Array<LineLoop>} - 闭合线条对象数组callback{Function} - 回调函数
返回值:
- {MergedLineLoop} 合并闭合线条对象
通用方法
以下方法在所有合并类中通用,继承自MergedObject3D基类:
| 方法名 | 功能描述 | 参数 | 返回值 |
|---|---|---|---|
getInstanceAttribute($index) | 获取实例属性 | $index | |
getInstanceGeometry($index) | 获取实例几何体 | $index | |
getUniqueIDByIndex($index) | 根据索引获取唯一ID | $index | |
getInstance($index, objectType) | 获取实例对象 | $index {number}, objectType | |
raycast(raycaster, intersects) | 射线检测 | - | - |
setInstanceMatrix($index, matrix) | 设置实例变换矩阵 | $index {number}, matrix | |
setInstanceVisible($index, boolean) | 设置实例可见性 | $index {number}, boolean | |
getAllInstanceWorldBoundingBox() | 获取所有实例世界包围盒 | - | {Array<Box3>} |
getAllInstanceWorldBoundingSphere() | 获取所有实例世界包围球 | - | {Array<Sphere>} |
raycast(raycaster, intersects) | 射线检测 | raycaster {Raycaster}, intersects | - |
computeBVHTree() | 计算BVH树 | - | - |
updateMorphTargets() | 更新变形目标 | - | - |
toJSON() | 转换为JSON格式 | - |
重写方法
每个类重写了以下方法,提供类型特定的实现:
getInstance()
| 类名 | 方法签名 | 特殊功能 |
|---|---|---|
MergedMesh | getInstance($index, overWriteMaterial, edgesLineMaterial) | 支持边缘线材质,可添加边缘线显示 |
MergedLine | getInstance($index, overWriteMaterial) | 基础实现,设置renderOrder=2 |
MergedLineSegments | getInstance($index, overWriteMaterial) | 基础实现,设置renderOrder=2 |
MergedLineLoop | getInstance($index, overWriteMaterial) | 基础实现,设置renderOrder=2 |
toJSON()
每个类设置不同的类型标识:
| 类名 | 类型标识 |
|---|---|
MergedMesh | MERGED_OBJECT3D_TYPE.MESH |
MergedLine | MERGED_OBJECT3D_TYPE.LINE |
MergedLineSegments | MERGED_OBJECT3D_TYPE.LINE_SEGMENTS |
MergedLineLoop | MERGED_OBJECT3D_TYPE.LINE_LOOP |
特殊方法
computeLineDistances()
拥有类: MergedLine, MergedLineSegments
计算线条距离,为线条几何体计算累积距离,用于线条材质的效果渲染。
示例:
javascript
// 计算线条距离
mergedLine.computeLineDistances();使用场景
大量相似对象渲染
- 建筑模型中的重复构件(如窗户、门、柱子等)
- 道路系统中的路面和标线
- 管道系统中的管道和连接件
- 植被系统中的树木和草地
- 城市模型中的建筑物和街道设施
渲染优化
- 减少绘制调用次数
- 降低GPU负载,支持更多对象渲染
- 减少内存使用,减少几何体重复
- 支持LOD系统,动态调整细节级别
动态对象管理
- 动态控制对象的可见性
- 更新对象的变换和属性
- 支持对象的动态添加和删除
- 提供高效的射线检测和碰撞检测
空间查询加速
- 使用BVH树加速射线检测
- 支持视锥剔除和遮挡剔除
- 提供高效的空间查询接口
- 支持动态更新空间结构
相关链接
- Model - 模型基类
- InstancedObjects - 实例化对象
- SingleObjects - 单对象