Una pregunta un poco compleja y larga que, admito, todavía no entiendo muy bien, así que intentaré explicar lo mejor que pueda.
Versión corta: ¿Existe una fórmula general de c ++ / physx para calcular los tensores de inercia basados en la forma de un objeto?
Versión larga: para nuestra física, necesitamos especificar los tensores de inercia x, y y z. Actualmente, la forma en que lo hacemos es más o menos una relación basada en la masa. Entonces, si un objeto es largo en el eje X y delgado en Y y Z, y la masa es 10000, estableceremos Z e Y en 7000 y X en 3000. (Esto no es exacto, pero solo para dar una idea)
Esto funciona relativamente bien, pero nuestro mayor problema es cuando hay inestabilidad conjunta en algún lugar, tenemos que seguir adivinando los tensores hasta que descubramos qué funciona mejor. Esto puede llevar mucho tiempo si tenemos una simulación física muy grande y una de cada 20 o más articulaciones está causando que todas las demás pierdan estabilidad.
En lo que estoy trabajando es en una función que tomará el cuadro delimitador de un objeto y con suerte calculará tensores relativamente precisos. Tomé algunas de las matemáticas de http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors e hice una función que básicamente funciona de la siguiente manera para rotaciones similares a continuación.
O si la rotación está terminando, así:
Entonces, esto parece darme resultados que son similares a la forma en que lo hemos estado haciendo, pero no quiero cambiar de esta manera sin asegurarme de que funcione para uso general. A continuación se muestra el código para mi función basado en la primera imagen con un cubo y un pivote central.
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);
}
No puedo garantizar que esta sea la forma correcta de hacerlo (ya que la forma más precisa es usar la forma real en lugar de un cuadro delimitador) y no estoy muy familiarizado con los tensores de inercia y las matemáticas, pero parece que devuelve números bastante similar a lo que estábamos usando. ¿Alguien aquí sabe si hay una mejor manera de hacer esto?