本节书摘来异步社区《游戏开发物理学(第2版)》一书中的第1章,第1.8节,作者: 【美】David M Bourg , Bryan Bywalec 译者: 崔力强 , 魏广程 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.8 惯性张量
让我们再来看一眼角运动方程,注意到其中的惯性项写作粗体的I,也就是说它是一个向量。你已经看到在处理二维问题时,惯性项可以简化为表示为绕转动轴的转动惯量的标量。但是,在三维问题中物体可以围绕三个转动轴来转动。此外,在广义三维问题中,物体可以绕任意轴转动。因此,对于三维问题,I实际上是一个3×3矩阵——一个二阶张量。
为了明白转动惯量阵从何而来,你必须重新观察角动量方程:
其中ω是物体的角速度、r是物体重心到每个原子质量dm的距离、(r×(ω ×r))dm是每个原子质量的角动量。括号中的项叫作三重向量积(triple vector product),可以用向量积展开。r和ω都是向量,可以表达如下:
展开三重向量积项得:
让我们替换以下项来简化该方程:
通过将这些看起来有些熟悉的I变量替换进展开后的方程,得:
通过令I等于矩阵:
进一步简化可得如下方程:
你已经知道了I表示转动惯量,并且这些对你来说看起来熟悉的量是相对于三个坐标轴的转动惯量Ixx、Iyy和Izz。其他项被叫作惯性积(products of inertia)。如图1-9所示。
就好像平行轴定理一样,也存在一个能够应用于惯性积的公式:
其中Io项表示局部惯性积(即相对于通过物体重心的轴的惯性积),m是物体的质量,d项是通过物体的坐标轴到距其一定距离平行轴的距离。如图1-10所示。
你会注意到,对于之前的图1-3至图1-7中的简单形状,我们没有给出任何惯性积公式。其原因是它们的转动惯量都是关于这些形状的主轴(principal axes)的。对于任何物体,都存在一些叫作主轴的轴,对于这些轴而言,惯性张量公式中的惯性积项全部为零。
对于之前出现的简单几何体,每个坐标轴都表现为一个对称面(plane of symmetry),而对于表现为对称面的轴,其对于该轴的惯性积为零。你可以通过观察惯性积公式来得出这个结论。例如:如果物体对于y轴对称,所有在积分中的(xy)项都会被对应的项消去−(xy),如图1-11所示。
但是,复合物体可能一个对称面也没有,同时主轴的方向也变得不明显。进一步来说,有时候对于给定的刚体,由于使用主轴非常困难,你可能根本不希望用主轴作为局部坐标系的轴。例如,对于第7章的讨论中提及的FlightSim中的飞机,在这里你会将你的局部坐标系设计成相对于飞行员的前后、上下、左右。这样的方向利于确定机翼、尾翼、升降舵等彼此的相对位置,但这些轴并不利于表现飞机的主轴。最后的结果是你会用那些方便的但是需要处理非零的惯性积的轴(这些惯性积可能是正值也可能是负值)。
我们已经向你展示过如何计算由一些简单元素组合起来的复合物体的转动惯量。由于转动惯量项的计算过程通常都一样,除非你的元素的局部惯性积是零。这种情况下只有在将你的元素表现为简单的几何体时才会出现,例如:粒子、球体、长方体等。在这种情况下,对物体的惯性积起主要贡献的将会是每个元素的坐标轴变换项。
在看示例代码之前,让我们先来修订一下所需要的基本数据结构,引入一个新的项来储存元素的局部转动惯量代码如下:
在这里,我们用向量来表示三个局部转动惯量项,同时我们假设局部惯性积对每个元素来说都是零。
下面的示例代码展示了如何计算给定组件的惯性张量:
注意,惯性张量的计算是相对于通过组合刚体重心的轴的,因此当应用坐标轴变换公式时,要确保每个元素更正后的坐标系是相对于组合刚体重心的。
我们也应当注意这里对于惯性张量的计算是在由物体确定的坐标系,或者说是局部坐标系中的。在本章前面我们已经讨论过,最好能够使用局部坐标系来对角运动方程进行重写,并且使用局部惯性张量来保存,以便减少你实时仿真中的一些数字运算。