当我们在OpenGL或Directx中需要对模型(比如飞机)的姿态进行旋转变化时,可能会对变化顺序有些疑惑,不知道偏航、俯仰、滚转三者的先后顺序。

首先我们需要了解的是:姿态的变换是针对模型本体的坐标系,比如我们规定飞机的头指向-z轴,飞机的右侧指向x轴,飞机的上方指向y轴。无论模型如何转动,模型的本体坐标系始终相对模型不发生变化,我们的姿态变换也是针对模型本体坐标系的,每一次旋转都是针对上一次旋转后的模型本体坐标系进行旋转,也就是内旋。在模型的本体坐标系下,模型的姿态转动顺序为偏航-俯仰-滚转,即yaw-pitch-roll,对应的轴为y-x-z。

其次,模型所存在的世界有一个固定的坐标系,这个坐标系在模型创建出来的时候便已经固定了,我们可以通俗的理解为obj模型文件中的组成模型样子的点是固定不变的,这些固定不变的点存在于一个固定的坐标系下,即屏幕右侧为x,屏幕上为y,屏幕外为z(也可能不是该轴向,按实际来定)。绕固定的坐标轴旋转即为外旋。

姿态的变换是相对模型本体的,是内旋,这是不容置疑的,即为偏航-俯仰-滚转。

我们需要注意的是,矩阵乘法是外旋。当我们通过矩阵对模型进行姿态变化时,正确的操作是先滚转,再俯仰,最后偏航。

但是为什么先滚转就是对的呢,我的理解是这样的,滚转首先肯定是绕机头轴向的滚转才有实际意义,假如我们先绕y偏航45度,然后绕z或x俯仰,最后发现最后那个轴转都不是正确的滚转。

在Directx中 即为 点坐标×滚转矩阵×俯仰矩阵×偏航矩阵,而在opengl中则为 偏航矩阵×俯仰矩阵×滚转矩阵×点坐标