我正在使用 collada 加载器加载模型。加载器返回一个带有许多子网格的 Object3D“dae”。我想多次实例化父“dae”对象而不复制网格。我可以只使用 dae.clone() 吗?
换句话说:我想制作浅拷贝,它们都有自己的变换矩阵但共享相同的几何形状。做到这一点最有效的方法是什么?
默认情况下Object3D.clone()
确实创建了一个深层副本。让我们看一下source
clone: function ( object, recursive ) {
if ( object === undefined ) object = new THREE.Object3D();
if ( recursive === undefined ) recursive = true;
object.name = this.name;
object.up.copy( this.up );
object.position.copy( this.position );
object.quaternion.copy( this.quaternion );
object.scale.copy( this.scale );
object.renderDepth = this.renderDepth;
object.rotationAutoUpdate = this.rotationAutoUpdate;
object.matrix.copy( this.matrix );
object.matrixWorld.copy( this.matrixWorld );
object.matrixAutoUpdate = this.matrixAutoUpdate;
object.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate;
object.visible = this.visible;
object.castShadow = this.castShadow;
object.receiveShadow = this.receiveShadow;
object.frustumCulled = this.frustumCulled;
object.userData = JSON.parse( JSON.stringify( this.userData ) );
if ( recursive === true ) {
for ( var i = 0; i < this.children.length; i ++ ) {
var child = this.children[ i ];
object.add( child.clone() );
}
}
return object;
}
正如我们所看到的clone
函数接受两个可选参数:
- 要克隆的对象
Object3D
into.
- 指示是否递归克隆子项的标志。
所以是的,可以制作浅拷贝Object3D.children
,但这不是您想要的(根据您的评论)。
我相信你实际上可以使用默认行为Object3D.clone()
得到你想要的东西。Mesh.clone()
不克隆Geometry
and Material
特性。
THREE.Mesh.prototype.clone = function ( object ) {
if ( object === undefined ) object = new THREE.Mesh( this.geometry, this.material );
THREE.Object3D.prototype.clone.call( this, object );
return object;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)