Javascript 从组中移除对象从场景中移除对象

Javascript 从组中移除对象从场景中移除对象,javascript,three.js,Javascript,Three.js,我有一个ThreeJS组对象,其中包含场景中的对象。我可以很好地添加这些对象并独立操作它们,但每当我尝试从组中删除对象时,它都会从场景中删除 var group=this.scene.getObjectByName(id); for (var i=group.children.length-1; i >= 0; --i) group.remove(group.children[i]); 为了澄清问题评论中的讨论,实际上组和场景之间没有什么区别。两者都从Ob

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

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

为了澄清问题评论中的讨论,实际上
场景
之间没有什么区别。两者都从
Object3D
继承
add
()

下面是一些代码,展示了添加/为人父母是如何工作的:

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

}
这将确保该对象仅作为另一个对象的父对象


如果您的用例是希望网格直接位于场景中,但仍然希望使用
对象对其进行组织(因此可以使用
getObjectById
等函数),则可以手动将其添加到组的
子对象
数组中。请记住,如果您以后选择从场景中移除网格,则在将其从组中移除之前,不会对其进行垃圾收集。就个人而言,我只会使用数组或贴图。

您是将整个组添加到场景中,例如
场景。添加(组)
还是单独添加每个网格?如果您希望网格在从组中删除后仍然可见,则可能需要单独添加网格;group.name=id;然后添加如下成员:group.add(this.scene.getObjectByName(id));它们实际上是我要添加的组,其中包含网格。发生的是,一旦从组中删除该项目,它在场景中不再处于活动状态。因此,您需要找到一种方法将每个项目单独添加到场景中。无论它们是网格还是组。hmmm。最初一次添加一个。是否需要使用scene.add()再次将删除的项目重新添加到场景中?看起来确实需要重新添加对象。