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为相机在世界坐标的位置

第二组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*()函数调用之前调用,且只调用一次,因为在每看到一幅确定的画面前,照相机的位置只能有一个。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值