`
micheal19840929
  • 浏览: 161806 次
  • 性别: 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,再映射到视口区域内,这样才能显示在屏幕上。

 

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

分享到:
评论

相关推荐

    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图形开发指南(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 三维图形显示流程 ...

    图形学三维线段的裁剪

    (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 透视...

    图形学消隐

    在C++界面下,用MFC实现的消隐算法,还有代码。

    OpenSceneGraph三维渲染引擎编程指南.pdf

    5.2.20 三维纹理映射示例 166 5.3 光照 171 5.3.1 osg::Light类 171 5.3.2 osg::LightSource类 172 5.3.3 场景中使用光源 173 5.3.4 简单光源示例 174 5.3.5 聚光灯示例 176 5.4 材质 182 5.4.1 ...

    OpenSceneGraph三维渲染引擎设计与实践

    8.3 二维图形用户接口 217 8.3.1 窗口设备 217 8.3.2 windows下窗口设备的实现 219 8.3.3 范例:使用windows api构建渲染窗口 221 第9章 场景中的动画效果 225 9.1 场景动画基本组件 226 9.1.1 关键帧 226 ...

    开源分享!基于stm32f4的三维旋转显示平台设计-电路方案

    其一,由于高效解析算法的提出,大幅简化了真三维显示器显示数据的获取难度,只需在PC端获得当前较为标准化的三维图形的三角面顶点数据流文件,即可在真三维显示平台上显示出来,使得真三维显示器的整体显示流程大为...

    计算机图形学 图形变换

    6.1 变换的数学基础 6.2 几何变换 6.3 坐标变换 6.4 投影变换 6.5 图形的显示流程 6.6 三维裁剪

    计算机图形学基础-pdf.zip

    7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL...

    OpenSceneGraph三维渲染引擎编程指南

    5.2.20 三维纹理映射示例 166 5.3 光照 171 5.3.1 osg::Light类 171 5.3.2 osg::LightSource类 172 5.3.3 场景中使用光源 173 5.3.4 简单光源示例 174 5.3.5 聚光灯示例 176 5.4 材质 182 5.4.1 材质类 182...

    计算机图形学之投影算法(ppt)

    对三维图形的建立,显示介绍的很详细,特别是显示流程图都有

    图驴-三维浏览器 v2.0.2.12.zip

    项目组制内部成员管理,图片、文档自动转化为二维程序沟通,3Dmax输出包自动转化为三维程序沟通 4、私人云盘,无限浏览 一个项目占N个GB?图驴嫌你项目太少,云端已有文件,你再传瞬间秒传,不支持分享,更私密、...

    图形学图形消隐

    掌握三维图形的显示流程;掌握长方体自消隐的算法。 2. 实验步骤: (1)长方体表面模型的定义 三维齐次坐标结构的定义,面结构的定义,面结构中添加可见性属性;顶点表的定义,面表、与顶点表的关系。 (2)几何...

    计算机图形学教程含练习题pdf格式的

    平移坐标轴旋转一般三维旋转缩放其它变换复合变 换坐标变换 七三维观察 1 观察流程观察坐标1 课时 2 投影2 课时 3 观察体和一般投影变换2 课时 4 裁剪2 课时 规范化观察体视口裁剪Cohen-Sutherland 算法梁友栋 -...

    计算机图形学课程设计任务书[1].doc

    《用OpenGL绘制一三维图形》 " "具体要求: " "绘制三维图形; " "添加纹理。 " "11.《设计一个分形树》 " "具体要求: " "写出算法分析步骤; " "实现该算法; " "改变输入,观察分形图形。 " "12.《设计B样条...

    计算机图形学作业题.doc

    熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方 法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的...

    MATLAB函数参考

    13.2基本三维图形 13.3三维颜色控制 13.4三维光照模型 13.5标准调色板设置 13.6三维视点控制 13.7坐标轴控制 13.8图形注解 13.9拷贝与打印 14 特殊图形 14.1特殊二维图形 14.2等高线及其他二维图形 14.3...

Global site tag (gtag.js) - Google Analytics