从组中删除对象将从场景中删除对象

时间:2019-06-22 13:50:32

标签: javascript three.js

我有一个ThreeJS Group对象,其中包含场景中的对象。我可以很好地添加这些对象并独立地对其进行操作,但是每当我尝试从组中删除一个对象时,都会将该对象从场景中删除。

var group=this.scene.getObjectByName(id);
for (var i=group.children.length-1; i >= 0; --i)            
    group.remove(group.children[i]);

1 个答案:

答案 0 :(得分:2)

要澄清问题注释中的讨论,实际上GroupScene之间几乎没有什么区别。两者都从addObject3D.add)继承Object3D

下面是一些代码,显示了添加/育儿的工作原理:

const scene = new THREE.Scene()
const group = new THREE.Group()
const mesh = new THREE.Mesh(/*...*/)

// scene.children == []
// scene.parent = null
// group.children == []
// group.parent = null
// mesh.parent == null

scene.add(mesh)

// scene.children == [ mesh ]
// scene.parent = null
// group.children == []
// group.parent = null
// mesh.parent == scene

group.add(mesh)

// scene.children == []
// scene.parent = null
// group.children == [ mesh ]
// group.parent = null
// mesh.parent == group

scene.add(group)

// scene.children == [ group ]
// scene.parent = null
// group.children == [ mesh ]
// group.parent = scene
// mesh.parent == group

Object3d.add处理此问题的部分是:

if ( object.parent !== null ) {

    object.parent.remove( object );

}

这可确保该对象仅是另一个对象的父对象。

如果用例是您希望将网格直接放在场景中,但仍想使用Group对象对其进行组织(以便可以使用getObjectById之类的功能),则可以手动添加他们到组的children数组中。请记住,如果您以后选择从场景中删除网格,则除非将网格也从您的组中删除,否则它不会被垃圾收集。就个人而言,我只会使用数组或地图。