Per l'uso in una simulazione di corpo rigido, voglio calcolare il tensore di massa e di inerzia (momento di inerzia), dato una maglia triangolare che rappresenta il limite dell'oggetto (non necessariamente convesso) e che assume densità costante all'interno.Come posso calcolare la massa e il momento di inerzia di un poliedro?
risposta
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.
Vorrei dare un'occhiata a vtkMassProperties. Questo è un algoritmo abbastanza robusto per il calcolo di questo, data una superficie che racchiude un volume.
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.
Se l'oggetto non è convesso (e talvolta anche se lo è), la tessellazione in tet è molto più complicata del semplice calcolo della massa direttamente. –
@Reed Copsey: Prenderò la tua parola per questo. La soluzione che ho offerto è certamente ingenua. – dmckee
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.
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.
- 1. Come posso calcolare la mediana e la deviazione standard di un flusso di numeri in Perl?
- 2. Centroide di poliedro convesso
- 3. Un metodo per calcolare il centro di massa da un file .stl (stereo litografia)?
- 4. Come determinare se un poliedro è convesso?
- 5. Calcolo del centroide e del volume di un poliedro quando i vertici sono dati
- 6. Come posso calcolare la massima stima di probabilità in Python
- 7. Invio di e-mail di massa richiesta
- 8. Dato l'IP e la maschera di rete, come posso calcolare l'indirizzo di rete usando bash?
- 9. jquery ui drag easing/inerzia
- 10. In Python, come posso calcolare la correlazione e la significatività statistica tra due matrici di dati?
- 11. Multithreading di un file di massa leggere
- 12. Come posso calcolare il livello di dB audio?
- 13. E 'impossibile calcolare la differenza tra il MaxBound e il MinBound di un tipo Enum?
- 14. Come calcolare la frammentazione?
- 15. Algoritmo di voto: come calcolare il grado?
- 16. Come posso mostrare il valore di un #define al momento della compilazione di gcc
- 17. Come calcolare la percentuale di clic
- 18. inserimenti di massa con SQLite e CoreData
- 19. come calcolare e utilizzare il valore medio di cvMat
- 20. Cosa ha un tensore di inerzia pari a zero in Bullet?
- 21. Rails 4: accept_nested_attributes_for e assegnazione di massa
- 22. Come calcolare il seno di numeri enormi
- 23. Come calcolare la latenza
- 24. Ricerca percorso astar di massa
- 25. Come posso calcolare l'altezza e la larghezza dello schermo in fase di esecuzione?
- 26. è SSIS Inserimento di massa lo stesso di un Inserimento di massa
- 27. Come calcolare la complessità esatta di un algoritmo?
- 28. Come utilizzare l'inserimento di massa di Redis?
- 29. Come posso calcolare la variazione percentuale all'interno di un gruppo per più colonne in R?
- 30. Come posso popolare un ComboBox al momento dell'installazione in WiX?
Bello. Avrei dovuto vederlo È un'estensione del vecchio approccio "conta le traversate" all'apprendimento se un punto è interno o esterno a una forma. – dmckee