2017-02-22 80 views
5

Pracuję z Three.js. Mam kolekcję punktów 3D (x, y, z) oraz kolekcję twarzy. Jedna twarz składa się z K punktów. Może być równie wypukły jak wklęsły. Nie znalazłem nic, co mogłoby mi pomóc w dokumentacji Three.js. Jednym z rozwiązań może być triangulacja tych kształtów, ale do tej pory nie znalazłem żadnego prostego algorytmu triangulacji 3D.Triangulacja punktów 3D z wierzchołkami K na twarz

Innym rozwiązaniem byłoby zrobić coś takiego:

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); 

mam dużo tych kształtów, które budują razem zamkniętą powierzchnię.

Jakieś sugestie?

Dziękuję za uwagę. Miłego dnia.

Odpowiedz

3

Jak podkreślił, są 2 sposoby, aby to osiągnąć:

  • użyć algorytmu triangulacji 3D (nie dostarczonego przez Three.js);
  • użyj algorytmu triangulacji 2D używanego zwykle dla Three.js Shape obiektów z pewną transformacją zastosowaną na każdej powierzchni geometrii.

Ostatni wydaje się fajny, ale niestety, jak próbowałem, zdałem sobie sprawę, że to nie jest takie banalne. I wymyślił coś podobnego do tego, co Paul-Jan powiedział:

Dla każdej twarzy swojej geometrii:

  1. Oblicz ciężkości twarz;
  2. Oblicz normalną twarz;
  3. Obliczyć matrycę twarzy;
  4. Wyświetlenie punktów 3D na płaszczyźnie 2D powierzchni;
  5. Utwórz geometrię (triangulowana algorytmem triangulacji Shape);
  6. Zastosować macierz twarz do nowo utworzonej geometrii
  7. Tworzenie Mesh i dodać go do Object3D (próbowałem połączyła wszystkie geometrie do 1, ale to nie z ShapeBufferGeometry)

Odjazd this fiddle .

Uważaj na winding order swoich wierzchołków lub umieść THREE.Material.side na THREE.DoubleSide, aby zapobiec wyrywaniu ścian.

+0

Wiem już, że punkty są współpłaszczyznowe, więc mogę łatwo obliczyć normalną płaszczyznę, rzutować płaszczyznę i punkty na płaszczyznę X, Y. Mam już własny algorytm triangulacji 2D. potem nie muszę odwracać punktów do poprzedniej płaszczyzny, ponieważ potrzebuję ich kolejności, potem kolejność punktów mogę z łatwością utworzyć trójkąty i wysłać je do pliku three.js i zbudować obiekt z geometrią bufora (Wygląda na to, że nie mogę Cię oznaczyć), ale dzięki i wersja demonstracyjna jest świetna, mam przetestować ją z moimi danymi i sprawdzić, czy pasuje do mojego systemu :) – Swisx

1

Myślę, że warto ponownie przejrzeć dokumentację Three.js, aw szczególności obiekt Shape. Przykładowy kod na tej stronie używa bezierCurveTo, ale jeśli użyjesz zamiast tego lineTo, możesz podawać sekwencje punktów i tworzyć wklęsłe wielokąty (w tym dziury).

+1

OP musi radzić sobie z punktami 3D, ale [algorytm triangulacji w Three.js Shape] (https://github.com/neeh/three.js/blob/dev/src/extras/ShapeUtils.js) działa z punktami 2D.Transformacja jest potrzebna dla każdej powierzchni wielokąta przed przejściem do "kształtu". – neeh

+0

Ah, dobra uwaga. Byłem pod wyrażeniem, że można po prostu nakarmić to punktami 3D, a wszystko wyszło by automatycznie, dzięki za poprawkę! Teraz musisz najpierw rzutować punkty każdej twarzy na swoją własną płaszczyznę, a następnie przekształcić kształt z powrotem na prawidłową orientację. Niezbyt praktyczny w przypadku nieliniowej liczby twarzy. –

+0

@ Paul-Jan dzięki fot odpowiedź, tak, niestety nie działa z 3d punktu. Potem wymyśliłem ten sam wniosek. – Swisx