gluPerspective的具体含义

OpenGL有两种投影:正射投影(垂直投影)和透视投影。透视投影通过指定一个平截头体来定义视见体的范围,平截头体如下图所示:

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

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

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

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

下图中又三个模型,这时我们想要看到全部三个模型,绘制方法见代码:

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);			// 清除屏幕及深度缓存
	glLoadIdentity();							// 重置当前的模型观察矩阵
    //glutSolidSphere(1.0, 400, 16);  //繪製一個球體
	/*当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
     glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。根据前面的次序,下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。注意在glTranslatef(x, y, z)中当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。*/
    
    glPushMatrix();
<span style="white-space:pre">	</span>glTranslatef(-2.5f,0.0f,-6.0f);						// 左移 1.5 单位,并移入屏幕 6.0
    glRotatef(rtri,0.0f,1.0f,0.0f);				// 绕Y轴旋转三角形
    
<span style="white-space:pre">	</span>glBegin(GL_TRIANGLES);							// 绘制三角形
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f( 0.0f, 1.0f, 0.0f);					// 上顶点
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f(-0.5f,0.0f, 0.0f);					// 左下
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f( 0.5f,0.0f, 0.0f);					// 右下
	glEnd();								// 三角形绘制结束
    glPopMatrix();
    
    //绘制四棱锥
    //glLoadIdentity();
    glPushMatrix();
    glTranslatef(4.0f, -0.5f, -6.0f);
    glRotatef(rtri, 0.0f, 1.0f, 0.0f);
    glBegin(GL_TRIANGLES);
    //繪製上頂點 左側面
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, 0.0f, 0.0f);
    
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.0f, 1.0f);
    //右側面
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
    
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.0f, 1.0f);
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, 0.0f, 0.0f);
    //右后側面
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, -1.0f);
    
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.0f, -1.0f);
    
    //左后側面
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
    
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.0f, -1.0f);
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, 0.0f, 0.0f);
    
    glEnd();
    glPopMatrix();
    //绘制茶壶
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, -8.0f);
    glutWireTeapot(2.0f);
    glPopMatrix();
	
    //設置當前使用的顏色為白色
    glColor3f(1.0, 1.0, 1.0);
	glFlush();
    
    rtri += 0.3;
    rquad += 0.2;
}

可以设置gluPerspective函数为:

gluPerspective(60.0f, fAspect, 1.0f, 800.0f);
效果如图:



如果Fovy的值无限接近180,则什么也看不到,想象你怎么将眼睛睁开的上下角度是平角,不可能吧;

这里设置为170,如图:


如果Fovy的值等于0,则什么也看不到(我闭上眼睛就是天黑);


Fovy值在0-180的范围内,值越大,感觉物体越远,值越小,感觉物体越近;

Fovy=10.0时:


Fovy值在180-360的范围内,你会发现渲染的图像反转了过来(不是镜像),就相当于你和你看到的东西一起倒了过来(脑补一下你眼前的东西跟你一起头朝地,脚朝上);

Fovy=270时的效果:


下面是Fovy=90的效果:


是不是反过来了(注意,我这里三角形(左边)和四棱锥(右边)都有旋转,主要看这三个模型的相对位置)。

zNear的值可以设置的很小,zFar的值可以设置的很大,这样看的范围更深一些;

如果一个模型的z坐标为ptz,ptz大于zFar或者ptz小于zNear你都将看不到改模型;

  • 49
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值