Eine komplexe und langwierige Frage, die ich, wie ich zugeben muss, noch nicht ganz gut verstehe, also werde ich versuchen, sie so gut wie möglich zu erklären.
Kurzversion : Gibt es eine allgemeine c ++ / physx-Formel zur Berechnung von Trägheitstensoren basierend auf einer Objektform?
Lange Version: Für unsere Physik müssen wir x-, y- und z-Trägheitstensoren angeben. Derzeit ist die Art und Weise, wie wir es tun, so ziemlich nur ein Verhältnis, das auf der Masse basiert. Wenn also ein Objekt auf der X-Achse lang und auf Y und Z dünn ist und die Masse 10000 beträgt, setzen wir Z und Y auf 7000 und X auf 3000. (Dies ist nicht genau, sondern nur, um eine Idee zu geben.)
Dies funktioniert relativ gut, aber unser größtes Problem ist, dass wir bei einer Gelenkinstabilität irgendwo Tensoren erraten müssen, bis wir herausgefunden haben, was am besten funktioniert. Dies kann sehr zeitaufwändig werden, wenn wir eine sehr große Physiksimulation haben und eines von mehr als 20 Gelenken dazu führt, dass alle anderen an Stabilität verlieren.
Ich arbeite an einer Funktion, die den Begrenzungsrahmen eines Objekts nimmt und hoffentlich relativ genaue Tensoren berechnet. Ich habe einige der Berechnungen von http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors übernommen und eine Funktion erstellt, die im Wesentlichen wie folgt für ähnliche Rotationen unten funktioniert.
Oder wenn die Rotation zu Ende ist, wie folgt:
Dies scheint mir Ergebnisse zu liefern, die denen ähneln, die wir bisher durchgeführt haben, aber ich möchte nicht auf diese Weise wechseln, ohne sicherzustellen, dass sie für den allgemeinen Gebrauch funktionieren. Unten ist der Code für meine Funktion basierend auf dem ersten Bild mit einem Würfel und einem mittleren Drehpunkt.
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);
}
Ich kann nicht garantieren, dass dies der richtige Weg ist (da der genaueste Weg darin besteht, die tatsächliche Form anstelle eines Begrenzungsrahmens zu verwenden), und ich bin mit Trägheitstensoren und der Mathematik nicht sehr vertraut, aber es scheint Zahlen zurückzugeben ziemlich ähnlich zu dem, was wir benutzt haben. Weiß hier jemand zufällig, ob es einen besseren Weg gibt, dies zu tun?