投影变化分两种:

1 . 平行投影       2 . 透视投影

投影变化的设置一般放在reshape函数当中调用

每次要对投影变化进行操作的时候我们需要修改矩阵的变化模式,指定它为投影变化

glMatrixMode(GL_PROJECTION);

用完了记得改回去让 视景体内的物体进行正常的视图变化

glMatrixMode(GL_MODELVIEW);

这里主要讲一下最近对透视投影的理解,以免以后自己又不记得了

透视投影主要的两个函数

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

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near , GLdouble far);

这两个函数之间干同一件事用不同的方式进行表达,能够相互转化

我们可以将照相机的位置看作视点所在,这个可以用glLookAt函数设置

靠近照相机的作为近侧面,右侧较远的作为远侧面

near:表示的是沿z轴方向的视点到近侧面的距离

far   :表示的是沿z轴方向的视点到远侧面的距离

视线和远近侧面构成了一个棱台作为视景体,意思就是只有视景体内的物体才会被投影到屏幕上,多出的就会被裁减

对于一个物体投影到屏幕的方式是,可以看作将屏幕放在照相机和近侧面中间的某一位置上,视景体中的物体按照投影变化形成的角度,每一点

按这个角度投射到屏幕上,一条同等长度的线,所以当线的位置越在视景体的内侧,那么它投射到屏幕上的长度将越小

另外视点到视景体范围形成的角度越大,那么线透射到屏幕上越是倾斜偏移,那么屏幕上投射的线长度将会越小

这个角度也正是gluPerspective中的第一个参数fovy

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

(left , bottom , -near)和(right , top , -near)分别指定了近侧裁剪面左上角和右下角的坐标

这里在图上显示的是(l,t,n) 和 (r,b,n)

这里可以看出,视角(gluPerspective中的第一个参数fovy)的形成在这里只跟视点和近侧面的位置有关

这个视角是水平夹角

B点的坐标就可表示为((left+right)/2 , bottom , -near)

C点的坐标就可表示为((left+right)/2 , top , -near)

那么视角∠BAC就很容易算了

所以往往到远侧面距离的值是不影响结果的,但是如果这个值过小,物体不出现在视景体里,那就会意外了,所以总是将far值定义的较大,保证物体出现在视景体里

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near , GLdouble far);

aspect在这里是投影截出的侧面的纵横比,其他参数都可以根据上一个函数理解

opengl 对投影变化函数的理解的更多相关文章

  1. opengl中对glOrtho()函数的理解

    glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工程中的制图等.需要比较精确的显示. 而作为它的对立情况, glFrustum则产生一个 ...

  2. OpenGL中常用的函数

    OPengl的官方文档如下:https://www.opengl.org/sdk/docs/man4/ void glGetIntegerv(   GLenum pname,      GLint * ...

  3. glViewport()函数和glOrtho()函数的理解(转)

    转:http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 摘要:glOrtho相当指定图框的大小,由此会使得图框里的图形 ...

  4. OpenGL的glOrtho平行投影函数详解[转]

    glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...

  5. glViewport()函数和glOrtho()函数的理解(转)

    http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 在OpenGL中有两个比较重要的投影变换函数,glViewport ...

  6. glViewport()函数和glOrtho()函数的理解

    glViewport()函数和glOrtho()函数的理解     OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般 ...

  7. 回调函数透彻理解Java

    http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...

  8. 对c语言中malloc和free函数的理解

    最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识. 一. malloc函数和free函数的基本概念和基本的用法 对于malloc函数: 1.  ...

  9. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

随机推荐

  1. spring 异常处理

    1. 实现接口 HandlerExceptionResolver 捕获异常 2.@ExceptionHandler 在方法添加注解,捕获本地controller异常 3.@ControllerAdvi ...

  2. 添加jar到mvn私服

    1.生成jar文件 2.jar目录下执行: mvn install:install-file -Dfile=jave-1.0.2.jar -DgroupId=joinery -DartifactId= ...

  3. java大数轻松过

    import java.util.Scanner; import java.math.BigInteger; public class Main { public static void main(S ...

  4. 石墨烯(转自wiki)

    石墨烯(Graphene)是一种由碳原子以sp2杂化轨道组成六角型呈蜂巢晶格的平面薄膜,只有一个碳原子厚度的二维材料[1].石墨烯一直被认为是假设性的结构,无法单独稳定存在[1],直至2004年,英国 ...

  5. gdb如何保存和读取断点

    刚开始在linux下学编程使用gdb的同学可能会发现,每次用gdb设置断点调试程序,但下次打开的时候所有断点都没有了,很不方便.下面介绍保存和读取断点的方法. 1. 保存断点 先用info b 查看一 ...

  6. postgreSQL在Centos6下编译安装

    1.准备安装源 下载地址:https://www.postgresql.org/ftp/source/ 下载并解压. 2.软件编译安装 配置.检查安装环境 ./configure --prefix=/ ...

  7. HTML5——移动端的点击、拖拽

    移动端浏览器不支持mouse事件 https://www.cnblogs.com/joyco773/p/6519668.html https://www.cnblogs.com/yjhua/p/525 ...

  8. Spring scheduled cron 表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天( ...

  9. Java———较大二进制文件的读、写

    由于项目需要,需要对二进制文件进行读写.转换. 文件说明:由其他程序得到的二进制文件,文件内容为:包含23543个三角形.13270个顶点的三角网所对应的721组流速矢量(u.v)文件,通俗些说,一条 ...

  10. RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答

    如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...