我有一个层次结构,即A-> B->C。我希望创建一个此层次结构的副本,即A2-> B2-> C2。
但是Object3D.clone()
会删除该组的父引用。
除了克隆后为每个子组手动设置父级以外,还有什么其他方法?
如果层次结构很深,则可能需要进行计算。
感谢您的帮助!
答案 0 :(得分:2)
也许您可以查看这个问题Will three.js Object3D.clone() create a deep copy of the geometry?
我将copy
中的clone
和Object3D
方法扩展到深层克隆网格物体材料。
在您的情况下,这也应该起作用。
首先,在三种方法中扩展了两个新方法:
THREE.Object3D.prototype.deepClone = function ( recursive ) {
return new this.constructor().deepCopy( this, recursive );
},
THREE.Object3D.prototype.deepCopy = function( source, recursive ) {
if ( recursive === undefined ) recursive = true;
this.name = source.name;
this.up.copy( source.up );
this.position.copy( source.position );
this.quaternion.copy( source.quaternion );
this.scale.copy( source.scale );
this.matrix.copy( source.matrix );
this.matrixWorld.copy( source.matrixWorld );
if(source.material){
//changed
this.material = source.material.clone()
}
if(source.geometry){
//changed
this.geometry = source.geometry.clone()
}
this.matrixAutoUpdate = source.matrixAutoUpdate;
this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
this.layers.mask = source.layers.mask;
this.visible = source.visible;
this.castShadow = source.castShadow;
this.receiveShadow = source.receiveShadow;
this.frustumCulled = source.frustumCulled;
this.renderOrder = source.renderOrder;
this.userData = JSON.parse( JSON.stringify( source.userData ) );
if ( recursive === true ) {
for ( var i = 0; i < source.children.length; i ++ ) {
var child = source.children[ i ];
this.add( child.deepClone() ); //changed
}
}
return this;
}
第二,当您想深度克隆名为originalObj
的Object3D或场景时,只需执行var newObj = originalObj.deepClone()