如何访问threeJS中场景子元素的元素?

5

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

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

谢谢

5个回答

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

或者递归搜索场景图

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

或者,您可以通过ID进行搜索。

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

three.js r.60


我刚刚按照你的建议尝试了一下,但是出现了“undefined”。我通过在alert()中输入var object = scene.getObjectByName( "objectName" );来检查,结果得到了“undefined”。由于我对ThreeJS不是很了解,但我发现对象存储在scene.children中。我们添加到场景中的每个对象都会添加到scene.children的末尾。所以我写了这段代码:var lastIndex = scene.children.length - 1; endElement = scene.children[lastIndex];scene.remove(endElement); 这将删除我绘制的最后一个元素。我需要您的帮助,从scene.children中获取一个元素的ID并与对象名称相关联。谢谢您。 - harman052
@user2615614 你有设置添加到场景中的对象的名称参数吗?提供一些示例代码可以帮助诊断错误 :) - Stemkoski
5
你的“采纳率”为零,请记得点击答案旁边的勾选标记来接受答案。请对回答你问题的其他人也这样做。如果你的程序不工作,请新建一个帖子,展示你的代码,并提出具体问题。谢谢。 - WestLangley

2
我相信以下代码可以回答你的问题,它是我用来清理场景的代码:

(我)

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

这样我就不需要通过名称或id访问元素。对象只需通过索引从数组中获取,就像scene.children[i]一样。


0
你收到了一个警告文本,内容是 undefined,因为你返回的是一个对象而不是一个 value/text。你需要像这样警告一些东西:scene.getObjectByName("objectName").name 或者 scene.getObjectByName("objectName").id

0
scene.children - 返回所有元素(instanceof Object3D)作为一个数组。
[ Mesh, Light, Camera ]
无论您通过调用 scene.add(obj) 方法添加了什么。
❌ 你犯了个错误

scene.children.indexOf("objectName")

你试过这个。 它永远不会起作用。因为你提供了字符串而不是Object3D。
相反,你应该使用这个。✅
scene.getObjectByName('objname');

在调用该方法之前,您必须设置objname。就像这样...
anyMesh.name = 'objname';
scene.add( anyMesh );

0
相关文档:getObjectByIdgetObjectByName。来自getObjectByName的重要提示:

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

这可能是您收到undefined的原因。此外,如果您收到undefined,尝试访问.name.id将会抛出错误。如果您收到一个对象,您将在警报中看到类似于“[object Object]”的内容。

我从中吸取的另一个重要教训是,您需要传递给getObjectById的值是object.id,而不是object.uuid。此外,object.id本质上只是children数组中object的索引。

将所有内容放在一起:

// 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接