`
如沐春风的小妮
  • 浏览: 69661 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

opengl学习(五)------ 视图(三)

 
阅读更多

     前面有讲到过变换函数时,需要确定自己的矩阵,上一节讲的是模型视图矩阵,这一节就来讲一讲投影矩阵。

     注意:在调用本节描述的任意变换函数之前,都不要忘记首先调用下面的函数:

                        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-canvas-master.zip

    通过学习和分析这个项目,开发者可以深入了解如何在 Android 应用中结合使用 OpenGL ES 和 Canvas,以实现高效且具有高度交互性的图形界面。同时,这也是提高图形编程能力,理解和实践现代移动设备上的图形渲染技术...

    openGl设计--3D迷宫

    OpenGL支持纹理加载和映射,开发者需要学习如何使用glBindTexture、glTexImage2D等函数来处理和应用纹理。 再者,碰撞检测是游戏中的核心部分。在3D迷宫中,玩家角色与墙壁的碰撞检测至关重要,以防止玩家穿墙或被...

    OpenGL----动态球体---源代码

    OpenGL是一种强大的图形...通过分析这个"OpenGL动态球体源代码",我们可以学习到如何使用OpenGL的基本概念和方法,以及如何实现3D对象的动态旋转效果。同时,这也是学习图形学和理解计算机图形渲染过程的一个好起点。

    OpenGL-html-funciton-manual

    170多个函数覆盖了OpenGL的核心功能,包括顶点处理(如`glVertex()`)、图元装配(`glBegin()`和`glEnd()`)、着色(`glColor()`)、投影和模型视图变换(`glTranslate()`、`glRotate()`等)、纹理映射(`glTexImage...

    opengl-自用-trackball

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。"trackball"在OpenGL中通常指的是虚拟轨道球,它是一种常见的交互式旋转视角的工具,常用于3D视图的操控。在这个...

    OpenGL - color-灯光.rar

    在OpenGL中,颜色是通过RGB(红绿蓝)三原色模型来定义的,每个颜色通道的值范围通常在0到1之间。我们可以通过设置`glColor3f()`函数的参数来指定顶点的颜色,例如`glColor3f(1.0, 0.0, 0.0)`将设置当前顶点为红色。...

    OpenGLES1.1-Spec

    通过这些文档,开发者可以学习到如何利用OpenGL ES 1.1的全部潜力,创建高效的3D应用程序,无论是游戏、科学可视化还是其他图形密集型应用。理解并熟练运用这些规范将有助于开发人员优化代码,提高性能,同时确保其...

    Opengl---glm库

    GLM,全称OpenGL Mathematics,是OpenGL的一个重要辅助库,它提供了与OpenGL Shading Language (GLSL) 兼容的数学函数和数据类型,极大地简化了在C++中进行三维图形编程的工作。 GLM库主要包含以下几个关键知识点:...

    Opengl.rar_opengl画三视图_贝塞尔 圆弧

    OpenGL是计算机图形学中的一种强大的...综上所述,这个压缩包提供了一个学习和实践OpenGL图形绘制,特别是复杂曲线和视图处理的资源集合。通过对这些知识点的深入理解和实践,开发者可以提升在3D图形编程领域的技能。

    VS2013 OpenGL 三视图界面

    在Visual Studio 2013中使用OpenGL来构建一个类似于3D MAX的三视图界面,我们需要了解以下几个关键知识点: 1. **OpenGL环境设置**:首先,我们需要在VS2013中配置OpenGL开发环境。这通常涉及安装支持OpenGL的库...

    OpenGLES demo - 5. 深度测试

    通过对源码的学习,你可以掌握如何设置深度测试,如何在着色器中处理深度值,以及如何通过调整深度测试参数来优化渲染效果,例如避免深度冲突或实现深度预pass等高级技术。 总之,深度测试是OpenGL ES中不可或缺的...

    iOS实例开发源码——jzucker2-OpenGL-Side-Project-1974f39.zip

    项目描述虽然简短,但我们可以从中推测,开发者jzucker2创建了这个项目作为个人学习或实践OpenGL的一个边项目。版本号"1974f39"可能代表Git仓库中的一个特定提交,这表明该项目可能是在Git版本控制系统下管理的,...

    OpenGL教学程序-选取、平移、旋转

    通过学习这个教学程序,初学者不仅可以掌握OpenGL的基本绘图操作,还能了解到如何将OpenGL集成到MFC应用中,以及如何处理用户的输入事件来实现选取、平移和旋转等动态效果。这对于进一步探索复杂的3D图形编程是非常...

    opengl编程基础--(美)Edward Angel 源码

    3. **模型视图和投影变换**:在OpenGL中,模型视图变换用于将物体从模型空间转换到世界空间,然后到视口空间,最后通过投影变换将其映射到屏幕上的二维像素坐标。 4. **着色器**:OpenGL 3.0之后,引入了着色器语言...

    OpenGL-zhifeiji3Dsanshitu.zip_OpenGL三视图_opengl_outlineb2u_site:w

    "OpenGL三视图"是指将物体从三个不同的方向——前视图、侧视图和俯视图——进行绘制,以便全面理解物体的几何结构。 在OpenGL中,创建3D模型通常涉及以下几个关键步骤: 1. **坐标系统与投影**:OpenGL使用右手...

    在OpenGL视图中绘制三维物体

    初学者在学习如何在OpenGL视图中绘制三维物体时,需要掌握以下几个核心概念和技术: 1. **OpenGL环境设置**:首先,你需要安装支持OpenGL的图形库,如GLUT、SDL或FreeGLUT,这些库提供了窗口管理和事件处理的基本...

    opengl游戏编程-材质实例

    1. 初始化OpenGL环境,包括设置视口、投影矩阵和模型视图矩阵。 2. 创建和设置光源,可以有多个光源,每个光源都有自己的位置、颜色和类型(点光源、方向光源等)。 3. 设定材质属性,根据需要为每个球体设定不同的...

    CH12-1、OpenGL编程入门-1

    ### OpenGL编程入门知识点详解 #### 一、概述 OpenGL是一个跨语言、跨平台的应用程序接口(API),用于渲染2D和3D...通过本节的学习,读者应该能够掌握OpenGL的基本使用方法,为进一步学习高级图形学打下坚实的基础。

    OpenGLES demo - 9. 矩阵变换

    这个示例可能包括创建顶点数组、设置模型视图投影矩阵、应用矩阵变换以及使用`glDrawArrays`绘制图形等内容。通过研究并运行这个示例,你可以更直观地理解OpenGLES中的矩阵变换是如何工作的。 总之,OpenGLES中的...

Global site tag (gtag.js) - Google Analytics