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(0,1,0);

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

    //glMatrixMode(GL_MODELVIEW);下面的函数自动做了矩阵变换,这里可以不写
    glTranslatef(0,0,-10);

    glutWireTeapot(1);

    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(-1,1, -1,1, 0,2);//前四个变量控制棱台的宽高,宽:2,高:2 ,后两个调节远近。

        //模型变换,由于默认视点和模型都在原点,所以如果不设置模型移动,则视点在模型内部中心处,投影不能看到模型的整体
        glMatrixMode(GL_MODELVIEW);//可以不写,转换函数内部已转换矩阵模式
        glTranslatef(0,0,-1);
        glutWireSphere(0.5,20,20);
    }
    glFlush();
}

(2)改变宽和高

glFrustum(-1,0,  -1,1, 1,2);//宽:1,高:2, "右半部分不显示==视线左移1",若近平面的距离为0,此时成像固定,其他参数调节不起作用。

右半部分不显示==视线左移1

(3)调节远近

glFrustum(-1,1,  -1,1, 0.5,2);//近平面的距离为0.5:由于之前物体距离视点的距离为1,所以只能在0~1之间变化
glFrustum(-1,1,  -1,1, 0.2,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(150,1,0,100);

        //模型变换,由于默认视点和模型都在原点,所以如果不设置模型移动,则视点在模型内部中心处,投影不能看到模型的整体
        glMatrixMode(GL_MODELVIEW);
        glTranslatef(0,0,-1);
        glutWireSphere(0.5,20,20);
    }
    glFlush();
}

(1)先看角度的变化效果

直接修改上面代码中的gluPerspective(150,1,0,100),第一个参数代表实现张开的角度。

借用一篇博客中对这部分的理解:http://blog.csdn.net/shuaihj/article/details/7228575

我们眯眼时,视线张开的角度小,看到前方的物体就会更清晰,类似小孔成像、望远镜或者相机聚焦的感觉,成像的物体会拉近,显示比较大。当睁大眼睛时,我们的视野变大,发散,物体在视野内的变小,或者说眼大无神-_-。

gluPerspective(55,1,0,100);
gluPerspective(15,1,0,100);
gluPerspective(170,1,0,100);

(左边:55° ,中间:15° 右边:170°)

(2)再看距离的变化效果

物体的位置不动时,投影的成像结果是由角度决定的,视野角度固定,那么结果是不变的。这点与glFrustum不一样,更侧重于用角度来控制成像。

需要注意的是,最近的平面:zNear,一定要在视点和物体之间,否则是无法成像的。

时间: 2024-10-25 21:35:54

OpenGl从零开始之坐标变换(下)的相关文章

OpenGl从零开始之坐标变换

http://www.tuicool.com/articles/uiayYrI OpenGL学习脚印: 坐标变换过程(vertex transformation) http://blog.csdn.net/wangdingqiaoit/article/details/51594408 写在前面 前面几节分别介绍了模型变换,视变换,以及给出了投影矩阵和视口变换矩阵的推导,本节从全局把握一遍OpenGL坐标转换的过程,从整体上认识坐标变换过程.相关矩阵的数学推导过程请参考前面几节对应的内容. 通过本

OpenGL【2 坐标变换】

// OpenGL.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include <GL/glut.h> #include <GL/glaux.h> using namespace std; void init(void) { glClearColor(1.0,1.0,1.0,1.0); glClear(GL_COLOR_BUFFER_BIT); glShadeMode

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译)

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译) (2012-12-24 13:22:17) 转载▼ 标签: it cocos2d opengl 着色器 渲染 翻译:弹涂鱼 PS:欢迎加入开发群:285275050 本文翻译自:http://www.raywenderlich.com/10862/how-to-create-cool-effects-with-custom-shaders-in-opengl-es-2-0-and-cocos2d-2-x#

从零开始Windows环境下安装python+tensorflow

从零开始Windows环境下安装python+tensorflow 2017年07月12日 02:30:47 qq_16257817 阅读数:29173 标签: windowspython机器学习tensorflowAnaconda 更多 个人分类: machine-learning 前言 安装环境 tensorflow Anaconda 安装步骤 1.安装Anaconda 2.安装tensorflow 3.测试是否安装成功 总结 前言 本文介绍在Windows平台下,使用Anoconda简单安

OpenGl学习之坐标变换(下)

这节主要来理解投影变换和视口变换的使用. 1.正射投影:glOrtho 函数原型: void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far): //left和right:矩形视景体的左右平面,之间的距离为"宽" //bottom和top:矩形视景体的上下平面,之间的距离为"高" //near和far:矩形视景体的前后平面,之间

OpenGl学习之坐标变换(上)

      坐标变换是深入理解三维世界的基础,非常重要.学习这部分首先要清楚几个概念:视点变换.模型变换.投影变换.视口变换. 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,因此我们要将三维物体用二维数据表示出来,这一联系的点就是坐标.在OpenGL三维空间中坐标的形式有两种:世界坐标系和局部坐标系. ①世界坐标系:始终固定不变.举例,以太阳系中心太阳为中心原点,建立世界坐标系的话,地球绕太阳的公转运动是世界坐标的变换. ②局部坐标系:物体本身的中心.地球的自

OpenGL学习脚印: 坐标变换过程(vertex transformation)

写在前面 前面几节分别介绍了模型变换,视变换,以及给出了投影矩阵和视口变换矩阵的推导,本节从全局把握一遍OpenGL坐标转换的过程,从整体上认识坐标变换过程.相关矩阵的数学推导过程请参考前面几节对应的内容. 通过本节可以了解到 坐标变换的各个阶段 利用GLM数学库实现坐标变换 坐标变换的全局图 OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等过程,如下图所示: 在上面的图中,注意,OpenGL只定义了裁剪坐标系.规范化设备坐标系和屏幕坐标系,而局部坐标系(模型坐标系).世界

OpenGL中x64 debug下bmp图像导入出错解决方案

在win32环境下,已经提供了GLAUX库,但对于x64位,基本上该库没有提供64为支持.会出现以下错误: ------ 已启动生成:  项目: OpenGL, 配置: Debug x64 ------1>  OpenGL.cpp1>OpenGL.cpp(746): warning C4244: "return": 从"WPARAM"转换到"int",可能丢失数据1>OpenGL.obj : error LNK2019: 无法解

openGl从零开始之添加颜色

OpenGL 支持两种颜色模式:一种是 RGBA模式,一种是 颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数据,即通过每一个像素的颜色,来改变整体图形的颜色.不同的是, RGBA 模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表.具体如下: 1.RGBA模式 RGBA 模式中,每一个像素会保存以下数据: R 值(红色分量). G 值(绿色分量). B 值(蓝色分量)和A 值( alpha 分量). 其中红.绿.蓝三种颜