Un peu d'une question complexe et longue que, je l'admets, je ne comprends pas encore très bien, donc je vais essayer de l'expliquer du mieux que je peux.
Version courte: Existe - t-il une formule générale c ++ / physx pour calculer les tenseurs d'inertie en fonction de la forme d'un objet?
Version longue: Pour notre physique, nous devons spécifier les tenseurs d'inertie x, y et z. Actuellement, la façon dont nous le faisons est à peu près juste un rapport basé sur la masse. Donc, si un objet est long sur l'axe X et mince sur Y et Z, et que la masse est de 10000, nous allons régler Z et Y sur 7000 et X sur 3000. (Ce n'est pas exact, mais juste pour donner une idée)
Cela fonctionne relativement bien, mais notre plus gros problème est lorsqu'il y a une instabilité articulaire quelque part, nous devons continuer à deviner les tenseurs jusqu'à ce que nous trouvions ce qui fonctionne le mieux. Cela peut prendre beaucoup de temps si nous avons une très grande simulation physique et qu'une articulation sur 20+ entraîne une perte de stabilité pour toutes les autres.
Je travaille sur une fonction qui prendra la boîte englobante d'un objet et, espérons-le, calculera des tenseurs relativement précis. J'ai pris quelques calculs à partir de http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors et créé une fonction qui fonctionne essentiellement comme la suivante pour des rotations similaires ci-dessous.
Ou si la rotation est sur une extrémité, comme ceci:
Donc, cela semble me donner des résultats similaires à la façon dont nous l'avons fait, mais je ne veux pas passer à cette méthode sans m'assurer qu'elle fonctionnera pour une utilisation générale. Voici le code de ma fonction basé sur la première image avec un cube et un pivot 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);
}
Je ne peux pas garantir que c'est la bonne façon de le faire (car la façon la plus précise est d'utiliser la forme réelle au lieu d'une boîte englobante) et je ne suis pas très familier avec les tenseurs d'inertie et les mathématiques, mais il semble renvoyer des nombres assez similaire à ce que nous utilisions. Est-ce que quelqu'un ici sait s'il existe une meilleure façon de procéder?