SweetDream
高歌一壶新酿酒,醉抱青山不必归。
    在 OpenGL 中视点(Viewing)和模型(Modeling)变换是互相关联的。想一想,在用相机拍摄物体时,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点变换;另外,我们也可以保持相机的固定位置,将物体移离相机,这就相当于模型转换。这样,在OpenGL中,以逆时针旋转物体就相当于以顺时针旋转相机。因此,我们必须把视点转换和模型转换结合在一起考虑,而对这两种转换单独进行考虑是毫无意义的。执行模型变换或视点变换之前,必须使用参数GL_MODELVIEW调用glMatrixMode()。关于指定矩阵的相乘顺序如果是以世界坐标为参考那么将以指定顺序相反的顺序进行(注意,世界坐标是不会改变的,而局部坐标会随物体而变化)。如果是以局部坐标系为参考那么就是安自然顺序进行。两种方法所写的代码是一样的,就是考虑问题的方法不同。如下图,在程序中指定的的顺序是先调用旋转函数再调用平移函数,这样如果以世界坐标为参考,那么按相反的顺序就是先平移,再旋转。如果按局部坐标为参考,那么先旋转,即旋转了局部坐标系。这个时候原来的x洲已经倾斜了,然后沿现在的x轴平移,也就是沿这个倾斜的x轴平移。两种不同的思考方式得到同样的代码和结果。


    在OpenGL中,有三个模型变换函数:glTranslate*()glRotate*()glScale*()。这几函数相当于生成指定矩阵,然后调用glMultMatrix*()

除了用模型转换命令执行视点转换之外(即反向移动物体)OpenGL实用库还提供了gluLookAt()函数,该函数有三个变量,分别定义了视点的位置、相机瞄准方向的参考点以及相机的向上方向。该函数的原型为:

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

该函数定义了视点矩阵,并用该矩阵乘以当前矩阵。eyex,eyey,eyez定义了视点的位置;centerxcenterycenterz变量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴线上的点;upxupyupz变量指定了向上向量的方向。

通常,视点转换操作在模型转换操作之前调用,以便模型转换先对物体发生作用。场景中物体的顶点经过模型转换之后移动到所希望的位置,然后再对场景进行视点定位等操作。模型转换和视点转换共同构成模型视景矩阵

posted on 2006-02-22 10:52  SweetDream  阅读(1053)  评论(0编辑  收藏  举报