D19.1.0 对gluLookAt,gluPerspective和glOrtho的理解

今天介绍对三个函数gluLookAt,gluPerspective和glOrtho的理解。先说这两个函数有什么用,再解释怎么用,然后再说说他两有啥关系。

有什么用

01 gluLookAt

gluLookAt体现的是你怎么看,这个函数可以让物体看起来放大了或者缩小了,也可以让x轴朝上,y轴朝上或者z轴朝上。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

opengl默认的坐标系是,水平方向向右为x轴正向,竖直向上为y轴正向,由屏幕指向外面为z轴正向。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

上图中我用手机拍酒杯,保持酒杯的位置不变。我可以把手机拿的再靠近一点,拿远一点,还可以拿高一点,拿矮一点。手机拿得远一些,酒杯就变得小一些;拿得近一些,酒杯就大一点。也就是说通过调整相机的位置,我们可以间接把物体放大或者缩小了。

然后手机可以向上,可以侧着,可以向下等等,可以以任何角度放置。在三维中就对应着哪个坐标轴垂直向上(不管哪个坐标轴向上,都要满足右手坐标系的关系),也就是说我们可以通过gluLookAt任意变换哪根坐标轴指向上方。

02 gluPerspective和glOrtho

gluPerspective和glOrtho解决我们看多少的问题和视觉效果的问题。

显示中的三维物体变换到屏幕里面的二维图像用到了投影。我们看到的屏幕就是二维的,不管上面的图片3D效果多么的好,那还是二维图像。投影有两种:正交投影和透视投影。

gluPerspective:先说什么是透视投影?我们人眼看到的物体在近处要比在远处看到的物体要大些,并且物体放得越远越小。就像晚上看月亮一样,看过去只有一丁点大,但是实际的大小我们都清楚。这就是透视投影的效果。

glOrtho:知道了什么叫透视投影,就比较好理解什么叫正交投影?通俗地讲,正交投影变换忽略物体远近时的大小缩放变化,将物体以原比例投影到截面(如显示屏幕)上。再通俗点,离我30cm的酒杯体积是20个单位,那把它放在离我100cm的地方,它的体积看过去并没有变小还是20个单位。注意这里是视觉效果,毕竟实际的大小不管放多远多是20个单位。

怎么用

函数原型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。例如(0,0,1)表示z轴朝上,(0,1,0)表示y轴才朝上,(1,0,0)表示x轴朝上。

上面的display()函数中:gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上,就是正常的情况。

gluLookAt()函数是通过移动照相机(使用视图变换)来观察这个立方体,而glTranslatef()函数是通过移动茶壶(使用模型变换)。

函数原型gluPerspective

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);

fovy是眼睛上下睁开的幅度,角度值,值越小,视野范围越狭小(眯眼),值越大,视野范围越宽阔(睁开铜铃般的大眼);

zNear表示近裁剪面到眼睛的距离,zFar表示远裁剪面到眼睛的距离,注意zNear和zFar不能设置设置为负值(你怎么看到眼睛后面的东西)。

aspect表示裁剪面的宽w高h比,这个影响到视野的截面有多大。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

函数原型glOrtho

void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

上面的参数都在这张图表明。

关系

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)400/(GLfloat)200, 10,300.0);
//glOrtho(-200,200, -200, 200,  -200, 200);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5,5,5,  0,0,0, 0,0,1);

代码从下往上理解:

先设置好观察空间,用gluLookAt设置好相机在(5,5,5)的位置看在坐标原点(0,0,0)位置的坐标,并且此时Z轴朝上。注意上面的坐标都是世界坐标系中的位置,世界坐标系的原点就是物体坐在的位置。

然后设置裁剪空间,使用gluPerspective设置视角为45度,长宽比为2,近平面离眼睛举例为10,远平面离眼睛举例为300。或者使用glOrtho设置了一个正方体区域,边长都是400。

所以我对它们的关系理解是:gluLookAt摆放好相机的位置,告诉大家相机要怎么看,gluPerspective和glOrtho告诉大家要看多少空间,以及看到的效果如何。

注:文章中即出现相机,又出现眼睛,在这篇文章中它们是同义词,处在相同的坐标。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值