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