浅议OpenGL中三维物体的显示过程

时间:2018-02-08 编辑整理:杨薇 李文高 来源:早发表网

摘要:在OpenGL中显示二维物体简单,但要显示三维物体具有一定的难度,主要考虑视点、投影等问题,不同的参数投影出的三维物体是不一样的,本文从三维物体的建模、观察变换、投影变换等角度来详细说明三维物体的显示过程。

关键词:透视投影;正视投影;视点变换

1 引言

生活的大自然中,我们看到的物体都是三维物体,但要将这些景物数字化传到电脑上显示,那么一切三维景物都是以二维平面图像的形式显示,在具体的显示效果中,我们又要求物体能够具备三维的视觉特性,因此在显示三维物体时,其过程是复杂的。OpenGL是目前图形开发的标准,它的性能表现异常优越,尤其在实现三维渲染、三维场景等方面有着非常逼真的效果。

要利用OpenGL来显示三维物体,可大体分为以下几个过程。

2 首先必须对三维物体进行建模

在显示三维图形之前,要对三维场景建模,并对场景中的实物建立三维景物模型。如果我们想在OpenGL中完成基本的三维图形基础模型建立并不困难,强大的OpenGL软件包中包含了大量的基础图元,除此以外辅助库中增加了很多描述三维图像人函数及图元。这些函数为我们提供了基础图形的模型。因此我们现在来绘制基本的三维图形就很容易,只需要掌握基础的三维图形图元函数,例如绘制球体可用glutWireSphere函数来完成,绘制圆锥体可以函数glutWireCone来完成,绘制8面体可用glutWireOctahedron函数来完成。

3 将建模三维物体转换成世界坐标系中的三维物体

随着计算机图形学的发展各种显示三维图像的技术不断涌出,利用当前的三维技术,我们可以将大自然的景物再现,在实现过程中主要利用三维形体来表示物体信息。具体的实现过程,我们通常用可视化技术来完成,设计师们可以在设计三维图像时突破传统思维尽情发挥自己的想象设计出更出众的作品。机械工程师们可以利用三维技术直接设计三维机械零部件,不必在二维技术中纠结如何展现三维的特性。医生利用三维彩超直接生存三维直观的扫描图像,这样更精确的分析出病人的病灶。军事指挥员则可以利用三维软件生存各种复杂的三维实战地图,并在模拟的地图中完成各种三维飞机、导弹、军舰等指挥,并最终分析得出最佳作战方案。

我们生活的大自然是一个三维的物体世界,为了能够尽量准确逼真的将大自然还原到电脑中,我们需要一个世界空间,该世界空间就是所有物体所在的三维空间,在该空间中定义的坐标系称为世界坐标系,物体在三维空间中的运动及形变的过程称为世界变换。世界坐标系是物体的全局坐标系,各个物体的模型统一在这一坐标系下,便于表达多个物体的显示。

将模型转换成三维世界中的物体,就需要进行模型变换。所谓“模型变换”,指的是从模型坐标系到世界坐标系的转换。

4 观察变换

真实世界里所有物体都是三维的,我们要想将世界坐标系中的三维物体转换到二维平面上,需要经过观察变换来完成。

要获得三维世界坐标系场景的显示,必须先建立观察用的坐标系。然后将对象描述转换到观察坐标系中来。这一过程我们通常称为视点变换。为了描述视点变换,我们引入了一个概念即照相机,在常规拍照时,我们常常选择好景点后开始支好三脚架,并将照相机放在三脚架上面,此时将照相机对准三维景物。通过不断的调节视点,将景物最好的呈现在相机上,该过程叫视点变换。默认情况下,视点位置即相机所在位置为世界坐标中的原点,并且规定反Z轴为相机的初始方向,在这种情况刚好,刚好相机与物体是重叠的。

函数gluLookAt是OpenGL实用库中提供的视点变换函数,此函数共有三个变量,每个变量表示视点的位置、相机瞄准方向的参考点以及相机的向上方向。通过调用这个函数之后,就设定好了视点的位置了。

5 投影变换

在相机和物体都放好后,我们要不断的调整相机焦距及相机镜头位置,使景物以最美最恰当的角度呈现的相机内。同样,在OpenGL中为了让三维物体以最真实的样子投影在二维坐标中,就需要投影变换。利用投影降低维数的方式,我们能够让物体以合适的位置、方向以及大小来显示出来。投影变换的最终目的就是定义一个视景体,将所需要的景物框在该体内,视景体外的多余景物利用相关算法裁掉。投影包括透视投影和正视投影两种。

(1)透视投影

透视投影是一种最常用的投影方式,该方式来自于我们的生活习惯及视觉常识,在视点附近的景物大,随着与视点的距离增加物体越来越小。该视景体犹如一个顶部和底部都被进行切割过的棱椎。在动画设计、视觉仿真以及其它许多需要反映真实性物体时常用到透视投影。

OpenGL中,透视投影主要通过两个投影函数来完成,分别是glFrustum函数和gluPerspective函数。

函数glFrustum的作用是创建一个透视视景体。它的操作原理是先创建一个用与透视投影的矩阵,然后用这个矩阵乘以三维物体的各个顶点坐标组成的矩阵。这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。

gluPerspective是一个透视函数,其作用最终也是创建一个对称透视视景体。在使用该函数时应注意,通过设定不同的参数,我们可以定义视野在各个平面的角度、范围值、投影平面宽度与高度的比率、远近裁剪面沿Z负轴到视点的距离。

(2)正射投影

该投影又称为平行投影。正射投影的原理是创建一个矩形平行管道视景体。正射投影的最大特点是物体的大小尺寸不依赖于物体与相机的距离。因此这种投影通常用在一些物体尺寸及角度投影后没有变化的行业,目的是让施工或者制造时保持物体比例大小,如建筑蓝图绘制和计算机辅助设计等方面。

OpenGL中使用正射投影主要通过glOrtho和gluOrtho2D两个函数来实现。

6 视口变换

生活中当我们冲洗照片时需要指定照片的尺寸大小,这相当于OpenGL中的视口变换。视口变换就是在电脑屏幕上指定二维图像的大小,通过变换,我们可以指定景物在屏幕中的一个矩形区域,该区域规定了位置范围,尺寸大小。

在计算机图形学中,视口变换就是将物体应用一系列的变换算法显示于指定窗口的矩形区域内,这些算法包括几何变换、投影变换和裁剪变换。在OpenGL中通常我们应用glViewport(GLintx,GLinty,GLsizeiwidth,GLsizeiheight);这个函数定义一个视口,该函数我们称之为视口函数。视口在屏幕中的初始位置由参数XY来指定,视口的宽度和高度由width和height来指定。在使用该函数时如果不指定参数,系统会给我们一个默认值,该默认值为(0,0,winWidth,winHeight)。所有这些值都是以象素为单位,全为整型数。

经过以上过程,一个三维图形就可以完整的显示在我们的屏幕内。


职称
论文

期刊
发表

加急
见刊

写作
咨询

课题
专答

编辑
顾问

关注
我们

返回
顶部