【问题标题】:Cant remove objects using Three.JS无法使用 Three.JS 删除对象
【发布时间】:2012-07-25 13:59:03
【问题描述】:

我正在使用 Three.JS 制作飞机并在上面放置一些盒子 我有时需要删除所有盒子。所以我正在尝试使用以下代码:

for ( i = 0; i < scene.children.length; i ++ ) {
    var object = scene.children[ i ];
    if ( object != plane && object != camera) {
        scene.remove(object);
    }
}

/这会杀死所有不是飞机或相机的物体;-)/

它会删除一些框,但不是全部 =( 如何删除所有框? 问候,何塞

【问题讨论】:

  • 你不应该调用你的 var 对象。这是对象实际定义的保留关键字。
  • 对象应该没问题,对象被保留(大写o)
  • 这不是问题... =(。@ama2 是对的
  • 无论如何,@FlavorScape 是正确的,因为您不应该将大小写敏感性留给机会。只需将其命名为其他无论如何

标签: javascript 3d three.js


【解决方案1】:

像这样删除数组对象时,你需要从前到后,而不是从前到后。

var obj, i;
for ( i = scene.children.length - 1; i >= 0 ; i -- ) {
    obj = scene.children[ i ];
    if ( obj !== plane && obj !== camera) {
        scene.remove(obj);
    }
}

发生的情况是当一个节点移除时,所有在它转移之后的节点。假设您删除了 scene.children[0]:children[1] 将成为新的 0,2 将成为 1,以此类推。 当从 0 变为 array.length 时,for 循环已经继续前进,并且为您删除的每个节点跳过 1 个节点。

作为一个额外的好处,这应该会稍微快一些,特别是如果你有很多对象,因为 scene.children.length 只得到一次,而不是每个循环。

【讨论】:

  • 你明白了!谢谢@Crazycatz !!! =D =D =D =D =D =D =D
【解决方案2】:

@Crazycatz 的答案当然是正确的,但现在我们在 2016 年,我们可以调用 .slice() 并遍历数组副本,而不是手动迭代:

scene.children.slice().forEach(obj => scene.remove(obj))

或者没有 ES6 好东西:

scene.children.slice().forEach(function(obj) { scene.remove(obj); })

【讨论】:

  • 嗯,但是如何删除一个确切的孩子?由于某些原因,这对我不起作用 scene.children[2].children.forEach(i=>scene.remove(i)) 并且这也不起作用 scene.remove(scene.getObjectByName("earth_marker"))
【解决方案3】:

您应该使用 !== 而不是 !=(它会快一点)。之后您是否尝试过单步执行循环并检查场景子项?也许您在平面上添加了一些框作为子元素,这些框不会被此循环删除。

【讨论】:

  • 好主意。那不是问题,但无论如何感谢@Sebastian Sachtleben先生的想法。问候
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2021-12-29
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
相关资源
最近更新 更多