Вам нужно вызвать computeCentroids и computeFaceNormals для вашей геометрии. И даже в этом случае код пересечения работает только на плоских гранях. Если вам нужно иметь неплоские четырехугольники в вашей геометрии, вам нужно вместо этого использовать треугольники. Или исправьте ошибку в Three.js (проблема с полем https://github.com/mrdoob/three.js/issues/1357)
Кроме того, переместите элемент renderer.dom в верхний левый угол страницы.
Короче, попробуйте это:
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();
[обновление] В ветке dev Three.js есть THREE.GeometryUtils.triangulateQuads, которые вы можете использовать в качестве обходного пути. Он уже вычисляет нормали лица и центроиды, поэтому вам нужно только добавить одну строку в ваш код:
THREE.GeometryUtils.triangulateQuads(planeGeo);