ThreeJS Ray имеет пересечения с невидимыми плоскостями? - PullRequest
1 голос
/ 12 января 2012

Я изучаю ThreeJS и не могу понять текущую проблему.

Когда я снимаю луч с моей камеры, у него слишком много пересечений, и некоторые из них даже не приближаются к моей реальной плоскости. Я должен найти перекресток, который на самом деле пробивает мою видимую плоскость. Есть идеи как это сделать?

Пример (Двойной щелчок по плоскости, каждое поле представляет пересечение. Должно работать с Chrome и FF): http://concurio.com/webgl/threejs-plane.html

1 Ответ

0 голосов
/ 19 февраля 2012

Вам нужно вызвать 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);
...