`
micheal19840929
  • 浏览: 163254 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

三维图形显示流程

阅读更多

运用相机模拟的方式比较通俗地讲解了三维图形显示的基本过程,但在具体应用OpenGL函数库编程时,还必须了解三维图形世界中的几个特殊坐标系的概念,以及用这些概念表达的三维图形显示流程。
  计算机本身只能处理数字,图形在计算机内也是以数字的形式进行加工和处理的。大家都知道,坐标建立了图形和数字之间的联系。为了使被显示的物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。
  计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素的长度,大小可以是整型数。
  为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。投影的方法有两种,即正射投影和透视投影。
  有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(Viewing Volume)。正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。只有视景体内的物体能被投影在显示平面上,其他部分则不能。在屏幕窗口内可以定义一个矩形,称为视口(Viewport),视景体投影后的图形就在视口内显示。
  为了适应物理设备坐标和视口所在坐标的差别,还要作一适应物理坐标的变换。这个坐标系称为物理设备坐标系。根据上面所述,三维图形的显示流程应如图8-2所示。

 

图8-2 三维图形的显示流程

8.1.3 基本变换简单分析
  下面举一个简单的变换例子,cube.c:

#include "glos.h"
  #include <GL/gl.h>
  #include <GL/glu.h>
  #include <GL/glaux.h>

  void myinit(void);
  void CALLBACK myReshape(GLsizei w, GLsizei h);
  void CALLBACK display(void);

  void CALLBACK display (void)
  {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f (1.0, 1.0, 1.0);
    glLoadIdentity (); /* clear the matrix */
    glTranslatef (0.0, 0.0, -5.0); /* viewing transformation */
    glScalef (1.0, 2.0, 1.0); /* modeling transformation */
    auxWireCube(1.0); /* draw the cube */
    glFlush();
  }

  void myinit (void)
  {
    glShadeModel (GL_FLAT);
  }

  void CALLBACK myReshape(GLsizei w, GLsizei h)
  {
    glMatrixMode (GL_PROJECTION); /* prepare for and then */
    glLoadIdentity (); /* define the projection */
    glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); /* transformation */
    glMatrixMode (GL_MODELVIEW); /* back to modelview matrix */
    glViewport (0, 0, w, h); /* define the viewport */
  }

  void main(void)
  {
    auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
    auxInitPosition (0, 0, 500, 500);
    auxInitWindow ("Perspective 3-D Cube");
    myinit ();
    auxReshapeFunc (myReshape);
    auxMainLoop(display);
  }

 

以上程序运行结果就是绘制一个三维的正面透视立方体。其中已经用到了相机模拟中提到的四种基本变换,即视点变换、模型变换、投影变换和视口变换。

图8-3 三维的正面透视立方体

下面简单分析一下整个程序过程:
  1)视点变换视点变换是在视点坐标系中进行的。视点坐标系于一般的物体所在的世界坐标系不同,它遵循左手法则,即左手大拇指指向Z正轴,与之垂直的四个手指指向X正轴,四指弯曲90度的方向是Y正轴。而世界坐标系遵循右手法则的。如图8-4所示。当矩阵初始化glLoadIdentity()后,调用glTranslatef()作视点变换。函数参数(x, y, z)表示视点或相机在视点坐标系中移动的位置,这里z=-5.0,意思是将相机沿Z负轴移动5个单位。
  通常相机位置缺省值同场景中的物体一样,都在原点处,而且相机初始方向都指向Z负轴。
  这里相机移走后,仍然对准立方体。如果相机需要指向另一方向,则调用glRotatef()可以改变。

图8-4 视点坐标系与世界坐标系


  2)模型变换模型变换是在世界坐标系中进行的。在这个坐标系中,可以对物体实施平移glTranslatef()、旋转glRotatef()和放大缩小glScalef()。例子里只对物体进行比例变换,glScalef(sx, sy, sz)的三个参数分别是X、Y、Z轴向的比例变换因子。缺省时都为1.0,即物体没变化。程序中物体Y轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。
  3)投影变换。投影变换类似于选择相机的镜头。本例中调用了一个透视投影函数glFrustum(),在调用它之前先要用glMatrixMode()说明当前矩阵方式是投影GL_PROJECTION。这个投影函数一共有六个参数,由它们可以定义一个棱台似的视景体。即视景体内的部分可见,视景体外的部分不可见,这也就包含了三维裁剪变换。
  4)视口变换。视口变换就是将视景体内投影的物体显示在二维的视口平面上。通常,都调用函数glViewport()来定义一个视口,这个过程类似于将照片放大或缩小。
  总而言之,一旦所有必要的变换矩阵被指定后,场景中物体的每一个顶点都要按照被指定的变换矩阵序列逐一进行变换。注意OpenGL中的物体坐标一律采用齐次坐标,即(x, y, z, w),故所有变换矩阵都采用4X4矩阵。一般说来,每个顶点先要经过视点变换和模型变换,然后进行指定的投影,如果它位于视景体外,则被裁剪掉。最后,余下的已经变换过的顶点x、y、z坐标值都用比例因子w除,即x/w、y/w、z/w,再映射到视口区域内,这样才能显示在屏幕上。

 

实际上,上述所说的视点变换和模型变换本质上都是一回事,即图形学中的几何变换。
  只是视点变换一般只有平移和旋转,没有比例变换。当视点进行平移或旋转时,视点坐标系中的物体就相当于在世界坐标系中作反方向的平移或旋转。因此,从某种意义上讲,二者可以统一,只是各自出发点不一样而已。读者可以根据具体情况,选择其中一个角度去考虑,这样便于理解。

分享到:
评论

相关推荐

    基于Matlab和Madagascar的地震三维图形显示技术研究.rar

    在三维图形显示技术中,一个重要的方面是数据的体渲染(volume rendering)。Matlab结合Madagascar可以实现这种高级可视化技术。体渲染通过对数据体进行透明度和颜色的插值,形成深度感强烈的3D图像,揭示地震数据的...

    汇编三维图形

    而“三维图形”是指在计算机屏幕上通过数学算法和图形学技术构建的立体图像,广泛应用于游戏开发、可视化设计、工程仿真等多个领域。当汇编语言与三维图形结合时,我们可以创建出性能极佳且资源占用极低的图形程序。...

    OpenGL基础图形编程

     8.1.2 三维图形显示流程  8.1.3 基本变换简单分析  8.2 几何变换  8.2.1 两个矩阵函数解释  8.2.2 平移  8.2.3 旋转  8.2.4 缩放和反射  8.2.5 几何变换举例  8.3 投影变换  8.3.1 正射投影  8.3.2 透视...

    利用Opengl显示复杂三维图形的一种方法

    在本主题中,我们将探讨如何利用OpenGL来显示复杂的三维图形。OpenGL提供了一组丰富的图形绘制函数,使开发者能够构建出高质量、高性能的图形应用。 首先,OpenGL是一个基于向量图的API,它允许程序员创建复杂的...

    三维图形变换计算机游戏程序设计(与“矩阵”有关文档共115张).pptx

    本课程主要讲述了三维图形变换计算机游戏程序设计的基础知识,涵盖了向量、矩阵、平面、摄像机系统、视域、背面剔除、裁剪、颜色模型、显示器与缓冲区、绘制流程等内容。通过本课程的学习,学生将了解三维图形变换的...

    三维显示程序

    OpenGL是一个跨语言、跨平台的编程接口,用于渲染高质量的二维和三维图形。在这个程序中,开发者可能利用OpenGL来创建和管理三维模型,以及实现光照效果。光照效果包括环境光、漫射光、镜面光等,通过调整光源位置、...

    OpenGL图形开发指南(0fen)

    7.1 描述图元 7.1.1 齐次坐标 7.1.2 点 7.1.3 线 7.1.4 多边形 7.2 绘制图元 7.2.1 定义顶点 7.2.2 构造几何图元 第八章 OpenGL变换 8.1 从三维空间到二维平面 8.1.1 相机模拟 8.1.2 三维图形显示流程 ...

    三维图形变换ppt资料

    三维图形变换是计算机图形学中的核心概念,涉及如何在三维空间中表示、操作和呈现几何对象。本资料主要讲解了五个关键部分:三维几何变换、投影变换、三维观察、三维裁剪以及OpenGL中的三维图形变换。 在三维几何...

    ae三维显示

    标题中的“ae三维显示”指的是使用Adobe After Effects(AE)的控件或接口在C#应用程序中实现三维可视化。在IT行业中,AE通常用于视频特效和动画制作,但这里的使用方式是将其集成到桌面应用中,展示地理空间数据,...

    计算机图形学 三维管线

    计算机图形学是信息技术领域的一个重要分支,主要研究如何在计算机中表示、处理和显示图形。...在实际开发中,理解并熟练掌握三维管线的工作流程,能够帮助我们更高效地编写高性能的图形应用程序。

    图形学三维线段的裁剪

    (1)长方体及三维线段的显示流程 ;任务包括长方体的定义:三维点结构(齐次坐标,结构中应有x, y, z, w分量);面结构,其实为面的外环,即构成该面的顶点序列(逆时针顺序);三维线段的两个端点;三维几何变换;...

    OpenGL 基础教程

     8.1.2 三维图形显示流程  8.1.3 基本变换简单分析  8.2 几何变换  8.2.1 两个矩阵函数解释  8.2.2 平移  8.2.3 旋转  8.2.4 缩放和反射  8.2.5 几何变换举例  8.3 投影变换  8.3.1 正射投影  8.3.2 透视...

    图形三维模型重建及图形嵌套.rar

    总的来说,这个项目提供了从图像到三维模型的完整流程,包括图像处理、特征匹配、三维重建以及模型可视化。对于学习和研究计算机视觉、图像处理和三维建模的爱好者来说,这是一个极好的实践案例。通过理解并运行这些...

    二维图象的三维显示算法

    二维图像的三维显示算法是计算机图形学中的一个重要领域,它涉及到如何将平面的图像转换成具有深度感知的立体视觉效果。这种技术广泛应用于游戏开发、虚拟现实、电影特效以及科学可视化等多个方面。对于初学者来说,...

    OpenGL三维图形系统开发与实用技术 (基础编程篇)

    OpenGL三维图形系统开发与实用技术(基础编程篇)是一本专为初学者设计的教程,旨在帮助读者理解和掌握OpenGL这一强大的图形库。OpenGL是跨语言、跨平台的应用程序编程接口(API),它允许程序员创建复杂的3D图形和...

    SIMULINK的三维坐标图生成组件

    在描述中提到的“三维坐标图生成组件”,它是一种专门用于在SIMULINK环境中创建三维图形的工具。通过该组件,用户可以直接连线,将模型中的数据连接到这个组件,然后在三维空间中实时展示这些数据的变化,这极大地...

    三维重建 vtk 图形图像处理 项目 源码

    此外,项目中的"矿井三维显示"可能意味着项目不仅限于医学成像,也可能涉及到地质或工程领域的三维可视化。矿井的三维建模可以帮助工程师更好地理解地下结构,规划开采路径,或者在安全评估中模拟潜在的危险。 总之...

    计算机图形学三维模型.zip

    通过这个压缩包,学习者可以了解到实际3D建模项目中的工作流程,掌握模型的创建、编辑和优化技巧,理解计算机是如何处理和显示三维图形的。同时,对于计算机图形学的学习者,这也可以作为实践案例,加深对理论知识的...

    一个基于VC程序编写的三维CAD图形系统代码

    这个系统允许用户创建、编辑和查看各种三维图形,是工程、设计和艺术领域的重要工具。通过理解其核心概念和技术,我们可以提升在图形处理和软件开发领域的专业技能。 首先,让我们了解什么是VC++。VC++是Microsoft...

Global site tag (gtag.js) - Google Analytics