我在ThreeJS场景中添加了一些对象(使用scene.add(object)
)。我知道对象的名称,只想从scene.children中获取它的索引。
我尝试使用scene.children.indexOf("objectName")
但它返回-1索引。任何人都可以建议我该怎么做?
由于
答案 0 :(得分:7)
var object = scene.getObjectByName( "objectName" );
或以递归方式搜索场景图
var object = scene.getObjectByName( "objectName", true );
或者,您可以按ID搜索。
var id = scene.getObjectById( 4, true );
three.js r.60
答案 1 :(得分:0)
您收到一条警告文字 undefined ,因为您收到的对象不是value/text
。您需要提醒我相信的scene.getObjectByName( "objectName" ).name
或scene.getObjectByName( "objectName" ).id
。
答案 2 :(得分:0)
我相信实际上可以回答你问题的是我用来清理场景的以下代码:
while (scene.children.length > 0) {
scene.remove(scene.children[scene.children.length - 1]);
}
这样我就不需要通过其名称或ID访问元素。该对象只是从带有索引的数组中获取,因此它类似scene.children[i]
。
答案 3 :(得分:0)
相关文档:getObjectById,getObjectByName。 getObjectByName
的重要提示:
请注意,对于大多数对象,名称默认为空字符串。您必须手动设置它才能使用此方法。
这可能就是为什么您获得undefined
的原因。另外,如果您获得undefined
,则尝试访问.name
或.id
将会引发错误。如果要找回对象,则警报中会显示类似“ [object Object]”的字样。
我很难学到的另一个重要说明是,您需要传递给getObjectById
的值是object.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);