4

THREE.js とのオブジェクトの交差を検出する際に問題が発生しています。私のオブジェクトは、次のような 2D ジオメトリから押し出されています。

var geoShape = new THREE.Shape(vertexes);
var geometry = new THREE.ExtrudeGeometry(geoShape, { bevelEnabled: false, amount: 3 });

var mesh = THREE.SceneUtils.createMultiMaterialObject(geometry,
    [new THREE.MeshLambertMaterial({ color: '#493D26' })]
);
scene.add(mesh);

次に、次のような交差点を検出しようとしています。

container.mousedown(function (e) {

    event.preventDefault();

    var vector = new THREE.Vector3((e.clientX / window.innerWidth) * 2 - 1, -(e.clientY / window.innerHeight) * 2 + 1, 0.5);
    projector.unprojectVector(vector, camera);

    var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());

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

    console.log(intersects);
});

毎回、交差する配列は空です。シーンに球体を追加すると、交点が得られますが、z < 18 にズームインした場合のみです。何か提案はありますか?

4

3 に答える 3

11

真を追加

raycaster.intersectObjects(scene.children, true);

ドキュメントから:

recursive (true) — 設定されている場合、すべての子孫もチェックします。それ以外の場合は、オブジェクトとの交差のみをチェックします。

于 2013-08-17T22:34:49.517 に答える
3

raycaster が適切に構築されない原因はいくつかあります。それをデバッグし、raycaster が正しいものであることを確認するには、raycaster.ray.origin と raycaster.ray.direction を使用して視覚化することをお勧めします。交点を検出する同じマウスイベントで、次のように線を簡単に描くことができます。

var material = new THREE.LineBasicMaterial({
    color: 0x0000ff
});
var geometry = new THREE.Geometry();

geometry.vertices.push(new THREE.Vector3(raycaster.ray.origin.x, raycaster.ray.origin.y, raycaster.ray.origin.z));
geometry.vertices.push(new THREE.Vector3(raycaster.ray.origin.x + (raycaster.ray.direction.x * 100000), raycaster.ray.origin.y + (raycaster.ray.direction.y * 100000), raycaster.ray.origin.z + (raycaster.ray.direction.z * 100000)));
var line = new THREE.Line(geometry, material);

注: カメラの視点が変更された場合にのみ光線が視覚化されることを考慮してください。

于 2014-07-09T06:03:25.750 に答える
0

私にとって、解決策はウフラの答えでした...

raycaster.intersectObjects(scene.children, true);

...さらに、レイキャスターが最初の交差点だけでなく、すべての交差点の配列を生成するという認識。私のコードは、最初の交差点だけが必要なときに、すべての交差点を繰り返し、最後の交差点を表示していました。そう...

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

if(intersects.length > 0)
{
//Do something with intersects[0];
}   
于 2015-10-05T01:28:54.820 に答える