2012-01-12 3 views
1

私はThreeJSを勉強していて、私は現在の問題を理解することができません。ThreeJS Rayは目に見えない飛行機との交差点を持っていますか?

カメラから光線を投射すると、交差点が多すぎて、実際の飛行機の近くにいないものもあります。私は実際に私の目に見える飛行機を突っ込んでいる交差点を見つけなければならない。任意のアイデアをどのように行うには?

例(平面をダブルクリックし、各ボックスには、交差点を表しChromeとFFで動作します。): http://concurio.com/webgl/threejs-plane.html

+0

最新のバージョンのThreejsで試しましたか? – Neil

+0

コード内のバグの1つは、キャンバスがページの左上隅に揃っていないため、マウスの座標が少しずれていることです。コードを変更されていない平面ジオメトリでテストすると、すべてが正常に動作します。頂点z座標にオフセットを加えた場合、返される交点は間違っています(興味深い視覚化のために、mousemoveハンドラで交点テストとvisを行います)。 –

答えて

0

あなたのジオメトリにcomputeCentroidsとcomputeFaceNormalsを呼び出す必要があります。そして、その場合でも、交差点コードは平面上でのみ動作します。ジオメトリに平面以外の四角形を配置する必要がある場合は、代わりに三角形を使用する必要があります。または、Three.jsのバグを修正してください(https://github.com/mrdoob/three.js/issues/1357に提出)

また、renderer.domElementをページの左上に移動します。

要するに、この方法を試してください。Three.jsのDEVブランチで

var s = renderer.domElement.style; 
s.left = s.top = '0px'; 
s.position = 'absolute'; 

var planeGeo = new THREE.PlaneGeometry(400, 200, 40, 40); 
for (var i = 0, l = planeGeo.vertices.length; i < l; i ++) { 
    // planar quad faces 
    var p = planeGeo.vertices[i].position; 
    p.z = Math.sin(p.y/20)*40; 
} 
planeGeo.computeFaceNormals(); 
planeGeo.computeCentroids(); 

[更新]を、あなたは回避策として使用することができますTHREE.GeometryUtils.triangulateQuadsがあります。すでに顔の法線と重心を計算していますので、コードにこの1行を追加するだけです:

THREE.GeometryUtils.triangulateQuads(planeGeo); 
関連する問題