У меня есть объект ThreeJS Group, который содержит объекты на сцене. Я могу добавить эти объекты и манипулировать ими независимо, но всякий раз, когда я пытаюсь удалить объект из группы, он удаляется со сцены.
var group=this.scene.getObjectByName(id);
for (var i=group.children.length-1; i >= 0; --i)
group.remove(group.children[i]);
Я создаю группу следующим образом: var group=new THREE.Group(); имя_группы=идентификатор; this.scene.add(group) Затем добавьте участников следующим образом: group.add(this.scene.getObjectByName(id)); На самом деле это группы, которые я добавляю и содержат сетки.
Что происходит, так это то, что как только вы удаляете этот элемент из группы, он больше не активен на сцене. Поэтому вам нужно найти способ индивидуально добавить каждый элемент в сцену. Независимо от того, являются ли они сетками или группами.
Хм. Сначала они добавляются по одному. Нужно ли мне снова добавлять удаленный элемент в сцену с помощью scene.add()?
Похоже, мне нужно повторно добавить объект.
@BillFerster Представьте, что сцена и ее группы представляют собой дерево. Только объекты, которые являются частью этого дерева, визуализируются, когда вызывается что-то вроде renderer.render(scene, camera)
. Так что я не понимаю вашего вопроса: "Удаление объекта из группы удаляет объект из сцены"- Конечно, что вы ожидаете?
Я предположил, что добавление группы объектов просто создало связь в сцене, а не добавило его на самом деле, поскольку объект, который я добавил в группу, уже был членом дерева сцены. Спасибо за разъяснения.
Чтобы прояснить обсуждение в комментариях к вопросу, на самом деле между Group
и Scene
мало различий. Оба наследуют add
от Object3D
(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 );
}
Это гарантирует, что объект является родительским только для одного другого объекта.
Если ваш вариант использования заключается в том, что вы хотите, чтобы ваши сетки находились непосредственно в вашей сцене, но при этом хотите организовать их с помощью объектов Group
(чтобы вы могли использовать такие функции, как getObjectById
), вы можете вручную добавить их в массив группы children
. Просто помните, что если вы позже решите удалить меш из сцены, он не будет удален сборщиком мусора, пока он также не будет удален из вашей группы. Лично я бы просто использовал массив или карту.
Вы добавляете в сцену всю группу, например
scene.add( group )
, или каждую сетку по отдельности? Если вы хотите, чтобы сетки по-прежнему были видны после удаления из группы, вы можете добавить их по отдельности.