opengl学习(五)------ 视图(二)

     今天说一下模型变换。

模型变换有三种变换:移动,旋转,拉伸。对应到函数就是glTranslate*(),glRotate*()和glScale*()。这三个函数相当于产生一个适当的矩阵,然后当前矩阵与这个矩阵相乘,得出变换后的矩阵,也就呈现了变换效果。

看一下函数定义:

Void glTranslate{fd}(TYPE x, TYPE y, TYPE z);

     把当前矩阵与一个表示移动物体的矩阵相乘,这个移动矩阵由x、y和z值指定或者在局部坐标系统中移动相同的数量。

使用(0.0, 0.0, 0.0)为参数调用glTranslate*()是单位操作,也就是说,物体将不进行移动。


void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);


     把当前矩阵与一个表示移动物体(或物体的局部坐标系统)的矩阵相乘,以逆时针方向绕着从原点到点(x, y, z)的直线进行旋转。angle参数指定了旋转的度数。

ps:远离旋转轴的物体比靠近旋转轴的物体的旋转幅度更大(轨道更长)。另外,如果angle参数为零,glRotate*()函数就不能产生任何效果。


void glScale{fd}(TYPE x, TYPE y, TYPE z);


      把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩和反射的矩阵相乘。这个物体中每个点的x、y和z坐标与对应x、y和z参数相乘。使用局部坐标系统方法,局部坐标系统的轴将由x、y和z因子拉伸、收缩或者反射,相关联的物体也根据它们进行变换。

     单位缩放值为:(1.0, 1.0, 1.0).

ps:如果缩放值为0,它会把所有沿这个轴的物体坐标收缩为0.通常,这并不是一种好的做法,因为这种操作是无法还原的。从数学角度而言,这种矩阵是没有逆矩阵的。但是对于有些光照计算,逆矩阵又是必须的。一般而言,如果一个坐标系统需要收缩为0,应该使用投影矩阵,而不是模型视图矩阵。
 

      现在我们假设这样两种变换:一个物体,沿着原点绕z轴逆时针旋转45度,然后再沿x轴向下进行平移。显然,进行了这两种变换之后的物体是处于x轴上的。那么,如果这个物体先沿着x轴向下平移,然后再绕z轴进行45度的逆时针旋转,物体处在哪里呢?物体处于y = x的直线上。看起来是在做相同的操作,但是变换的顺序不同,变换的结果也是不相同的。       上面这样的变换是因为我们固定了坐标系统,物体进行变换时,是以这个固定的坐标系统中心点为参考点的。如果换一种思路,使用一个可以局部移动的坐标系统,将会发生怎样的不同呢。所谓的局部移动坐标系统,是假设坐标系统随着物体的移动而移动。就好吧上面将的例子,移动---旋转。

     首先,假设这个物体拥有一个移动的坐标系统。当这个物体沿着x轴移动时,这个局部坐标系统也随着物体沿x轴移动。然后物体再进行旋转(沿原点),就会是绕着已经移动的局部坐标系统的原点进行旋转。旋转之后的物体在固定坐标系统中,还是处于x轴上,与旋转--移动变换效果相同。

相关推荐