5

我在 ThreeJS 场景中添加了一些对象(使用scene.add(object))。我知道对象的名称,只想从 scene.children 中获取它的索引。

我尝试使用scene.children.indexOf("objectName"),但它返回 -1 索引。有人可以建议我该怎么做吗?

谢谢

4

4 回答 4

8
var object = scene.getObjectByName( "objectName" );

或递归搜索场景图

var object = scene.getObjectByName( "objectName", true );

或者,您可以按 ID 搜索。

var id = scene.getObjectById( 4, true );

三.js r.60

于 2013-08-22T18:04:48.570 回答
2

我相信实际上可以回答您的问题的是我用来清理场景的以下代码:

while (scene.children.length > 0) {
            scene.remove(scene.children[scene.children.length - 1]);
}

这样我就不需要通过名称或 ID 访问元素。该对象只是从带有索引的数组中获取,所以它就像scene.children[i].

于 2015-03-23T21:24:22.887 回答
0

您收到未定义的警报文本,因为您返回的是一个对象而不是value/text. 你需要提醒类似的事情,scene.getObjectByName( "objectName" ).name或者scene.getObjectByName( "objectName" ).id我相信。

于 2013-10-14T16:08:32.930 回答
0

相关文档:getObjectByIdgetObjectByName。来自的重要说明getObjectByName

请注意,对于大多数对象,名称默认为空字符串。您必须手动设置才能使用此方法。

这可能就是你得到undefined. 此外,如果您正在undefined尝试访问.name.id将引发错误。如果您要取回一个对象,您会在警报中看到类似“[object Object]”的内容。

我通过艰难的方式学到的另一个重要说明是,您需要传递给的值getObjectByIdobject.id,而不是object.uuid。此外,object.id本质上只是数组object中的索引。children

把它们放在一起:

// var object = new THREE.Mesh(...) or similar
object.name = 'objectName';
scene.add(object);
var retrievedObject = scene.getObjectById(object.id);
// or
var retrievedObject = scene.getObjectByName('objectName');
alert(retrievedObject.name);
于 2019-02-04T19:20:36.947 回答