OpenGl从零开始之坐标变换(下)
这节主要来理解投影变换和视口变换的使用。
1、正射投影:glOrtho
函数原型:
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far);
//left和right:矩形视景体的左右平面,之间的距离为“宽”
//bottom和top:矩形视景体的上下平面,之间的距离为“高”
//near和far:矩形视景体的前后平面,之间的距离为“深度”
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top);//同glOrtho一样,只不过物体的Z轴坐标为0,缺省的近远平面距离为-1和1
*注意:和glFrustum中的近远平面距离的含义不同:
glFrustum中的近远平面距离:视点到近、远平面的距离,只考虑距离,不考虑方向,所以必须是正的。
glOrtho中的近远平面距离:距离视点前后的距离,即视点可以在视景体内部(不可以设在物体内部),(-1,10),近平面在视点的后面1单位的距离,远平面在视点前方10单位距离

void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(,,); //glMatrixMode(GL_PROJECTION);下面的函数自动做了矩阵变换,这里可以不写
glOrtho(-,,-,,-,);//视点在原点,而物体位移到-10处,为了能够看到物体,视景体就必须包含住物体,所以设置15 //glMatrixMode(GL_MODELVIEW);下面的函数自动做了矩阵变换,这里可以不写
glTranslatef(,,-); glutWireTeapot(); glFlush();
}

2、透视投影:glFrustum
函数原型:
void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far);
left, right:裁剪窗口左右边界的平面距离,距离(视点与物体连线:中心线)的两侧距离。左右边界决定了视口的宽。
bottom, top:裁剪窗口下上边界的平面距离,距离(视点与物体连线:中心线)的上下距离。上下边界决定了视口的高。
znear, zfar:视点到近、远平面的距离,必须是正的。

由于使用的不多,所以直接看效果变换。
(1)近平面距离为0
void myDisplay(void)
{
glColor3f(0.0f, 1.0f, 0.0f);
{
//透视投影,通过参数GL_PROJECTION,将矩阵转为投影矩阵,然后设置系数,调节投影
glMatrixMode(GL_PROJECTION);
glFrustum(-,, -,, ,);//前四个变量控制棱台的宽高,宽:2,高:2 ,后两个调节远近。 //模型变换,由于默认视点和模型都在原点,所以如果不设置模型移动,则视点在模型内部中心处,投影不能看到模型的整体
glMatrixMode(GL_MODELVIEW);//可以不写,转换函数内部已转换矩阵模式
glTranslatef(,,-);
glutWireSphere(0.5,,);
}
glFlush();
}

(2)改变宽和高
glFrustum(-,, -,, ,);//宽:1,高:2, "右半部分不显示==视线左移1",若近平面的距离为0,此时成像固定,其他参数调节不起作用。
右半部分不显示==视线左移1
(3)调节远近
glFrustum(-,, -,, 0.5,);//近平面的距离为0.5:由于之前物体距离视点的距离为1,所以只能在0~1之间变化
glFrustum(-,, -,, 0.2,);//近平面的距离为0.2:由于之前物体距离视点的距离为1,所以只能在0~1之间变化


3、透视投影:gluPerspective
函数原型:
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
//fovy: 指定视景体的视野的角度,以度数为单位,x、z平面张开的角度,比喻人眼的余光的范围。角度变小好比“眯眼”时,视野收缩到正前方,此时看到的物体会变小,距离会拉远。
//aspect:指定你的视景体的宽高比,影响投影图像的宽高比例
//zNear: 指定观察者到视景体的最近的裁剪面的距离(必须为正数)
//zFar: 指定观察者到视景体的最远的裁剪面的距离(必须为正数)
个人的理解:投影成像与图中是一个反过程,图中是向外放大到荧幕上,而视觉里则是逆向过程,汇聚成像。
void myDisplay(void)
{
glColor3f(0.0f, 1.0f, 0.0f);
{
//透视投影,通过参数GL_PROJECTION,将矩阵转为投影矩阵,然后设置系数,调节投影
glMatrixMode(GL_PROJECTION);
gluPerspective(,,,); //模型变换,由于默认视点和模型都在原点,所以如果不设置模型移动,则视点在模型内部中心处,投影不能看到模型的整体
glMatrixMode(GL_MODELVIEW);
glTranslatef(,,-);
glutWireSphere(0.5,,);
}
glFlush();
}

(1)先看角度的变化效果
直接修改上面代码中的gluPerspective(150,1,0,100),第一个参数代表实现张开的角度。
借用一篇博客中对这部分的理解:http://blog.csdn.net/shuaihj/article/details/7228575
我们眯眼时,视线张开的角度小,看到前方的物体就会更清晰,类似小孔成像、望远镜或者相机聚焦的感觉,成像的物体会拉近,显示比较大。当睁大眼睛时,我们的视野变大,发散,物体在视野内的变小,或者说眼大无神-_-。
gluPerspective(,,,);
gluPerspective(,,,);
gluPerspective(,,,);


