Cálculo de tensores de inércia

10

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.

Cubóide sólido de largura w, altura h, profundidade de massa m insira a descrição da imagem aqui

Ou se a rotação terminar, assim:

insira a descrição da imagem aqui insira a descrição da imagem aqui

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?

Mungoid
fonte
3
Se você pode decompor seu objeto em tetraedro, deve poder usar a linearidade do tensor junto com a fórmula básica para o momento de inércia de um tetraedro (você pode encontrar isso com Wolfram Alpha, por exemplo) para calcular uma precisão exata. tensor. Minha preocupação com o método da caixa delimitadora seria que realmente depende de quanto do seu BB o objeto preenche; imagine a diferença entre um elipsóide gordo e uma mola helicoidal delgada, por exemplo.
Steven Stadnicki
Obrigado pela contribuição. E você está correto, meu problema principal surge quando existe, digamos, um objeto em forma de 'A', o BB fará com que os tensores voltem incorretamente. Vou verificar suas informações, obrigado!
Mungoid
De nada, se você gostaria que eu detalhasse isso com mais detalhes, eu seria capaz de criar uma resposta adequada, mas isso deve ser suficiente para você começar.
Steven Stadnicki
Se você estiver disposto, isso seria incrível! Eu tenho tentado descobrir isso por um tempo, mas eu ainda sou um pouco de um calouro nesta área assim que eu acabar ficando-me mais e mais confuso = -)
Mungoid

Respostas:

7

Eu sugeriria que esse é um problema difícil, porque as formulações usuais baseadas no uso do Teorema de Green para converter integrais de volume em integrais de superfície não se aplicam e, portanto, é necessário fornecer uma decomposição tetraédrica de sua figura - mas acontece fora que isso não está correto. Desde que sua forma seja de densidade uniforme (que é uma aproximação que você já está fazendo de qualquer maneira, presumivelmente e perfeitamente razoável para a maioria das circunstâncias), as integrais de volume podem ser simplificadas para integrais de superfície, e a última simplificada ainda mais. Melhor ainda, parece haver um algoritmo e código muito bonito na rede para fazer isso; consulte http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, Na página de Brian Mirtich, descrevendo seus algoritmos para calcular momentos e centro de massa. Deve cobrir praticamente todas as suas necessidades nesta frente. Observe que isso é algo que você deseja fazer uma vez, como uma ferramenta na exportação da forma ou no momento da importação, mas não como algo que você precisará fazer em todos os quadros; basta armazenar o tensor de inércia sobre o centro de massa junto com o restante das informações de forma e, se você precisar encontrar o tensor para momentos de inércia sobre algum outro eixo, poderá usar os teoremas padrão para derivá-lo.

Espero que isso cubra o que você precisa - se houver mais com o que eu possa tentar ajudar, me avise!

Steven Stadnicki
fonte
4

Eu nunca fiz isso sozinho, mas se tivesse que escrever uma solução rápida para malhas arbitrárias, provavelmente geraria pontos de massa suficientes dentro do objeto para aproximar e calcular os tensores de inércia daqueles.

Os pontos podem ser gerados uniformemente dentro da caixa delimitadora da forma e, em seguida, descartando aqueles que estão fora da forma real. Isso reduziria o problema a apenas verificar se um ponto está dentro de uma forma.

msell
fonte
0

Para a maioria das aplicações de jogos (por exemplo, "explodir coisas"), apenas o uso da equação para um sólido retangular dado acima provavelmente é bom o suficiente. Desde que o objeto esteja alinhado ao eixo, não uma diagonal na caixa delimitadora, que funcione. Alguns mecanismos de física de jogos, como o ODE, usam apenas os termos na diagonal principal do tensor de inércia. Para eles, seus objetos precisam estar pelo menos aproximadamente alinhados ao eixo para funcionar corretamente.

Eu usei o algoritmo de Mirtich em Falling Bodies em 1997. Funciona bem, mas você deve ter uma geometria limpa - uma malha fechada sem interseção topologicamente correta. Se houver buracos, o cálculo da inércia produzirá resultados totalmente falsos. Como usei apenas geometria convexa, executei o QHull primeiro para obter um casco convexo para fins de colisão e depois calculei a inércia a partir disso.

John Nagle
fonte