Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单击时从Three.js场景中删除组?_Three.js - Fatal编程技术网

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

如何在单击时从Three.js场景中删除组?,three.js,Three.js,我有一组对象(实际上是圆弧上的3D文本),我希望在特定的单击时从场景中删除这些对象。是否删除。是否不在组上工作?以下是我的基本情况: $(".inscript").on("mousedown", function(event){ var x = scene.getObjectByName("inscriptArc"); scene.remove(x); }); 这似乎表明您可以(使用.remove从场景中删除组),但它对我不起作用 是的,您绝对可以删除一组对象。您可能命名了对象

我有一组对象(实际上是圆弧上的3D文本),我希望在特定的单击时从场景中删除这些对象。是否删除。是否不在组上工作?以下是我的基本情况:

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

这似乎表明您可以(使用.remove从场景中删除组),但它对我不起作用

是的,您绝对可以删除一组对象。您可能命名了对象的子对象,而不是实际的组。函数getObjectByName并不总是像旧的three.js版本中承诺的那样工作,所以不妨试试这个

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

THREE.Scene.getObjectByName返回具有该名称的子对象的第一个实例。如果你有倍数,你不会通过调用一次来捕捉它们

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

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);
    }
});
但我认为,在某些情况下,如果异步加载/删除场景中的任何内容,这可能会导致错误,因为删除子对象可能会在遍历该子对象的子对象时引发错误。不确定,所以我会尝试简单的一个,如果它引起问题,我会用更复杂的一个替换