OpenGL视图变换及gluLookAt

时间:2021-02-21 20:05:18

视图变换,即相机变换,其作用是把相机放在指定位置并使其对准场景

该变换是针对相机的变换,不会影响到模型视图变换决定了相机的位置与方向,因此可以通过视图变换来改变相机位置与方向,从而达到从各个不同的位置与角度来观察同一个物体的情形。

进行视图变换使用的函数为:

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

第一组eyex, eyey,eyez为相机在世界坐标的位置

第二组centerx,centery,centerz为相机镜头对准的物体在世界坐标的位置

第三组upx,upy,upz 为相机向上的方向在世界坐标中的方向(头顶朝向的方向)

 

若没有调用gluLookAt来自定义相机位置与方向,那么会使用默认视图变换,即

gluLookAt(	0.0, 0.0, 0.0,			0.0, 0.0, -1.0,			0.0, 10, 0.0);

也就是:将相机放在(0,0,0)原点位置,镜头瞄准(0,0,-1),即z轴负方向,并把朝上向量指定为(0,1,0),也就是y轴正方向。

看到的场景就是xoy平面,其中x轴正方向向右,y轴正方向向上。


特别注意:进行视图变换之前,要调用glLoadIdentity()来将当前矩阵重置为单位矩阵因为在执行该视图变换之前,很可能已经进行了一次变换,若不调用glLoadIdentity()将当前矩阵重置,那么就会将上次的变换结果与这一次的视图变换进行组合。

设单位矩阵为Mo,当前矩阵为Mc,变换矩阵为Mt。

OpenGL中变换的方式是令当前矩阵与变换矩阵相乘,然后将结果存储在当前矩阵中:当前矩阵   =       当前矩阵*变换矩阵

即:Mc   =       Mc*Mt。

当前矩阵有且只有一个。故若在进行视图变换之前不调用glLoadIdentity(),可能会出现非预期的结果。

也就是说,在调用gluLookAt之前,需要调用glLoadIdentity()

 

gluLookAt()的调用应该在场景绘制初glLoadIdentity()函数调用之后,在所有的glTranslate*()glRotate*()glScale*()函数调用之前调用,且只调用一次,因为在每看到一幅确定的画面前,照相机的位置只能有一个。