operazioni booleane su mesh


15

dato un insieme di vertici e triangoli per ogni mesh. Qualcuno sa di un algoritmo o di un posto per iniziare a cercare (ho provato prima google ma non ho trovato un buon posto per iniziare) per eseguire operazioni booleane su tali mesh e ottenere una serie di vertici e triangoli per la mesh risultante? Di particolare interesse sono la sottrazione e l'unione.

Immagini di esempio: http://www.rhino3d.com/4/help/Commands/Booleans.htm

Risposte:


10

Penso a questo come Constructive-Solid-Geometry (CSG). Spero che tu possa trovare aiuto qui.

http://www.alsprogrammingresource.com/csg.html

http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html

http://www.nigels.com/research/

Cerca anche su Google Geometria solida costruttiva come inizio.

HTH


+1 - Avevo intenzione di pubblicare gli stessi link, JustBoo - finché non ho notato che mi hai battuto! :)
jacmoe,

Grazie! La terminologia Constructive-Solid-Geometry è esattamente ciò di cui avevo bisogno!
lathomas64,

@jacmoe - L'ironia è incredibile e completa ora :-) Ti meriti il ​​merito per alcuni di quelli. Grazie.
JustBoo,

alcuni di quelli? : Credo che li abbia annotati tutti laggiù. : D Comunque, sono solo cose CSG di base. Da lì diventa piuttosto peloso - nemmeno i principali pacchetti di modellazione commerciale hanno fatto bene.
jacmoe,

3

Penso che possiamo risolverlo se ci pensiamo.

Ovviamente vorresti creare facce (triangoli) in cui le due geometrie si intersecano. Quindi ti restano tre mesh: l'intersezione appena isolata, la geometria 1 e la geometria 2.

Quindi, elimina ciò che non ti serve!

  • BooleanDifference: elimina la parte e la geometria isolate 2.
  • BooleanIntersection: elimina la geometria 1 e 2, lasciando la parte isolata
  • BooleanUnion: unisci le geometrie 1 e 2 ed elimina la parte isolata (assicurati di unire le geometrie 1 e 2 in una geometria solida)
  • BooleanSplit: separa la geometria 1, la geometria 2 e duplica la parte isolata (attaccane una alla geometria 1 e l'altra alla geometria 2)

Penso che lo copra, eh? La parte difficile sarebbe ovviamente creare le facce di intersezione. Per questo, scorrere attraverso ciascuna faccia dell'uno e verificare se quella faccia fa parte dell'altra; se è completamente all'interno, copia la faccia come parte della mesh dell'intersezione. Se è parzialmente all'interno, è necessario dividere il triangolo lungo la linea di intersezione; Penso che DirectX e OpenGL avrebbero entrambi funzioni di supporto per questo, o è solo un po 'di matematica sul piano 3D (vettori). Ho imparato questo genere di cose in Calculus 3 (o era 2?) Ma se non hai idea, forse chiedi a math.stackexchange.com . E poi ovviamente se la faccia è fuori, non fare nulla. Una volta eseguita l'iterazione su tutte le facce di entrambe le mesh, verrà lasciata la mesh dell'intersezione.


2

Se hai a che fare con modelli poligonali, potresti avere a che fare con geometria non multiforme, il che significa che la questione di cosa sia "dentro" e cosa "fuori" non è definita. È difficile eseguire un'operazione booleana se non sai se hai uno 0 o un 1.

Devi anche occuparti di casi marginali come poligoni co-planari, poligoni che intersecano bordi, vertici che si trovano su bordi e / o facce e cose di quella natura. Niente di tutto ciò è impossibile, hai solo bisogno di un modo molto robusto per rappresentare i tuoi dati mesh e una definizione rigorosa di cosa ti aspetti che accada in quei casi.


1

Vale la pena notare che la maggior parte delle operazioni può essere rappresentata dalla negazione e dall'unione, in cui la negazione di una certa geometria è proprio quella geometria con le sue normali capovolte. Quindi, se riesci a ottenere l'unione giusta, le altre operazioni dovrebbero semplicemente seguire:

  • intersezione (A, B): =! unione (! A,! B)
  • sottrarre (A e B): =! unione (! A, B)

Sander ha alcuni post di blog abbastanza buoni che parlano delle implementazioni di CSG: http://sandervanrossen.blogspot.com/search/label/CSG


1
Stavo per menzionare la mia roba CSG, ma apparentemente qualcun altro lo ha già fatto: O)
Sander van Rossen,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.