克隆三个组层次结构

时间:2019-06-19 10:36:26

标签: three.js

我有一个层次结构,即A-> B->C。我希望创建一个此层次结构的副本,即A2-> B2-> C2。

但是Object3D.clone()会删除该组的父引用。

除了克隆后为每个子组手动设置父级以外,还有什么其他方法?

如果层次结构很深,则可能需要进行计算。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

也许您可以查看这个问题Will three.js Object3D.clone() create a deep copy of the geometry? 我将copy中的cloneObject3D方法扩展到深层克隆网格物体材料。

在您的情况下,这也应该起作用。

首先,在三种方法中扩展了两个新方法:

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()