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-08 06:24:54

OpenGl学习之坐标变换(下)的相关文章

OpenGl学习之坐标变换(上)

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

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

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

OpenGl从零开始之坐标变换

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

OpenGL学习脚印: 视变换(view transformation)

写在前面 OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习.上一节模型变换,本节学习模型变换的下一阶段--视变换.到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了.本节示例程序均可在我的github下载. 通过本节可以了解到 视变换的概念 索引绘制立方体 LookAt矩阵的推导(对数学不感兴趣,可以跳过) 相机位置随时间改变的应用程序 坐标处理的全局过程(了解,另文详述) Ope

OpenGL学习之路(五)

1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放坐标变换矩阵的理论推导和实践应用. 这一次读书笔记,我们一起来学习OpenGL中常用的坐标系以及坐标变换.在OpenGL中有几个坐标系,初学者常常被它们搞得晕头转向:为什么需要这些坐标系?各个坐标系有什么作用?……本文就来学习一下这些OpenGL中常用坐标系. 之后来看看投影矩阵的推导,投影变换矩阵

OpenGl学习进程(7)第五课:点、边和图形(二)边

本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的.可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定.     (2)如何绘制边: 1)OpenGL支持绘制三种类型的边: GL_LINES :指定两个顶点,在它们之间绘制一条直线.如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略. GL

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

OpenGL学习笔记:拾取与选择

转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当前鼠标的位置是哪一个物体呢? OpenGL有一套机制,叫做Picking, 里面涉及到几个核心概念: 1. selection mode. 选择模式 2. name stack. 名字栈 3. hit record. 命中记录 4. viewing volume. 视角范围 在OpenGL的pick

OpenGL学习进程(3)第一课:初始化窗体

    本节是OpenGL学习的第一个课时,下面介绍如何初始化一个窗体:     (1)显示一个有蓝色背景的窗体: #include <GL/glut.h> #include <stdlib.h> void display(void) { /* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glFlush (); } int main(int argc, char** argv) { glutInit(&argc, a