如何在单击时从Three.js场景中删除组?

时间:2018-09-11 20:11:11

标签: three.js

我有一组对象(实际上是弧上的3D文本),我希望通过一次特定的单击将其从场景中删除。 .remove是否不适用于组?这基本上就是我拥有的:

$(".inscript").on("mousedown", function(event){    
  var x = scene.getObjectByName("inscriptArc");
  scene.remove(x);
});

这个answer似乎建议您(使用.remove从场景中删除组),但是它对我不起作用。

2 个答案:

答案 0 :(得分:0)

是的,您绝对可以删除一组对象。您可能已经命名了该对象的子对象,而不是实际的组。函数getObjectByName并不总是像在更老的three.js版本中所承诺的那样工作,因此可以尝试一下。

scene.children.forEach(child => child.name == "inscriptArc" ? scene.remove(child) : null)

答案 1 :(得分:0)

THREE.Scene.getObjectByName返回具有该名称的子项的第一个实例。如果您有多个,则一次调用就不会抓住它们。

要删除所有实例,我将使用THREE.Object.traverse(fn(child){})函数,即:

var children_to_remove = [];
scene.traverse(function(child){
    if(child.name == "inscriptArc"){
       children_to_remove.push(child);
    }
});
children_to_remove.forEach(function(child){
    scene.remove(child);
});

您也许可以做到

scene.traverse(function(child){
    if(child.name == "inscriptArc"){
       scene.remove(child);
    }
});

但是我认为在某些情况下,如果您异步地从场景中加载/删除任何东西,这可能会导致错误-因为删除一个孩子可能会在遍历该孩子的孩子时引发错误。不确定,因此如果会导致问题,我会尝试简单的方法并与更复杂的方法进行交换。