Calcolo dei tensori d'inerzia


10

Un po 'di una domanda complessa e lunga che, lo ammetto, non capisco ancora molto bene, quindi cercherò di spiegare il meglio che posso.

Versione breve: esiste una formula generale c ++ / physx per calcolare i tensori d'inerzia basati sulla forma di un oggetto?

Versione lunga: per la nostra fisica, dobbiamo specificare i tensori di inerzia x, ye z. Attualmente il modo in cui lo facciamo è praticamente solo un rapporto basato sulla massa. Quindi se un oggetto è lungo sull'asse X e sottile su Y e Z e la massa è 10000, imposteremo Z e Y su 7000 e X su 3000. (Questo non è esatto, ma solo per dare un'idea)

Funziona relativamente bene ma il nostro problema più grande è quando c'è instabilità articolare da qualche parte, dobbiamo continuare a indovinare i tensori finché non scopriamo cosa funziona meglio. Questo può richiedere molto tempo se abbiamo una simulazione fisica molto grande e una su 20+ articolazioni fa perdere stabilità a tutte le altre.

Quello su cui sto lavorando è una funzione che prenderà il riquadro di delimitazione di un oggetto e, si spera, calcolerà tensori relativamente precisi. Ho preso parte della matematica da http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors e ho creato una funzione che sostanzialmente funziona come la seguente per rotazioni simili di seguito.

Cuboide solido di larghezza w, altezza h, profondità d e massa m inserisci qui la descrizione dell'immagine

O se la rotazione è terminata, in questo modo:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Quindi, questo mi sembra dare risultati simili al modo in cui lo abbiamo fatto, ma non voglio passare a questo modo senza assicurarmi che funzionerà per uso generale. Di seguito è riportato il codice per la mia funzione basato sulla prima immagine con un cubo e un perno centrale.

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

Non posso garantire che questo sia il modo giusto per farlo (poiché il modo più accurato è usare la forma effettiva invece di un rettangolo di selezione) e non ho molta familiarità con i tensori d'inerzia e la matematica, ma sembra restituire numeri abbastanza simile a quello che stavamo usando. Qualcuno qui capisce se esiste un modo migliore per farlo?


3
Se riesci a scomporre il tuo oggetto in tetraedro, dovresti essere in grado di utilizzare la linearità del tensore insieme alla formula di base per il momento di inerzia di un tetraedro (puoi trovarlo con Wolfram Alpha, ad esempio) per calcolare un esatto tensore. La mia preoccupazione per il metodo del rettangolo di selezione sarebbe che dipende davvero dalla quantità di BB riempita dall'oggetto; immagina la differenza tra un grasso ellissoide e una sottile molla elicoidale, per esempio.
Steven Stadnicki,

Grazie per l'input. E hai ragione, il mio problema principale si presenta quando c'è, diciamo, un oggetto a forma di "A", il BB farà tornare i tensori in modo errato. Controllerò le tue informazioni, grazie!
Mungoid

Sei il benvenuto - se vuoi che io lo spieghi più in dettaglio, dovrei essere in grado di ricavarne una risposta adeguata, ma dovrebbe essere sufficiente per iniziare.
Steven Stadnicki,

Se tu fossi disposto a farlo, sarebbe fantastico! Sto provando a capirlo da un po 'ma sono ancora un po' un principiante in questa zona, quindi
finisco

Risposte:


7

Stavo per suggerire che questo è un problema difficile perché le solite formulazioni basate sull'uso del teorema di Green per convertire gli integrali di volume in integrali di superficie non si applicano, e quindi in realtà devi fornire una decomposizione tetraedrica della tua figura - ma gira fuori che non è corretto. Finché la tua forma è di densità uniforme (che è un'approssimazione che stai già facendo comunque, presumibilmente e perfettamente ragionevole per la maggior parte delle circostanze), gli integrali di volume possono essere semplificati a integrali di superficie, e quest'ultimo può essere ulteriormente semplificato. Meglio ancora, sembra che ci sia un algoritmo di bell'aspetto e un codice là fuori in rete per farlo; dai un'occhiata a http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, La pagina di Brian Mirtich che descrive i suoi algoritmi per il calcolo dei momenti e del centro di massa. Dovrebbe coprire praticamente tutte le tue esigenze su questo fronte. Nota che questo è qualcosa che vorrai fare una volta, sia come strumento per esportare la forma o al momento dell'importazione, ma non qualcosa che dovrai fare per ogni fotogramma; è sufficiente memorizzare il tensore di inerzia attorno al centro di massa insieme al resto delle informazioni sulla forma e se è necessario trovare il tensore per momenti di inerzia attorno ad un altro asse, è possibile utilizzare i teoremi standard per ricavarlo.

Spero che questo dovrebbe coprire ciò di cui hai bisogno: se c'è altro su cui posso provare ad aiutarti, fammelo sapere!


4

Non l'ho mai fatto da solo, ma se dovessi scrivere una soluzione rapida per maglie arbitrarie probabilmente genererei abbastanza punti di massa all'interno dell'oggetto per approssimarlo e calcolare i tensori di inerzia da quelli.

I punti potrebbero essere generati in modo uniforme all'interno del riquadro di delimitazione della forma e quindi scartando quelli che si trovano all'esterno della forma effettiva. Ciò ridurrebbe il problema al solo controllo se un punto si trova all'interno di una forma.


0

Per la maggior parte delle applicazioni di gioco (ad es. "Fare esplodere roba"), probabilmente è sufficiente usare solo l'equazione per un solido rettangolare sopra indicato. A condizione che l'oggetto sia allineato all'asse, non una diagonale attraverso il rettangolo di selezione, che dovrebbe funzionare. Alcuni motori di fisica dei giochi, come ODE, usano solo i termini sulla diagonale principale del tensore di inerzia. Per loro, i tuoi oggetti devono essere almeno approssimativamente allineati agli assi per funzionare correttamente.

Ho usato l'algoritmo di Mirtich in Falling Bodies nel 1997. Funziona bene, ma devi avere una geometria pulita, una mesh chiusa non autointersecante topologicamente corretta. Se ci sono buchi, il calcolo dell'inerzia produrrà risultati totalmente falsi. Ho usato solo la geometria convessa, quindi ho eseguito prima QHull per ottenere uno scafo convesso a fini di collisione, quindi ho calcolato l'inerzia da quello.

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.