Cálculo de tensores de inercia

10

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.

Cuboide sólido de ancho w, altura h, profundidad d y masa m ingrese la descripción de la imagen aquí

O si la rotación está terminando, así:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

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?

Mungoid
fuente
3
Si puede descomponer su objeto en tetraedro, entonces debería poder usar la linealidad del tensor junto con la fórmula básica para el momento de inercia de un tetraedro (puede encontrar esto con Wolfram Alpha, por ejemplo) para calcular un exacto tensor. Mi preocupación con el método del cuadro delimitador sería que realmente depende de cuánto de su BB llene el objeto; imagine la diferencia entre un elipsoide gordo y un resorte helicoidal delgado, por ejemplo.
Steven Stadnicki
Gracias por el aporte. Y tiene razón, mi problema principal surge cuando hay, digamos, un objeto en forma de 'A', el BB hará que los tensores vuelvan incorrectamente. Comprobaré tu información, gracias!
Mungoid
De nada: si desea que desarrolle esto con más detalle, debería ser capaz de generar una respuesta adecuada, pero eso debería ser suficiente para que pueda comenzar.
Steven Stadnicki
Si estuvieras dispuesto a hacerlo, ¡sería increíble! He estado tratando de resolver esto por un tiempo, pero todavía soy un poco incipiente en esta área, así que termino cada vez más confundido = -)
Mungoid

Respuestas:

7

Iba a sugerir que este es un problema difícil porque las formulaciones habituales basadas en el uso del Teorema de Green para convertir integrales de volumen en integrales de superficie no se aplican, por lo que en realidad debe proporcionar una descomposición tetraédrica de su figura, pero resulta que eso no es correcto Siempre que su forma sea de densidad uniforme (que es una aproximación que ya está haciendo de todos modos, presumiblemente, y perfectamente razonable para la mayoría de las circunstancias), las integrales de volumen se pueden simplificar a integrales de superficie, y esta última se simplifica aún más. Mejor aún, parece haber un algoritmo y un código bastante atractivos en la red para hacer esto; echar un vistazo a http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, La página de Brian Mirtich que describe sus algoritmos para calcular momentos y centros de masa. Debería cubrir prácticamente todas sus necesidades en este frente. Tenga en cuenta que esto es algo que querrá hacer una vez, ya sea como herramienta para exportar la forma o en el momento de la importación, pero no es algo que deba hacer en cada cuadro; simplemente almacene el tensor de inercia sobre el centro de masa junto con el resto de la información de la forma, y ​​si alguna vez necesita encontrar el tensor para momentos de inercia sobre algún otro eje, puede usar los teoremas estándar para derivarlo.

Espero que esto cubra lo que necesita: si hay algo más en lo que pueda ayudar, ¡hágamelo saber!

Steven Stadnicki
fuente
4

Nunca lo he hecho yo mismo, pero si tuviera que escribir una solución rápida para mallas arbitrarias, probablemente generaría suficientes puntos de masa dentro del objeto para aproximarlo y calcular los tensores de inercia a partir de ellos.

Los puntos podrían generarse de manera uniforme dentro del cuadro delimitador de la forma y luego descartar los que están fuera de la forma real. Esto reduciría el problema a solo verificar si un punto está dentro de una forma.

msell
fuente
0

Para la mayoría de las aplicaciones de juegos (es decir, "hacer estallar cosas") simplemente usar la ecuación para un sólido rectangular dado anteriormente es probablemente lo suficientemente bueno. Siempre que el objeto esté alineado con el eje, no una diagonal a través del cuadro delimitador, eso debería funcionar. Algunos motores de física de juegos, como ODE, solo usan los términos en la diagonal principal del tensor de inercia. Para ellos, sus objetos deben estar al menos alineados aproximadamente con el eje para funcionar correctamente.

Utilicé el algoritmo de Mirtich en Falling Bodies en 1997. Funciona bien, pero debes tener una geometría limpia, una malla cerrada que no se auto intersecta topológicamente correcta. Si hay agujeros, el cálculo de la inercia producirá resultados totalmente falsos. Utilicé solo geometría convexa, por lo que ejecuté QHull primero para obtener un casco convexo con fines de colisión, luego calculé la inercia a partir de eso.

John Nagle
fuente