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[] 配列のどのオブジェクトがクリックされたかを追跡する方法です。

よろしく、 ZB

4

1 に答える 1

2

オブジェクトはまったく同じになります。つまりintersects[0].object、一部のmyobjs配列メンバーは両方とも同じインスタンスへの参照になります。配列へのインデックスを見つけたい場合myobjs(たとえば、そこから削除するため)、いくつかの選択肢があります。

  1. 交差後、ループしmyobjsて比較intersects[0].object.idmyobj[i].idます (各 three.js オブジェクトには固有のidプロパティがあります)。
  2. loadまた、イベント ハンドラーで適切なカスタム プロパティをオブジェクトに自由に割り当てることもできるため、object.myId = myobjs.length;プッシュする直前に行を追加するだけでmyobjs、後で .xml を使用して配列にインデックスを付けることができますintersects[0].object.myId
于 2012-11-20T13:40:34.523 に答える