计算机图形与OpenGL学习七(三维几何变换2.一般三维旋转)
一般三维旋转
对于绕与坐标轴不一致的轴进行旋转的变换矩阵,可以利用平移与坐标轴旋转的复合而得到。首先将指定旋转轴经移动和旋转变换到坐标轴之一,然后对该坐标轴应用适当的旋转矩阵。最后将旋转轴变回到原来位置。
在某些特殊情况下,例如将对象绕平行于某坐标轴的轴旋转、可以通过下列变换顺序来得到所需的旋转矩阵:
i. 平移对象使其旋转轴与平行于该轴的一个坐标轴重合;
ii. 绕该坐标轴完成指定的旋转
iii. 平移对象将其旋转轴移回到原来的位置。
此变换的矩阵表示为:
如果对象绕与每个坐标轴均不平行的轴旋转,则需要进行额外的变换。此时,还需要进行使旋转轴与某一选定坐标轴对其的旋转,以后要将此轴变回到原始位置。若给定旋转轴和旋转角,我们可以按照5个步骤来完成所需旋转:
i. 平移对象,使旋转轴通过坐标原点;
ii. 旋转对象是的旋转轴与某一坐标轴重合;
iii. 绕该坐标轴完成指定的旋转
iv. 利用逆旋转使旋转轴回到其原始方向;
v. 利用逆变换使坐标轴回到其原始位置。
任意旋转轴可以由两个坐标点确定,或通过一个坐标点和旋转轴与两个坐标轴件的方向角来确定,利用两点坐标定义的轴向量为:
沿旋转轴的单位向量u则定义为:
第一步的操作,是使旋转轴通过坐标原点,我们平移P1到坐标原点,平移矩阵是:
第二步的操作是,将旋转轴与坐标轴重合(取z轴)。利用两次坐标轴旋转来完成这一对齐。有多种方法可以完成,我们可以首先绕x轴旋转(将向量u变换到xz平面),再绕y轴旋转(将u变到z轴上)。
首先,我们要计算使u变换到xz平面的旋转角的正弦和余弦值,可以建立绕x轴旋转的变换矩阵。改选转交是u在yz平面上的投影与z轴正弦的夹角,如图1。
图1将向量u变换到xz平面
要计算α的正弦值,可以计算u’和uz的叉积,其形式为:
由于已使用向量u的分量来得出cosα和sinα的值,因此可以建立绕x轴将u旋转到xz平面的旋转矩阵(若看不懂,请看上一节绕坐标轴旋转的推导):
下一步,需要将xz平面上的单位矩阵,绕y轴旋转到z轴的正方向。如图2。
图2将向量u’’变换到z轴上
同样,按照上述的变换方式,需求得β的正弦余弦值。
绕y轴后的变换形式为:
现在我们已经将旋转轴对其到z轴的正方向,给定的旋转角θ就可以用关于z轴的旋转:
最后还需要将旋转轴变回到原来的位置,即进行逆变换,可以定义这一系列的操作为一个复合矩阵。
至此,变换结束,在下一节中,我们将在OpenGL中实现变换。