OpenGL学习笔记——视图

顶点变换的步骤:

视图与模型变换一起组成了模型视图矩阵,这个矩阵作用于物体坐标,产生视觉坐标。紧接着,如果指定了其他的裁剪平面,用于从场景中删除某些物体或者提供物体的裁剪视图,这些裁剪平面会在这个时候生效。之后,OpenGL使用投影矩阵产生了裁剪坐标。这个变换定义了一个视景体,位于这个空间外的物体将会被裁剪掉。随后发生的是透视除法,它把坐标除以w,产生规范化的设备坐标。最后,经过变换的坐标经过视口变换成为窗口坐标。可以通过控制视口的大小对最终的图像进行放大、缩小和拉伸(cocos2dx的屏幕适配原理)。

绘制立方体的例子:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glScalef(1.0, 2.0, 1.0);
    glutWireCube(1.0);
    glFlush();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
    glMatrixMode(GL_MODELVIEW);
}

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
}

int main(int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(&display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

glLoadIdentity():把当前矩阵设置为单位矩阵,通过加载单位矩阵来清除当前矩阵。

diaplay()函数包括了模型和视图变换,以及绘制的函数,需要重复调用,用于绘制窗口的内容。

reshape()函数在窗口变化时指定投影变换。

  • 视图变换:

    视图变换相当于调整摄像机的位置和朝向。glLookAt指定了视图变换,如例子所示摄像机在(0, 0, 5)位置,镜头朝向(0, 0, 0),朝上向量指定为(0, 1, 0)。总体的效果就是把镜头向z轴的方向拉远了5个单位,便于看到绘制的立方体。

  • 模型变换:

    模型变换是为了调整物体的位置和方向,通常模型和视图变换组合成模型视图矩阵。display函数中就包含了模型和视图变换,因为需要重复调用满足绘制的需求,在窗口移动或遮挡时需要调用,所以需要加载单位矩阵。

  • 投影变换:

    投影变换相当于给摄像机选择镜头。在窗口创建,移动或改变形状时会调用reshape函数。

  • 视口变换:

    视口变换相当于最终经过处理的照片的大小和位置,例如照片是否需要放大和缩小,投影变换和视口变换决定了场景如何映射到屏幕上。

视图和模型变换

  • 全局固定坐标系:如果采用全局固定的坐标系来作为参考,在这种坐标系中,矩阵乘法就会模型的位置、方向和缩放,就必须要注意乘法出现的顺序和在代码中出现的顺序相反。
  • 局部移动坐标系:乘法出现的顺序和在代码中出现的顺序相同。

模型视图矩阵堆栈可以包含至少32个4x4的矩阵,而且一开始的顶部矩阵是单位矩阵。

投影变换

* 透视投影:平截头体;

* 正投影:正交平行视景体。

一般情况下投影矩阵堆栈的深度只有2层。常见的应用在显示包含帮助的文本窗口的时候,在正投影的模式下比较容易定位,可以暂时把投影模式设为正投影,然后再返回原来的透视投影模式。

视口变换

1、定义视口;

2、变换深度坐标。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 18:11:34

OpenGL学习笔记——视图的相关文章

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

OpenGL学习笔记2 —— 画立方体

#include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. //<<<<<<<<<<<<<<<<<<<<<<< myInit >>&

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,

【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 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g

MySQL学习笔记—视图

MySQL学习笔记-视图 视图是查看基础表数据的一种方式,其作用有 - 简化开发难度,可以运用视图执行多表操作 - 数据安全,开发人员不能直接对表操作,也不能进行删除,修改操作 - 数据重构,在有限的表中,以不同的角度生成所需的视图,简化业务 CREATE VIEW语法 CREATE VIEW语法: CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS

【OpenGL 学习笔记03】点画多边形

1.点画多边形 //定义填充多边形的点画模式.mask为32 x 32 的位图指针,1画0不画,使用前必须启用多边形点画功能 void glPloygonStipple(const GLubyte* mask); //绘制一个矩形 void glRectf(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2); 2.示例 #include <GL/glut.h> #include <stdlib.h> void display(void) { G

OpenGL学习笔记1 —— 画点

#include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. //<<<<<<<<<<<<<<<<<<<<<<< myInit >>&