物理学:计算世界与本地空间的角加速度

我有一个用Python编写的非常简单的刚体仿真。 在我的代码中,我使用公式计算角加速度:

angAcc =转矩*惯性张量^ -1(注意行 – 主matrix顺序)

现在,扭矩在世界空间,所以我的惯性传感器也应该在世界空间。 我做的角加速度计算的Python代码如下所示:

oriMat = quaternion.ToMatrix(self.ori) inertia_world = self.inertia_local * oriMat matrix.Invert(inertia_world) angAcc = vector.Transform(self.totalTorque, inertia_world) 

oriMat是有效的本地到世界的转换。 self.totalTorque是世界空间的扭矩。 所以这个代码将局部惯性转换为世界惯性,并将其与世界扭矩一起用于计算世界角加速度。 这段代码工作得很好。

我想知道是否可以在当地空间进行角加速度计算,并最终将当地的angAcc转换为世界的AngAcc。 代码如下:

 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) 

在这里我想做一下局部空间的转矩惯性变换。 为此,我使用oriMat的逆来将self.totalTorque转换为刚体的局部空间。 然后我通过倒置局部惯性来获得局部空间中的角加速度。 最后,我通过用oriMat转换角加速度到世界空间。

由于某种原因,这段代码不会产生刚体的正确行为,我真的不知道为什么。 任何人有一个想法?

你说 :

然后我通过倒置局部惯性来获得局部空间中的角加速度。

这似乎是错误的,因为“倒转的局部惯性”是“世界惯性”,所以当你想要在当地空间时,把“那个”放到世界空间中。

所以代码应该是:

 // oriMat: local -> world oriMat = quaternion.ToMatrix(self.ori) // put total torque in local space self.totalTorque = vector.Transform(self.totalTorque, matrix.Inverted(oriMat)) // multiply local torque with local inertia to get angAcc in local space angAcc = vector.Transform(self.totalTorque, self.inertia_local)) // put angAcc in world space angAcc = vector.Transform(angAcc, oriMat)