计算Unity3D中刚体的角动量

知道3D中的角动量是L = Iω惯性矩 乘以 角速度 ),我怎样在video游戏世界里计算它呢?

在unity3d我有对角惯性张量rigidbody.inertiaTensor和我知道角速度rigidbody.angularVelocity 我是正确的,当我这样计算?

 Vector3 angularMomentum = new Vector3( rigidbody.inertiaTensor.x * rigidbody.angularVelocity.x, rigidbody.inertiaTensor.y * rigidbody.angularVelocity.y, rigidbody.inertiaTensor.z * rigidbody.angularVelocity.z ); 

虽然,这留下了rigidbody.inertiaTensorRotation这使我认为这是不正确的。 究竟是什么引起了我的另一个问题: 在Unity3D中,惯性传感器和惯性传感器之间的关系是什么?

这是正确的。 在一些情况下,你会想要考虑到rigidbody.inertiaTensorRotationrigidbody.inertiaTensorRotation 。 它定义了惯性矩的旋转 。 但是,在大多数情况下,这只是四元身份。

在我看来,你在做什么有正确的基本forms。 但我认为, rigidbody.inertiaTensorRotation需要考虑,但我也不是百分百积极的。

但是我认为,一定是rigidbody.inertiaTensor相对于一些任意的坐标系是对角的,而rigidbody.angularVelocity最可能是相对于世界坐标轴计算的。 在这方面,简单地把两者相乘是不正确的。 首先需要将rigidbody.inertiaTensor或者rigidbody.angularVelocity旋转成一个共同的框架。 也许那么, rigidbody.inertiaTensorRotation将把惯性张量带入世界范围,从而允许与角速度相乘。

至less这是我的想法。 有谁知道我的角速度假设是否正确?

我深入了解了这一点,并得出了以下的理解。 虽然我可以改正,所以如果有人知道更多,请join。但现在,这是我认为正在发生的事情。

rigidbody.inertiaTensor包含惯性张量或主惯性矩的对角化元素。 这些对应于刚体的一些内部对称性,并且相对于一些轴来表示,这些轴不必是用于描述身体的相同的局部轴。 rigidbody.inertiaTensorRotation为您提供expression惯性张量相对于身体局部框架所需的旋转。 然而, rigidbody.angularVelocity是用世界坐标表示的。

因此,在最一般的情况下,我们需要将两个旋转应用到对角惯性张量上,以便通过Unity的角速度vector来find角动量: rigidbody.inertiaTensorRotaion将张量的旋转定义到身体的局部框架和rigidbody.rotation将变换的张量的rigidbody.rotation定义为世界的框架。

如何做到这一点的确切实施可能会变得很难看。 我想在我所学的标准math框架内工作:张量和旋转的matrix,而不是摆脱Unity的四元数。 我写了自己的课,虽然Unity有Matrix4x4类,可以工作。 但是在处理额外的维度时,你必须要小心,因为惯性张量和旋转通常被写成3×3matrix。 四元数和旋转之间的关系可以很容易find。

另外需要注意的是,在旋转惯性张量时,你需要做一个相似变换(在这里有一个Wolfram Math World的链接,但显然我没有足够的声望点来包含它)。 (我不知道这个东西写在乳胶上,所以下面的记号会很难看)你要:

I_new = R * I_old * RT

其中I_new是新变换的matrix(惯性张量), R是与四元数之一相对应的旋转matrix, RT是该matrix的移位, I_old是您正在变换的原始惯性张量。

我希望这可以使用。 再一次,如果有人知道这是不正确的,请张贴和纠正我。