OpenGL 自制API gluPerspective

函数原型
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

首先得设置gluPerspective,来看看它的参数都表示什么意思
fovy,这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔,
aspect,这个好理解,就是实际窗口的纵横比,即x/y
zNear,这个呢,表示你近处,的裁面,
zFar表示远处的裁面,

如果还没有理解就继续看,
我们知道,远处的东西看起来要小一些,近处的东西看起来会大一些,这就是透视原理
如下图所示

假设那两条线表示公路,理论上讲,它们的两条边是平行的,
但现实情况中,它们在远方(可以无限远)总要相交于一点,
实际线段AB的长度=CD的长度,只是在此例中使用了透视角,故会有如上的效果,是不是很接近现实的情况?

结合我们刚才这两个函数
zNear,眼睛距离近处的距离,假设为10米远,请不要设置为负值,OpenGl就傻了,不知道怎么算了,
zFar表示远处的裁面,假设为1000米远,
就是这两个参数的意义了,

再解释下那个"眼睛睁开的角度"是什么意思,
首先假设我们现在距离物体有50个单位距离远的位置,
在眼睛睁开角度设置为45时,请看大屏幕:

我们可以看到,在远处一个球,,很好玩哈,
现在我们将眼睛再张开点看,将"眼睛睁开的角度"设置为178
(180度表示平角,那时候我们将什么也看不到,眼睛睁太大了,眼大无神)

我们只看到一个点,,,,,,,,,,,,,,,,,,,,,,,,,,,
因为我们看的范围太大了,这个球本身大小没有改变,但是它在我们的"视界"内太小了,

反之,我们将眼睛闭小些,改为1度看看会出现什么情况呢?

在我们距离该物体3000距离远,"眼睛睁开的角度"为1时,我们似乎走进了这个球内,这个是不是类似于相机的焦距?

当我们将"透视角"设置为0时,我们相当于闭上双眼,这个世界清静了,

我们什么也看不到,,,,,,,,,

时间: 2024-12-11 12:04:03

OpenGL 自制API gluPerspective的相关文章

OpenGL 自制API 4

1.  由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”.设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样: glMatrixMode(GL_MODELVIEW); 2.通常,我们需要在进行变换前把当前矩阵设置为单位矩阵.这也只需要一行代码: glLoadIdentity(); 3.glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘.三个参数分别表示了在三个坐标上的位移值. 4.glRotate*,

OpenGL 自制API 3

颜色: RGBA模式中,每一个像素会保存以下数据:R值(红色分量).G值(绿色分量).B值(蓝色分量)和A值(alpha分量).其中红.绿.蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍. 在RGBA模式下选择颜色是十分简单的事情,只需要一个函数就可以搞定. glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R.G.B的值,而A值采用默认:四个参数的版本可以分别指定R.G.B.A的值.例如: void glColor3f(GLfl

OpenGL 自制API 2

多边形: 逆时针方向为正面,反之亦然. 1.glPolygonMode(GL_FRONT, GL_FILL);                        // 设置正面为填充方式 2.glPolygonMode(GL_BACK, GL_LINE);                          // 设置反面为边缘绘制方式 3.glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式 4.glFrontFace(GL_CCW)

OpenGL 自制API (1)

glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer); 参数: pointer 指定一个指针,指向数组中第一个顶点属性的第一个组件.初始值为0. stride 指定连续顶点属性之间的偏移量.如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的.初始值为0. normalized 指定当被访问时,固定点数

call to OpenGL ES API with no current context 和Fatal signal 11

近日在用cocos2dx3.4的时候使用了JNI调用,发现一个现象 当不使用jni的时候完全正常,使用了jni后回去的所有文字都变成黑块,并且有概率程序崩溃,附带出了两个log call to OpenGL ES API with no current context  和 Fatal signal 11 但同样的cocos2dx ,同样的jni代码,另一个项目却正常.找寻了好久之后发现了原因 cocos2dx 3.x以后版本 不再是一个进程跑到底: 引用:"Cocos2d-x从2.x版本到上周

【转】OPENGL基本API概述

本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库. gl中包含了最基本的3D函数,而glu似乎对gl的辅助,如果数学功底好,在不用glu的情况下,也是可以做出同样的效果.glut是基本的窗口界面, 是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替:但是

OpenGL的API函数使用手册

(一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.aux.glut.wgl.glx.agl 等等. 1.核心函数库主要可以分为以下几类函数 (1) 绘制基本的几何图元函数.如:glBegain(). (2) 矩阵操作.几何变换和投影变换的函数.如:矩阵入栈glPushMatrix(),还有矩阵的出栈.转载.相乘,此外还有几何变换函数glTranslate*(),投影变换函数glOrtho()和

OpenGL ES API with no current context

这个问题是因为Android在启动cocos2d-x的Thread时,没有用context的主的Thread,而是使用的OpenGL的Thread,所以我们不能在主Thread去完成 本应该是在cocos2dx中OpenGL Thread中 完成的工作(即所调用的函数在Cocos2dx中做的工作), 必须使用OpenGL的Thread去完成︰ public static native void nativeCallback(String code, String params); //原本程序中

OpenGL 阴影之Shadow Mapping和Shadow Volumes

先说下开发环境.VS2013,C++空项目,引用glut,glew.glut包含基本窗口操作,免去我们自己新建win32窗口一些操作.glew使我们能使用最新opengl的API,因winodw本身只包含opengl 1.1版本的API,根本是不能用的. 其中矩阵计算采用gitHub项目openvr中的三份文件, Vectors.h ,Matrices.h, Matrices.cpp,分别是矢量与点类,矩阵类,我们需要的一些操作,矢量的叉乘和点乘,矩阵转置,矩阵的逆,矩阵与矢量相剩等. 这里主要