three.js:通过名称或ID访问场景对象

44

我正在从一个数组中生成对象,数组定义如下(不仅限于这三个):

var links = [['Linkedin','img/linkedin.png','-300','-230', '600'],
             ['Google+', 'img/google.png',  '0',   '-230', '600'],
             ['Twitter', 'img/twitter.png', '300', '-230', '600']];
现在通过每个循环来创建并使用Three.JS将对象添加到场景中,如下所示:
$.each(links, function(i, item) {
    var thisItemTexture = THREE.ImageUtils.loadTexture(item[1]);
    thisItemGeo = new THREE.CubeGeometry(60, 60, 60,1 ,1 , 1);
    thisItemMat = new THREE.MeshBasicMaterial({map: thisItemTexture });
    thisItem =    new THREE.Mesh(thisItemGeo, thisItemMat);
    scene.add(thisItem);
    thisItem.position.x = item[2];
    thisItem.position.y = item[3];
    thisItem.position.z = item[4];
    thisItem.castShadow = true;
    thisItem.receiveShadow = true;          
});

问题是:
我如何访问上面在each循环中创建的对象?


抱歉,我误解了你的问题。你想做的是保留对每个“thisItem”的引用,对吗?从“scene”中获取项目列表是否可能? - tobi
@tobi 我想以某种方式访问在“场景”中的对象列表。 - Siamak Motlagh
似乎 scene.children 包含场景中对象的列表。 - tobi
@tobi 我认为这不是一个合适的方法。也许在循环中可以给每个对象提供一些参数。然后通过该参数可能可以访问到那些对象。就像一个ID一样。 - Siamak Motlagh
1个回答

85
你可以这样做:
myObject.name = "objectName";
...
var object = scene.getObjectByName( "objectName" );

或者递归地搜索场景图

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

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

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

three.js r.61


为了进行对象更改,您建议OP存储对象ID数组吗? - LucianNovo
@LucianNovo 如果您有问题,请发布新帖子。 - WestLangley
8
如果对象名称不唯一,那么getObjectByName()可能对您没有用。请记住,您还可以使用Object3D.userData,它是一个允许您添加自定义属性的对象。例如,myObject.userData.name =“foo”; - WestLangley

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