2009-05-01 8 views

risposta

9

Supponendo che il trimesh sia chiuso (sia convesso che non) c'è un modo!

Come sottolinea dmckee, l'approccio generale consiste nel costruire tetraedri da ciascun triangolo di superficie, quindi applicare la matematica ovvia per sommare i contributi di massa e momento di ciascun tet. Il trucco arriva quando la superficie del corpo presenta concavità che creano tasche interne se viste da qualsiasi punto di riferimento.

Quindi, per iniziare, selezionare un punto di riferimento (l'origine nelle coordinate del modello funzionerà correttamente), non è nemmeno necessario trovarsi all'interno del corpo. Per ogni triangolo, collega i tre punti di quel triangolo al punto di riferimento per formare un tetraedro. Ecco il trucco: usa la superficie del triangolo normale per capire se il triangolo è rivolto verso o lontano dal punto di riferimento (che puoi trovare guardando il segno del prodotto punto del normale e un vettore che punta al centro del triangolo). Se il triangolo è rivolto lontano dal punto di riferimento, tratta normalmente la sua massa e il suo momento, ma se è rivolto verso il punto di riferimento (suggerendo che c'è uno spazio aperto tra il punto di riferimento e il corpo solido), nega i risultati per quel tet .

Effettivamente ciò che fa è un numero eccessivo di blocchi di volume e quindi corretto una volta che tali aree non vengono mostrate come parte del corpo solido. Se un corpo ha molte flange grottesche e pieghe grottesche (ottenuto quell'immagine?), Un particolare volume può essere sovrastimato da un fattore pesante, ma sarà sottratto appena un numero sufficiente di volte per cancellarlo se la tua mesh è chiuso. Lavorando in questo modo puoi persino gestire bolle interne di spazio nei tuoi oggetti (assumendo che le normali siano impostate correttamente). Oltre a questo, ogni triangolo può essere gestito in modo indipendente in modo da poter parallelizzare a piacimento. Godere!

Ripensamento: ci si potrebbe chiedere cosa succede quando quel prodotto punto fornisce un valore pari o vicino allo zero. Ciò accade solo quando la faccia del triangolo è parallela (il suo normale è perpendicolare) fa la direzione verso il punto di riferimento - che accade solo per le tele degenerate con un'area piccola o zero comunque. Vale a dire, la decisione di aggiungere o sottrarre il contributo di un tet è discutibile solo quando il tet non ha comunque dato il suo contributo.

+2

Bello. Avrei dovuto vederlo È un'estensione del vecchio approccio "conta le traversate" all'apprendimento se un punto è interno o esterno a una forma. – dmckee

1

Vorrei dare un'occhiata a vtkMassProperties. Questo è un algoritmo abbastanza robusto per il calcolo di questo, data una superficie che racchiude un volume.

1

Decomporre l'oggetto in un set di tetrahedrons attorno al punto interno selezionato. (Ciò significa che i solidi utilizzano ciascun elemento triangolare e il centro scelto.)

Dovresti riuscire a cercare il volume di ciascun elemento. Dovrebbe essere disponibile anche lo moment of inertia.

Diventa molto più difficile se la superficie non è convessa.


mi sembra di avere miss-ricordata da nomenclatura e skew non è l'aggettivo che volevo. Intendo non regolare.

+0

Se l'oggetto non è convesso (e talvolta anche se lo è), la tessellazione in tet è molto più complicata del semplice calcolo della massa direttamente. –

+0

@Reed Copsey: Prenderò la tua parola per questo. La soluzione che ho offerto è certamente ingenua. – dmckee

1

Se il tuo polidro è complicato, considera l'utilizzo dell'integrazione Monte Carlo, che viene spesso utilizzata per integrali multidimensionali.Avrai bisogno di un ipercubo che lo racchiuda e dovrai testare se un determinato punto si trova all'interno o all'esterno del poliedro. E dovrai essere paziente, poiché l'integrazione Monte Carlo è lenta.

Inizia come al solito su Wikipedia, quindi segui le pagine dei link esterni per ulteriori informazioni.

(Per chi non conosce l'integrazione Monte Carlo, ecco come calcolare una massa. Selezionare un punto nel ipercubo contenente. Aggiungi al bancone point_total. E 'nel poliedro? Se sì, aggiungere al contatore point_internal. Do questi lotti (vedi la convergenza e l'errore di previsione vincolati.) Quindi

mass_polyhedron/mass_hypercube \approx points_internal/points_total.

per un momento di inerzia, appesantite ogni conteggio per il quadrato della distanza del punto rispetto all'asse di riferimento.

La parte difficile sta verificando se un punto è all'interno o al di fuori del tuo poliedro. Sono sicuro che ci sono algoritmi di geometria computazionale per questo.

1

Questo è trattato nel libro "Game Physics, Second Edition" di D. Eberly. Il codice chapter 2.5.5 e il codice di esempio sono disponibili online. (L'ho appena trovato, non l'ho ancora provato.)

Si noti inoltre che il poliedro non deve essere convesso perché le formule funzionino, deve essere solo simple.