杜丽美
(长治学院 计算机系,山西 长治 046011)
OpenGL在计算机图形学中的应用研究
杜丽美
(长治学院 计算机系,山西 长治 046011)
基于可视化的需求,研究在图形学中如何生成具有真实感的图形,主要引入了OpenGL函数,利用OpenGL函数中的光照、材质、雾化等函数对利用图形学生成的三角网格模型进行设置,以达到重建物体的目的。
计算机图形学;三角网状模型;OpenGL函数;光照;材质;雾化
计算机图形学[1]是一种使用某种数学算法将二维或三维图形以栅格的形式显示在计算机显示器上的科学。也就是说,计算机图形学主要研究的是利用何种算法在计算机中表示图形、以及进行图形的计算和处理。
计算机图形学的一个主要的目的就是要在计算机屏幕上生成具有真实感的图形。因此,应首先建立物体的几何表示,然后再将假想的光源、纹理、材质、雾等属性附于几何图形上,使得计算机屏幕上显示的几何图形更加接近于真实物体。目前计算机图形学往往和OpenGL一起使用[2]。
OpenGL实际上是一个丰富的三维图形函数库,除了具有基本的OpenGL函数外,还支持其他四类函数:OpenGL实用库、OpenGL辅助库、Windows专用库函数、Win32 API函数[3-4]。OpenGL的这些函数有强大的功能,比如:可以绘制三维物体,可以对物体进行光照、明暗处理、材质设置、纹理设置、雾化等效果。此外OpenGL还提供了双缓存,可以用来制作动画。OpenGL的这些强大的功能为实现三维物体重建技术、以及建立人机交互的三维场景提供了坚实的基础。
OpenGL不仅可以运行在各种流行的操作系统上,而且只要在基本的C或C++语言中调用相应的函数即可。
计算机图形学结合OpenGL函数渲染绘制出真实物体的三维图形的基本步骤如下:
(1)建立基本模型。首先利用计算机图形学中的算法将真实物体转化成能在计算机上表示的景物模型,复杂物体一般是表示成三角网状的模型结构。
(2)投影及视口变换。把表示出的模型放在三维空间中的合适的位置,并且设置视点(viewpoint),使得模型居中显示并且将观察者感兴趣的一面展现在屏幕上。
(3)光照、材质、雾等的设置。将模型展示在屏幕上以后,就开始真正的模拟真实物体了,这里主要通过设置OpenGL中的光照、材质、雾化函数来对真实物体进行模拟。
(4)显示三维图形。
对于现实生活中的复杂物体,要想将其显示在计算机屏幕上,可以首先利用某种技术手段提取真实物体表面的离散点,然后将这些离散点输入到计算机中,最后利用某种有效的算法将这些点联系起来构成三角网格的形式,最终在计算机屏幕上得到描述真实物体的三角网格模型。图3-1便是真实物体对应的三角网格模型
图3-1 三角网格模型Fig 3-1 The example of the triangul ation
建立好的模型如何在计算机屏幕上显示是关键,比如要显示在屏幕上的哪个位置、是否要按比例显示,这些问题都会影响真实物体的重建的效果,在OpenGL函数中主要提供了两种投影方式[5]:正射投影和透视投影。
(1)正射投影的视景体类似一个长方体,因此在投影的过程中无论物体距镜头是近的还是远的,但最终投影到屏幕上的物体尺寸是不变的。正射投影函数为:
函数中的参数表示了两个裁剪平面,即近裁剪面和远裁剪面,这两个裁剪面都是长方形,而且函数中的参数表明近裁剪面所对应的长方形的左下角点和右上角点坐标分别是(left,bottom,-near)和(right,top,-near);而远裁剪面所对的长方形的左下角点和右上角点坐标分别是(left,bottom,-far)和(right,top,-far)。
(2)透视投影的视景体类似一个棱台,它的特点是离视点近的物体大,离视点远的物体小。这种投影方式经常用在三维场景的模拟以及动画等需要反应真实性事件的情况中。此种投影方式所对的函数为:
这个函数的参数只定义近裁剪平面的坐标,即左下角点和右上角点的坐标分别为(left,bottom,-near)和(right,top,-near);远裁剪平面没有定义具体的坐标,只是定义了一个参数far,这个参数反应了透视投影的特点,far的大小表明远裁剪平面距离镜头的远近,而其对应的坐标是由系统自动生成的。
正射投影和透视投影只是采用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上,glViewport()函数主要是用来把由视景体截取的图像按照怎样的高和宽显示在屏幕上。对应的函数为:
此函数中4个参数决定了视口的位置:视口的左下角点坐标为(x,y),右上角点坐标为(x+width,y+height)。
首先对模型进行光照设置[5-6]。一般来说,光照设置包括三种光:环境光、漫反射光和镜面反射光。环境光(Ambient Light)可以来自地面、天空、墙壁等;漫反射光(Diffuse Light)表示某种给定的光源照射到物体表面后并均匀向四周反射出去的光;镜面反射光(Specular Light)为朝向特定方向反射出去的光。
OpenGL中的光照函数见下:
创建光源位置:glLightfv(GL_LIGHT0,GL_POSITION,light_position)
定义三种光:
以上函数中的第三个参数都是自定义的具体值,例如定义光源位置的具体值如下:
其次对模型进行材质的设置[5-6],和光源类似,材料颜色的成分也分为环境、漫反射和镜面反射三种。通常在一个场景中同时设置光照和材质两种特性,这两种特性同时作用在物体上时,效果为两者的叠加,即若光源颜色为(R1,G1,B1),材质颜色为(R2,G2,B2),那么最终看到的效果为(R1*R2,G1*G2,B1*B2)。材质的定义函数为:
其中face取GL_FRONT表明将材质应用到物体前面,取GL_BACK表明将材质应用到物体背面,取GL_FRONT_AND_BACK表明将材质应用到物体前后两个面上;pname一般取GL_AMBIENT或GL_DIFFUSE或 GL_SPECULAR或 GL_SHINESS;第三个参数为第二个参数对应的具体值。其中GL_SHINESS为镜面指数,也就是所谓的“高光区”的大小,此参数作用于模型上,可以使模型表面的制定位置处呈现一个光亮区域,使得模型更加接近于真实物体。
雾化的应用极为广泛,它的作用是使物体更加接近真实效果,而且也可以使物体看起来更加自然。因此将雾的效果应用于模型上,可以给人产生距离感,使得模型更加具有立体感。此外,雾的浓度可以控制,雾的颜色也可以任意设定。
在OpenGL程序中启动雾以及控制雾的函数为[5]:
glEnable(GL_FOG)
glFogfv(GLenum pname,TYPE param)
其中参数pname通常取GL_FOG_MODE、GL_FOG_DENSITY、GL_FOG_START、GL_FOG_END 或GL_FOG_COLOR,param则取对应的具体值。
经过以上三个步骤就完成了对真实物体的模拟,通过调用相应的输出函数将模拟重建的物体显示在计算机屏幕上。
本实验在VC6.0平台上进行,采集了海豚表面的离散点,采用正射投影的方式对海豚进行了模拟。
①图4-1(a)为在计算机屏幕上生成的海豚的三角网格模型。
②图4-1(b)为开启默认光照后的效果,从图中可以看出,对模型进行光照后,背光的部分颜色较暗,非常接近现实生活,而且一个场景中的两只海豚在同一光照条件下的颜色相同。
③图4-1(c)是在开启默认光照的基础上,对模型进行材质的设置并且设置“高光区”,从图中可见,在同一场景中,不同的海豚可以设置不同的材质,再加上“高光”处理,使模型更加真实化。
④图4-1(d)为在 4-1(c)的基础上加上了雾的效果,使得远离视点的淡蓝色海豚变得模糊,看起来生动、形象。
图4-1 海豚的模拟过程Fig4-1 The imitation of dolphin
文章主要针对OpenGL中的光照、材质和雾化函数对模型进行设置,并且显示了逼真的三维渲染效果。此外,OpenGL函数还有更加强大的功能,比如进行纹理设置、特殊光照处理还有实现动画效果等。
[1]赵玉峰.计算机图形学的发展及应用[J].科技信息,2008,(16):68.
[2]李文强,华祖耀.基于OpenGL的仿真可视化技术研究[J].计算机仿真,2005,(06):158-161.
[3]欧中亚.基于OpenGL的三维建模可视化软件开发[J].信息安全与技术,2011(07):48-50.
[4]汤彬.基于 OpenGL 实现三维绘图[J].上海工程技术大学学报,2002,(01):18-25.
[5]廖朵朵.OpenGL变换、光照、纹理、动画及特殊效果[J].微电脑世界,1996,(11):151-153.
[6]廖朵朵.OpenGL基本功能操作-建模、变换、颜色、光照与材质[J]. 微电脑世界,1997,(01):75-78.
TP391.41
A
1673-2014(2012)02-0050-03
2012—02—22
杜丽美(1983—),女,山西大同人,硕士,主要研究计算机图形学、图像处理等研究。
(责任编辑 单麦琴)