THREE.InstancedMesh
是 Three.js 中的一个强大功能,它允许你高效地渲染许多相同几何体的实例,同时使用不同的变换(位置、旋转、缩放),从而减少绘制调用的数量。这在渲染大量相似对象时可以显著提高性能。
**setMorphAt 需要注意这个方法只适用于 buffer 建立出来的 geometry **
InstancedMesh 有七个属性九个方法
InstancedMesh( geometry : BufferGeometry, material : Material, count : Integer ) geometry - 一个 BufferGeometry 的实例。 material - 一个 Material 的实例。默认为一个新的 MeshBasicMaterial 。 count - 实例的数量
// 创建几何体和材质 const geometry = new THREE.BoxGeometry(1, 1, 1); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 创建 InstancedMesh const count = 100; const instancedMesh = new THREE.InstancedMesh(geometry, material, count); // 设置每个实例的变换 for (let i = 0; i < count; i++) { const matrix = new THREE.Matrix4(); matrix.setPosition(Math.random() * 10, Math.random() * 10, Math.random() * 10); matrix.scale(new THREE.Vector3(1, 1, 1)); // 可选的缩放 instancedMesh.setMatrixAt(i, matrix); } // 将 InstancedMesh 添加到场景中 scene.add(instancedMesh);
属性
boundingBox : Box3 当前 InstancedMesh 的外边界矩形。可以通过 .computeBoundingBox() 计算。默认值是 null。 当使用 computeBoundingBox() 方法后就能访问这个instanceMesh 生成的所有物体的最小包围盒。
boundingSphere : Sphere 当前 InstancedMesh 的外边界球形。可以通过 .computeBoundingSphere() 计算。默认值是 null。当使用 computeBoundingSphere() 方法后就能访问这个instanceMesh 生成的所有物体的最小包围球形。
count : Integer 实例的数量。被传入到构造函数中的count表示mesh实例数量的最大值。 你可以在运行时改变这个数值到 [0, count] 区间的一个整数。如果你需要比原先的数量更多的实例数量,你需要创建一个新的InstancedMesh。
instanceColor : InstancedBufferAttribute 代表所有实例的颜色。默认情况下null。 如果通过.setColorAt()修改实例化数据,则必须将它的needsUpdate标志设置为 true。
instanceMatrix : InstancedBufferAttribute 表示所有实例的本地变换。 如果你要通过 .setMatrixAt() 来修改实例数据,你必须将它的 needsUpdate 标识为 true 。
morphTexture : DataTexture 用于表示所有实例的变形权重。如果你通过 .setMorphAt() 修改了实例数据,你必须将 needsUpdate 标识设置为 true。
isInstancedMesh : Boolean 用来检查对象是否属于 InstancedMesh 类型的只读标识。
方法 公共方法请查看基类 Mesh。
computeBoundingBox () : undefined 计算当前几何体的的边界矩形,该操作会更新已有 [param:.boundingBox]。 边界矩形不会默认计算,需要调用该接口指定计算边界矩形,否则保持默认值 null。
computeBoundingSphere () : undefined 计算当前几何体的的边界球形,该操作会更新已有 [param:.boundingSphere]。 边界球形不会默认计算,需要调用该接口指定计算边界球形,否则保持默认值 null。
dispose () : undefined 释放实例的内部资源。
getColorAt ( index : Integer, color : Color ) : undefined index: 实例的索引。 值必须在 [0, count] 区间。 color: 传入的颜色对象将会被设置为指定的实例的颜色。 获取已定义实例的颜色。
getMatrixAt ( index : Integer, matrix : Matrix4 ) : undefined index: 实例的索引。值必须在 [0, count] 区间。 mesh: 网格属性 .morphTargetInfluences 将会被填充为已定义实例的变形权重。 获取已定义实例的变形权重
setColorAt ( index : Integer, color : Color ) : undefined index: 实例的索引。值必须在 [0, count] 区间。 color: 单个实例的颜色。 设置已定义实例的颜色。请确保在更新颜色后将 .instanceColor.needsUpdate 标识设置为 true。
setMatrixAt ( index : Integer, matrix : Matrix4 ) : undefined index: 实例的索引。值必须在 [0, count] 区间。 matrix: 一个4x4矩阵,表示单个实例本地变换。 设置给定的本地变换矩阵到已定义的实例。 请确保在更新所有矩阵后将 .instanceMatrix.needsUpdate 设置为true。
setMorphAt ( index : Integer, mesh : Mesh ) : undefined index: 实例的索引。值必须在 [0, count] 区间。 mesh: 网格属性 .morphTargetInfluences 包含了单个实例的变形权重。 设置已定义实例的变形权重。请确保在更新所有变形数据后将 .morphTexture.needsUpdate 设置为 true。