我用Python编写了一个非常简单的刚体模拟。在我的代码中,我使用公式计算角加速度:
angAcc =扭矩*惯性张量^-1(注:行-主矩阵顺序)
现在,扭矩在世界空间,所以我的inertiaTensor也应该在世界空间.执行角加速度计算的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转换为world 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的逆变换将oriMat变换为刚体的局部空间。然后通过倒置的局部惯性来获得局部空间的角加速度。最后,通过与oriMat的转换,将角加速度转换为世界空间。
由于某些原因,这段代码不能给出我的刚体的正确行为,我真的不知道为什么。有人想到办法了吗?
发布于 2015-07-08 01:36:44
你说:
然后通过倒置的局部惯性来获得局部空间的角加速度。
这似乎是错误的,因为“倒置的局部惯性”就是“世界惯性”,所以你把“那个”放到世界空间,而你想把它放在局部空间……
因此,代码应该是:
// 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)
https://gamedev.stackexchange.com/questions/98927
复制相似问题