Javascript 如何从场景中删除网格的子集?

Javascript 如何从场景中删除网格的子集?,javascript,three.js,Javascript,Three.js,当我创建多个具有相同名称的网格时,当我想从场景中删除它们时,我无法将它们全部选中 我尝试遍历该函数,但没有结果 event.preventDefault(); scene.traverse(function(child) { if (child.name === "blueTiles") { var remove_object = scene.getObjectByName( "blueTiles", true ); scene.remove(remove_obj

当我创建多个具有相同名称的网格时,当我想从场景中删除它们时,我无法将它们全部选中

我尝试遍历该函数,但没有结果

event.preventDefault();

scene.traverse(function(child) {
   if (child.name === "blueTiles") {
      var remove_object = scene.getObjectByName( "blueTiles", true );
      scene.remove(remove_object); 
   }
});

var surroundMaterial = new THREE.MeshBasicMaterial({ color: 0x154995, side: THREE.DoubleSide, transparent: true, opacity: 0.8 });
surroundingCubes = new THREE.Mesh( geometry, surroundMaterial );
scene.add( surroundingCubes );
surroundingCubes.name = "blueTiles";
surroundingCubes.position.set(selectedObject.position.x - 1, 0.11, selectedObject.position.z);

var surroundMaterial = new THREE.MeshBasicMaterial({ color: 0x154995, side: THREE.DoubleSide, transparent: true, opacity: 0.8 });
surroundingCubes = new THREE.Mesh( geometry, surroundMaterial );
scene.add( surroundingCubes );
surroundingCubes.name = "blueTiles";
surroundingCubes.position.set(selectedObject.position.x + 1, 0.11, selectedObject.position.z);
surroundingCubes.rotation.x = Math.PI / 2;
我应该只能删除所有名为blueTiles的对象

编辑我把名字改成了组,效果很好 下面的解决方案

只需使用name属性调用,该属性只返回它找到的第一个对象。 实际上,您只需要在场景/object3d的子对象上循环,检查它们的名称,然后删除它们。 如果你知道所有你想删除的都是顶级的,这很简单。 有点像……未经测试

for ( var i = 0, l = scene.children.length; i < l; i ++ ) {
  if (scene.children[i].name === 'blueTiles') {
    scene.remove(scene.children[i]);
  }
}

可以尝试使用THREE.group类对网格进行分组

一个非常基本的用法是:

var meshes = new THREE.Group();
var mesh1 = new THREE.Mesh( geometry, material );
var mesh2 = new THREE.Mesh( geometry, material );
var mesh3 = new THREE.Mesh( geometry, material );
meshes.add( mesh1 );
meshes.add( mesh2 );
meshes.add( mesh3 );
scene.add( meshes );

在将它们添加到场景之前,您是否尝试过对它们进行分组@Xedret我认为这是实际的解决方案,我决定调整代码以使用组,这似乎是一个更好的解决方案。我应该将其添加为答案吗?@Xedret如果您添加答案,我会将其标记为正确。谢谢,我刚刚添加了一个关于如何使用三个组对网格进行分组的基本示例。组抱歉@2pha,但这似乎不起作用,幸运的是,我上面的一条评论概括了各个小组,我认为这正是我从一开始就应该做的。我会用答案更新我的问题。是的,在添加到场景之前将他们添加到组中是更好的方法。另一个选择是只在数组中保留对所有blueTiles对象的引用。感谢Xedret,拥有一个组似乎是更简单的方法!
scene.traverse(function(child) {
   if (child.name === "blueTiles") {
      scene.remove(child); 
   }
});
var meshes = new THREE.Group();
var mesh1 = new THREE.Mesh( geometry, material );
var mesh2 = new THREE.Mesh( geometry, material );
var mesh3 = new THREE.Mesh( geometry, material );
meshes.add( mesh1 );
meshes.add( mesh2 );
meshes.add( mesh3 );
scene.add( meshes );