Uma pergunta complexa e demorada que, admito, ainda não entendi muito bem, então tentarei explicar o melhor que puder.
Versão curta: Existe uma fórmula geral de c ++ / physx para calcular tensores de inércia com base na forma de um objeto?
Versão longa: Para nossa física, precisamos especificar os tensores de inércia x, ye z. Atualmente, a maneira como fazemos é praticamente uma proporção baseada na massa. Portanto, se um objeto é longo no eixo X e fino em Y e Z, e a massa é 10000, definiremos Z e Y como 7000 e X como 3000. (Isso não é exato, mas apenas para dar uma idéia)
Isso funciona relativamente bem, mas nosso maior problema é que, quando há instabilidade nas articulações, precisamos adivinhar os tensores até descobrir o que funciona melhor. Isso pode consumir muito tempo se tivermos uma simulação de física muito grande e uma em mais de 20 juntas estiver causando a perda de estabilidade de todas as outras.
O que estou trabalhando é uma função que pega a caixa delimitadora de um objeto e, esperançosamente, calcula tensores relativamente precisos. Peguei algumas das contas de http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors e criei uma função que basicamente funciona da seguinte maneira para rotações semelhantes abaixo.
Ou se a rotação terminar, assim:
Então, isso parece me dar resultados semelhantes à maneira como temos feito isso, mas não quero mudar para esse caminho sem ter certeza de que funcionará para uso geral. Abaixo está o código para minha função com base na primeira imagem com um cubo e um pivô 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);
}
Não posso garantir que esta seja a maneira correta de fazê-lo (como a maneira mais precisa é usar a forma real em vez de uma caixa delimitadora) e não estou muito familiarizado com os tensores de inércia e a matemática, mas parece retornar números bastante semelhante ao que estávamos usando. Alguém aqui sabe se existe uma maneira melhor de fazer isso?