Ich habe eine ziemlich einfache Starrkörpersimulation in Python geschrieben. In meinem Code berechne ich die Winkelbeschleunigung mit folgender Formel:
angAcc = Drehmoment * Trägheitstensor ^ -1 (Zeile-Hauptmatrix-Reihenfolge beachten)
Jetzt ist das Drehmoment im Weltraum, also sollte mein Trägheitstensor auch im Weltraum sein. Mein Python-Code, der die Winkelbeschleunigungsberechnung durchführt, sieht folgendermaßen aus:
oriMat = quaternion.ToMatrix(self.ori)
inertia_world = self.inertia_local * oriMat
matrix.Invert(inertia_world)
angAcc = vector.Transform(self.totalTorque, inertia_world)
oriMat ist effektiv eine Transformation von lokal zu Welt. self.totalTorque ist das Drehmoment im Weltraum. Dieser Code wandelt also die lokale Trägheit in die Weltträgheit um und verwendet ihre Umkehrung zusammen mit dem Weltdrehmoment, um die Weltwinkelbeschleunigung zu berechnen. Dieser Code funktioniert völlig einwandfrei.
Ich überlegte, ob ich die Winkelbeschleunigungsberechnung im lokalen Raum durchführen und schließlich lokales angAcc in WeltangAcc umwandeln könnte. Hier ist der Code:
oriMat = quaternion.ToMatrix(self.ori)
self.totalTorque = vector.Transform(self.totalTorque, matrix.Inverted(oriMat))
angAcc = vector.Transform(self.totalTorque, matrix.Inverted(self.inertia_local))
angAcc = vector.Transform(angAcc, oriMat)
Hier wollte ich die Drehmoment-Trägheitstransformation im lokalen Raum durchführen. Dazu transformiere ich self.totalTorque mithilfe der Umkehrung von oriMat in den lokalen Raum des starren Körpers. Dann mul ich das durch invertierte lokale Trägheit, um eine Winkelbeschleunigung im lokalen Raum zu erhalten. Schließlich transformiere ich die Winkelbeschleunigung in den Weltraum, indem ich sie mit oriMat transformiere.
Aus irgendeinem Grund liefert dieser Code kein korrektes Verhalten meines starren Körpers und ich kann wirklich nicht sagen warum. Hat jemand eine Idee?
quelle