前面有讲到过变换函数时,需要确定自己的矩阵,上一节讲的是模型视图矩阵,这一节就来讲一讲投影矩阵。
注意:在调用本节描述的任意变换函数之前,都不要忘记首先调用下面的函数:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
这样做的目的是为了使后面调用的变换函数是作用与投影矩阵,而不是模型变换矩阵。
1.透视投影
透视投影,物体距离观察点越远,在最终图像中看上去就越小。这就好比照相机照相原理,物体距离照相机越远,在相机成像时,形成的影像就越小。
glFrunstum()用于计算一个用于实现透视投影的矩阵,它与当前的投影矩阵(一般为单位矩阵)相乘。如附图所示,视景体用于剪裁那些位于它之外的物体,平截头体的4个侧面底面和顶面对应于视景体的6个剪裁平面。位于这些平面之外的物体(或物体一部分)将被裁掉。
注:投影矩阵的目的就是为了定义一个视景体。视景体有两个用途:1,决定一个物体如何映射到屏幕上;2.定义哪些物体被剪裁到图像之外。
void glFrustum(GLdouble left,GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far );
创建一个表示透视视图平截头体的矩阵,并把它与当前矩阵相乘。平截头体的视景体是由这个函数的参数定义的:
(left, bottom , -near)和(right, top, -near)分别指定了近侧剪裁平面左上角和右下角的(x, y, z)坐标。
near 和 far分别表示从观察点到近侧和远侧剪裁平面的距离,它们的值应是正的。
gluPerspective()函数也是创建一个视景体,与调用上面glFrunstum()产生的视景体相同。但是这个函数并不是指定近侧剪裁平面的连个角,而是指定y方向上视野的角度和纵横比(x/y)。
注:gluPerspective()仅限于创建沿视线方向同时对称于x轴和y轴的平截头体,就是平时我们需要的这种。
void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble near , GLdouble far);
创建一个表示对称透视试图平截头体的矩阵,并把它与当前矩阵相乘。
fovy是yz平面上视野的角度,它的值必须在[0.0, 180.0]之间。
aspect是这个平截头体的纵横比,也就是它的宽度除以高度。
near和far值分别是观察点与近侧才见平面及远侧剪裁平面的距离(z轴负方向)均为正值。
举例:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(22, w/h, 1 , 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
2. 正投影
在正投影下,视景体是一个平行的长方体,两端大小并没有不同,也就是物体与观察点之间的距离不影响观察者看到的物体大小,它以它实际的形态存在。正投影之后,保持它们的实际大小以及它们之间的角度是至关重要的。
glOrtho()函数创建一个正交平行的视景体。如没有其它变换,投影的方向与z轴平行,观察点的方向朝向z轴的负方向(没有其它变换时,所有的投影方向均如此)。
void glOrtho(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far);
创建一个表示正交平行视景体的矩阵,并把它与当前矩阵相乘。
(left, bottom, -near) 和(right, top, -near)是近侧裁剪平面上的点,分别映射到视口的左下角和右上角。
(left, bottom, -far) 和(right, top, -far)是远侧裁剪平面上的点,分别映射到视口窗口的左下角和有伤口。
near和far可以是正值或负值,甚至可以设置为0.但是near和far不应该取相同的值。
二维图像投影到二维屏幕上时,提供了另一个函数完成。此时场景中的物体所有z坐标都假定位于-1.0~1.0之间。所有z坐标都是0.
void gluOrtho2D(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top);
创建一个表示把二维坐标投影到屏幕上的矩阵,并把当前矩阵与它相乘。
剪裁局域为矩阵,它的左下角坐标为(left, bottom) ,右上角坐标为(right, top)。
当场景中物体的顶掉通过模型视图矩阵和投影矩阵变换后,位于视景体之外的所有图元都将裁减掉。6个裁剪面就是定义视景体6个侧面的平面。还可以指定其它裁剪平面,使它们位于我们所需要的地方。
- 大小: 11 KB
分享到:
相关推荐
通过学习和分析这个项目,开发者可以深入了解如何在 Android 应用中结合使用 OpenGL ES 和 Canvas,以实现高效且具有高度交互性的图形界面。同时,这也是提高图形编程能力,理解和实践现代移动设备上的图形渲染技术...
OpenGL支持纹理加载和映射,开发者需要学习如何使用glBindTexture、glTexImage2D等函数来处理和应用纹理。 再者,碰撞检测是游戏中的核心部分。在3D迷宫中,玩家角色与墙壁的碰撞检测至关重要,以防止玩家穿墙或被...
OpenGL是一种强大的图形...通过分析这个"OpenGL动态球体源代码",我们可以学习到如何使用OpenGL的基本概念和方法,以及如何实现3D对象的动态旋转效果。同时,这也是学习图形学和理解计算机图形渲染过程的一个好起点。
170多个函数覆盖了OpenGL的核心功能,包括顶点处理(如`glVertex()`)、图元装配(`glBegin()`和`glEnd()`)、着色(`glColor()`)、投影和模型视图变换(`glTranslate()`、`glRotate()`等)、纹理映射(`glTexImage...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。"trackball"在OpenGL中通常指的是虚拟轨道球,它是一种常见的交互式旋转视角的工具,常用于3D视图的操控。在这个...
在OpenGL中,颜色是通过RGB(红绿蓝)三原色模型来定义的,每个颜色通道的值范围通常在0到1之间。我们可以通过设置`glColor3f()`函数的参数来指定顶点的颜色,例如`glColor3f(1.0, 0.0, 0.0)`将设置当前顶点为红色。...
通过这些文档,开发者可以学习到如何利用OpenGL ES 1.1的全部潜力,创建高效的3D应用程序,无论是游戏、科学可视化还是其他图形密集型应用。理解并熟练运用这些规范将有助于开发人员优化代码,提高性能,同时确保其...
GLM,全称OpenGL Mathematics,是OpenGL的一个重要辅助库,它提供了与OpenGL Shading Language (GLSL) 兼容的数学函数和数据类型,极大地简化了在C++中进行三维图形编程的工作。 GLM库主要包含以下几个关键知识点:...
OpenGL是计算机图形学中的一种强大的...综上所述,这个压缩包提供了一个学习和实践OpenGL图形绘制,特别是复杂曲线和视图处理的资源集合。通过对这些知识点的深入理解和实践,开发者可以提升在3D图形编程领域的技能。
在Visual Studio 2013中使用OpenGL来构建一个类似于3D MAX的三视图界面,我们需要了解以下几个关键知识点: 1. **OpenGL环境设置**:首先,我们需要在VS2013中配置OpenGL开发环境。这通常涉及安装支持OpenGL的库...
通过对源码的学习,你可以掌握如何设置深度测试,如何在着色器中处理深度值,以及如何通过调整深度测试参数来优化渲染效果,例如避免深度冲突或实现深度预pass等高级技术。 总之,深度测试是OpenGL ES中不可或缺的...
项目描述虽然简短,但我们可以从中推测,开发者jzucker2创建了这个项目作为个人学习或实践OpenGL的一个边项目。版本号"1974f39"可能代表Git仓库中的一个特定提交,这表明该项目可能是在Git版本控制系统下管理的,...
通过学习这个教学程序,初学者不仅可以掌握OpenGL的基本绘图操作,还能了解到如何将OpenGL集成到MFC应用中,以及如何处理用户的输入事件来实现选取、平移和旋转等动态效果。这对于进一步探索复杂的3D图形编程是非常...
3. **模型视图和投影变换**:在OpenGL中,模型视图变换用于将物体从模型空间转换到世界空间,然后到视口空间,最后通过投影变换将其映射到屏幕上的二维像素坐标。 4. **着色器**:OpenGL 3.0之后,引入了着色器语言...
"OpenGL三视图"是指将物体从三个不同的方向——前视图、侧视图和俯视图——进行绘制,以便全面理解物体的几何结构。 在OpenGL中,创建3D模型通常涉及以下几个关键步骤: 1. **坐标系统与投影**:OpenGL使用右手...
初学者在学习如何在OpenGL视图中绘制三维物体时,需要掌握以下几个核心概念和技术: 1. **OpenGL环境设置**:首先,你需要安装支持OpenGL的图形库,如GLUT、SDL或FreeGLUT,这些库提供了窗口管理和事件处理的基本...
1. 初始化OpenGL环境,包括设置视口、投影矩阵和模型视图矩阵。 2. 创建和设置光源,可以有多个光源,每个光源都有自己的位置、颜色和类型(点光源、方向光源等)。 3. 设定材质属性,根据需要为每个球体设定不同的...
### OpenGL编程入门知识点详解 #### 一、概述 OpenGL是一个跨语言、跨平台的应用程序接口(API),用于渲染2D和3D...通过本节的学习,读者应该能够掌握OpenGL的基本使用方法,为进一步学习高级图形学打下坚实的基础。
这个示例可能包括创建顶点数组、设置模型视图投影矩阵、应用矩阵变换以及使用`glDrawArrays`绘制图形等内容。通过研究并运行这个示例,你可以更直观地理解OpenGLES中的矩阵变换是如何工作的。 总之,OpenGLES中的...