(左边:55° ,中间:15° 右边:170°)
(2)再看距离的变化效果
物体的位置不动时,投影的成像结果是由角度决定的,视野角度固定,那么结果是不变的。这点与glFrustum不一样,更侧重于用角度来控制成像。
需要注意的是,最近的平面:zNear,一定要在视点和物体之间,否则是无法成像的。
OpenGl从零开始之坐标变换(下)的更多相关文章
- OpenGl从零开始之坐标变换
http://www.tuicool.com/articles/uiayYrI OpenGL学习脚印: 坐标变换过程(vertex transformation) http://blog.csdn.n ...
- OpenGl从零开始之坐标变换(上)
坐标变换是深入理解三维世界的基础,非常重要.学习这部分首先要清楚几个概念:视点变换.模型变换.投影变换.视口变换. 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,因 ...
- OpenGL学习之windows下安装opengl的glut库
OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows环境下的GLUT下载地址:(大小约为15 ...
- 【VS开发】【OpenGL开发】OpenGL---Windows下配置与第一个OpenGL程序
面记录一下Windows下配置OpenGL与我的第一个OpenGL程序. 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- 从零开始Windows环境下安装python+tensorflow
从零开始Windows环境下安装python+tensorflow 2017年07月12日 02:30:47 qq_16257817 阅读数:29173 标签: windowspython机器学习te ...
- [OpenGL]OpenGL坐标系和坐标变换
OpenGL通过摄像机的模拟.要实现一个三维计算机图形重大转变,这是几何变换(模型转换-查看转型(两者统称为几何变换)).投影.作物转型.口变换等.同一时候,OpenGL还实现了矩阵堆栈等.理解掌握了 ...
- openGl从零开始之添加颜色
OpenGL 支持两种颜色模式:一种是 RGBA模式,一种是 颜色索引模式.无论哪种颜色模式,计算机都必须为每一个像素保存一些数据,即通过每一个像素的颜色,来改变整体图形的颜色.不同的是, RGBA ...
- 从零开始 WIN8.1 下Android 开发环境搭建
一.JDK安装 当前最新版本是JDK8.0 地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21331 ...
- 从零开始搭建linux下laravel 5.5所需环境(三)
好的,我们已经安装好了nginx+mysql+php了,打开[ Laravel 5.5 文档 ] 快速入门 —— 安装配置篇 我们看到这里需要安装Composer,好的,我们现在就来安装Compose ...
随机推荐
- Java:字符串类String的功能介绍
在java中,字符串是一个比较常用的类,因为代码中基本上处理的很多数据都是字符串类型的,因此,掌握字符串类的具体用法显得很重要了. 它的主要功能有如下几种:获取.判断.转换.替换.切割.字串的获取.大 ...
- swift:入门知识之简单值
1.swift中用let关键字类定义常量,用var关键字来定义变量. 2.swift语句的结尾不需要再带逗号,系统在运行程序时自动会帮你添加上 3.一个变量或常量必须与赋值时拥有相同的类型. 4.如果 ...
- 开启MySQL慢查询日志
1.修改my.cnf或my.ini 1).linux----------------------------------- /etc/my.cnf 文件 [mysqld] long_query_ti ...
- 更改win7资源管理器启动位置
打开资源管理器属性,在目标(T)后边加上: /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 俺滴笨笨原本目标(T)是: %windir%\explorer.ex ...
- SPOJ 274 Johnny and the Watermelon Plantation(TLE)
O(n^3)的时间复杂度,改了半天交了二三十遍,TLE到死,实在没办法了…… 跪求指点!!! #include <cstdio> #include <cstdlib> #inc ...
- Linux驱动修炼之道-RTC子系统框架与源码分析【转】
转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://bl ...
- Android HTTPS(5)SSL测试工具
Nogotofail: A Network Traffic Security Testing Tool Nogotofail is a tool gives you an easy way to co ...
- 四大开源协议:BSD、Apache、GPL、LGPL
参考文献:http://www.fsf.org/licensing/licenses/ 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种.我 ...
- hadoop环境搭建笔记
一.配置Linux (1)cat /etc/networks (2)cat /etc/sysconfig/network (3)vi /etc/udev/rules.d/70-persistent-n ...
- Linux多线程(二)(线程等待,退出)
1. 线程的等待退出 1.1. 等待线程退出 线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止 线程从入口点函数自然返回时,函数返回值可以被其它线程用pth ...
