2017-02-22 80 views
5

Я работаю с Three.js. У меня есть коллекция 3D-точки (x, y, z) и коллекция лиц. Одна грань состоит из K баллов. Он может быть также выпуклым, как вогнутый. Я не нашел ничего, что могло бы помочь мне в документации Three.js. Одним из решений может быть триангуляция этих фигур, но до сих пор я не нашел простого алгоритма трехмерной треугольности.Триангуляция трехмерных точек с К вершинами на лицо

Другое решение было бы сделать что-то вроде этого:

var pointsGeometry = new THREE.Geometry(); 

pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(10, 10, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(0, 10, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(1, 3, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(-1, 3, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0)); 

var material = new THREE.MeshBasicMaterial({color: 0x00ff00}); 

var mesh = new THREE.Shape/ShapeGeometry/Something(pointsGeometry, material); 
group.add(mesh); 

scene.add(group); 

У меня есть много таких форм, которые создают вместе замкнутую поверхность.

Любое предложение?

Благодарим за внимание. Имейте славный день.

ответ

3

Как вы отметили, есть 2 пути для достижения этой цели:

  • использовать алгоритм триангуляции 3D (не обеспечиваются Three.js);
  • использует алгоритм 2D триангуляции, обычно используемый для объектов Three.js Shape с некоторым преобразованием, нанесенным на каждую грань геометрии.

Последний кажется классным, но, к сожалению, по мере того, как я пытался, я понял, что это не так уж и просто. Я придумал что-то подобное тому, что Paul-Jan сказал:

Для каждой грани вашей геометрии:

  1. Compute Центроид лицо;
  2. Вычислить лицо нормальное;
  3. Вычислить матрицу лица;
  4. Проецируйте 3D-точки на двумерную плоскость лица;
  5. Создайте геометрию (триангулированную с помощью алгоритма триангуляции Shape);
  6. Нанести матрицу лица к вновь созданной геометрии
  7. Создать Mesh и добавить его в Object3D (я пытался слит все геометрии в 1, но он терпит неудачу с ShapeBufferGeometry)

Проверить this fiddle ,

Будьте осторожны с winding order ваших вершин или поставьте THREE.Material.side на номер THREE.DoubleSide, чтобы предотвратить удаление лиц.

+0

Я уже знаю, что точки копланарны, поэтому я могу легко вычислить нормаль плоскости, проецировать плоскость и точки на плоскость X, Y. У меня уже есть собственный 2D-алгоритм триангуляции. после этого мне не нужно менять точки на предыдущую плоскость, потому что мне просто нужен их порядок. Впоследствии, с порядком точек, я могу легко сформировать треугольники и отправить их в three.js построить объект с геометрией буфера (Похоже, я не могу пометить вас), но спасибо, и демонстрация отличная, я должен проверить ее своими данными и посмотреть, подходит ли она моей системе :) – Swisx

1

Возможно, вы захотите пересмотреть документацию Three.js и, в частности, объект Shape. Пример кода на этой странице использует bezierCurveTo, но если вы используете lineTo, вы можете прокормить его своими точками и создать вогнутые многоугольники (включая отверстия).

+1

OP должен иметь дело с 3D-точками, но [триангуляционный алгоритм формы Three.js] (https://github.com/neeh/three.js/blob/dev/src/extras/ShapeUtils.js) работает с 2D-точками.Для каждой грани многоугольника требуется преобразование перед тем, как перейти к «Shape». – neeh

+0

А, хороший момент. Я был под выражением, что вы можете просто подпитывать 3D-очки, и все будет работать автоматически, спасибо за исправление! Теперь вам нужно будет сначала спроецировать точки каждого лица на их собственную плоскость и затем преобразовать форму обратно в правильную ориентацию. Не очень практично для нетривиального количества лиц. –

+0

@ Paul-Jan благодарит ответ, да, к сожалению, он не работает с 3D-точкой. Впоследствии я пришел к такому же выводу. – Swisx