我有一个ThreeJS Group对象,其中包含场景中的对象。我可以很好地添加这些对象并独立地对其进行操作,但是每当我尝试从组中删除一个对象时,都会将该对象从场景中删除。
var group=this.scene.getObjectByName(id);
for (var i=group.children.length-1; i >= 0; --i)
group.remove(group.children[i]);
答案 0 :(得分:2)
要澄清问题注释中的讨论,实际上Group
和Scene
之间几乎没有什么区别。两者都从add
(Object3D.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
数组中。请记住,如果您以后选择从场景中删除网格,则除非将网格也从您的组中删除,否则它不会被垃圾收集。就个人而言,我只会使用数组或地图。