THREE.js 如何跟踪模型(物体)

3
我正在使用THREE.OBJLoader()加载.obj文件,并在将其添加到屏幕后将每个对象推入myobj[]数组中。
var myObjs = [];
var loader = new THREE.OBJLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
object.position.x=xpos;
object.position.y = ypos;
scene.add( object );
teeth.push(object);
});
loader.load( 'obj/myobj1.obj' );
loader.load('obj/myobj2.obj');
loader.load('obj/myobj3.obj');

我可以使用以下代码来检查对象是否被点击:

function onDocumentMouseDown( event ) {

event.preventDefault();
var vector = new THREE.Vector3( ( event.clientX / window.innerWidth ) * 2 - 1, - (   event.clientY / window.innerHeight ) * 2 + 1, 0.5 );


projector.unprojectVector( vector, camera );

var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
var intersects = ray.intersectObjects( teeth, true );

if ( intersects.length > 0 ) {

intersects[0].object.position.z=50;
}

到目前为止还不错。现在我无法理解的是如何跟踪我在 myobjs[] 数组中的哪个对象被点击,或者说我该如何将 intersects[0].object 映射到 myobjs 数组中。

祝好, ZB

1个回答

2

这个对象将完全相同,即intersects[0].object和一些myobjs数组成员都是对同一个实例的引用。如果您想要找到myobjs数组中的索引(例如为了从中删除它),您有几个选择:

  1. 在交集之后,循环遍历myobjs并比较intersects[0].object.idmyobj[i].id(每个three.js对象都有一个唯一的id属性)。
  2. 您还可以在load事件处理程序中为对象分配任何适当的自定义属性,因此只需在将其推送到myobjs之前添加一行object.myId = myobjs.length;,然后稍后可以使用intersects[0].object.myId索引数组。

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