2016-04-12 4 views
3

私のレイキャスターが私がロードしたOBJを見ているかどうかを知りたい。 Cinema4Dからのエクスポートのため、私はOBJがTHREE.Objectの代わりに3人の子供を持つTHREE.Groupであると信じています。オブジェクトの代わりにこのグループを探すために、レイキャスターのコード行を変更することはできますか?Three.jsレイキャスターはグループと交差できますか?

raycaster.set(controls.getObject().position, controls.getDirection(), 0, 40) 

var intersects = raycaster.intersectObjects(scene.children, true); 

    if (intersects.length > 0) { 
     //CURRENTLY INTERSECTING SOMETHING 
     for (var i = 0; i < onOffCubes.length; i++) { 
     //if the first thing the raycaster sees is a one of my cubes 
     if (intersects[0].object == onOffCubes[i]) { 
       ExperiencesData[i].userClose = true 
      } 
     } 
     } 

onOffCubes 6つのOBJ/THREE.jsグループの配列である:CONSOLE.LOG(onOffCubes [0])これは

enter image description here

enter image description here

答えて

0

が見えるようにしてくださいあなたのグループの子供たちを通して:

var intersects = raycaster.intersectObjects(YOUR_OBJECT.children, true); 

THREE.GroupはTHREE.Object3Dから継承しているので、動作する可能性があります。

+0

hmmm。 6グループは私が内部調べる必要があり、実際に存在しているので、私が試した: 'のための(I経験で){ varが交わる=のraycaster.intersectObjects(onOffCubes [i]の.children、真の);}' けどましたエラー: は、未定義のプロパティ 'children'を読み取ることができません – EJW

+0

var intersects = raycaster.intersectObjects(onOffCubes [0] .children、true);それは動作しますか?エラーがありますか? – leota

+0

同じエラーが発生する – EJW

4

です。交差オブジェクトはメッシュで、そのメッシュの親はグループです。交差のオブジェクトではなく、交差の親オブジェクトに一致させる必要があります。すなわち:

intersects[ 0 ].object.parent === onOffCubes[ i ] 

なく:

intersects[ 0 ].object === onOffCubes[ i ] 

TL; DR

は同様の構成でテストするために、私は、共有メッシュの各グループに、3つのメッシュ毎の6つのグループを生成しました同じ材料。 onOffCubesはTHREE.jsグループではなく、グループの配列です。これは、元のポスターのonOffCubesのようなものです:

var onOffCubes = [] 
for (var i = 0; i < 6; i++) { 
    var material = new THREE.MeshBasicMaterial({ color: 0xee55aa }) 
    var group = new THREE.Group() 
    for (var j = 0; j < 3; j++) { 
     var mesh = new THREE.Mesh(geometry, material); 
     mesh.position.x = Math.random() * 100 - 50; 
     mesh.position.y = Math.random() * 100 - 50; 
     mesh.position.z = Math.random() * 200 - 200; 
     group.add(mesh); 
    } 
    onOffCubes.push(group) 
    scene.add(group) 
} 

チェックフルシーン

var intersects = raycaster.intersectObjects(scene.children, true); 

またはチェックは一つだけ修正して、元のポスターと本質的に同じコード

var intersects = raycaster.intersectObjects(onOffCubes, true); 

をonOffCubes

if (intersects.length > 0) { 
    for (var i = 0; i < onOffCubes.length; i++) { 
     if (intersects[ 0 ].object.parent === onOffCubes[ i ]) { 
      // What I tested with 
      //intersects[ 0 ].object.material.color.set(0xff0000) 
      // Your code 
      ExperiencesData[i].userClose = true 
     } 
    } 
}