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.
O se la rotazione è terminata, in questo modo:
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?