余顺园
摘要:本文基于OpenGL的实现了虚拟焊接场景中的四种特效。在OpenGL使用三个光源,实现了虚拟焊接中的光照效果,能够逼真的模拟焊接电弧位置变化及场景;在程序中通过函数glMaterial定义光照,计算虚拟焊接中用到的当前材质,实现了不同的材质效果;基于OpenGL同时还实现了双缓存动画效果及场景漫游效果。结果表明,这些场景特效比较逼真,效果良好。
关键词:OpenGL虚拟焊接场景特效
中图分类号:TP391.9 文献标识码:A 文章编号:1672-3791(2012)08(b)-0017-02
在焊接模拟场景中增加特殊效果目的是提高模拟场景的真实感觉。真实感图形绘制是计算机图形学的一个重要组成部分,它能反映物体表面颜色和亮度的细微变化;能表现物体表面的质感;能通过光照下的物体阴影,极大地改善场景的深度感和层次感,充分体现物体间的相互遮挡关系;能模拟透明物体的透明效果和镜面物体的镜面效果。
1 OpenGL简介
OpenGL是个专业的3D程序接口,是个针对底层开发的3D图形[1]。OpenGL称为开放的图形程序接口,它独立于窗口系统和操作系统,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用[2]。因为OpenGL在三维模拟方面的强大功能,使得它在许多研究领域中得到了广泛应用,在焊接仿真相关领域,涉及到模拟和三维显示的地方,也越来越多的采用了OpenGL技术。
利用OpenGL可以方便地生成高质量的真实感图形,OpenGL提供了各种光源及材质属性的设置函数,可以方便的设置所需光照模型。OpenGL提供的图像空间消隐能力,可方便的实现消隐算法。OpenGL提供的纹理映射功能,可以将BMP文件格式的图像映射到几何模型表面,纹理映射中的值除了可以直接用于绘制面着色,还可以利用纹理映射中的值来调制和混合原像素的颜色,从而产生特殊的效果。
2焊接场景特效实现
为提高虚拟焊接场景的真实感,利用OpenGL实现了焊接场景中光照效果、材质效果、双缓存动画效果、场景漫游效果等特效。
2.1 光照效果
虚拟焊接三维场景中,环境光照效果必不可少的。在OpenGL中,通过光源模型设置来实现场景的光照效果。在光源模型中,一共使用了三个光源,分布如图1所示。OpenGL程序本身只有一个默认的处在无穷远处的点光源0,默认的光源特性参数值都是1,即理想的白色点光源。
在OpenGL中,光线被假定成红、绿、蓝3种原色光的组合,因此,光源的颜色就由它所发出的这3种原色光的含量决定,而物体表面的颜色则由其反射这3种光的含量决定。光源0除了定义光源的位置外,还分别定义了环境光、漫射光、镜面光,OpenGL独立计算这四种成分光线,然后再将其结果叠加到一起产生光源0的最终光照效果。在模拟场景中,光源0用于整个场景的照亮效果。
针对虚拟焊接场景的要求,增加了两个光照模型,即跟随焊接电弧位置变化的光源1和垂直焊接工作台的光源2。光源1为移动的聚光灯,其亮度随着亮度参数改变而不断的变化,模拟电弧燃烧亮度的闪烁。光源1的移动通过在堆栈中使用平移函数来实现。
光源2和光源1类似,只不过光源2是普通的点光源,作用于整个焊接环境,使焊接环境光照效果更接近真实。控制光源0、光源1与光源2作用的时间,就可以实现虚拟焊接场景在焊工模式与旁观模式中简单的切换。在焊工模式下训练时,光源1和2打开,光源0被屏蔽,焊工通过头盔显示器观察到的场景只有电弧照亮的熔池和焊条端部,其余的场景由于没有光照呈暗色;旁观模式光源0必须打开,光源1和2可以打开也可以关闭。在旁观模式下,因为环境光的光源打开,指导教师或其他学员可以观察到全景效果。通过两种模式的转换,可根据需要选取环境光照效果,观察焊接过程。另外,光源0的打开与否还取决于训练时的电弧燃烧状态,只有当电弧处于燃烧状态时,即焊接正在进行,光源0才能关闭;电弧未处于燃烧状态时,焊接停止,光源0打开,照亮整个场景。这与真实焊接过程中焊工在焊接时戴上面罩操作,停止焊接时拿掉面罩观察焊缝成型效果的过程是一致的。
2.2 材质效果
材质是指物体表面对光的反射特性。OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。像光源一样,材料颜色也分成环境、漫反射和鏡面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。对环境光与漫反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光亮的高光将是白色的。
一个光源决定了光的颜色、反射特性、强度和入射光的方向。物体的几何性质及材质决定反射光的颜色、反射特性、强度。光和物体间的相互作用远比我们能够实时模拟的情况复杂。OpenGL在逼真显示和实时绘制之间通过以下方法实现均衡:只在几何顶点进行光照计算,对在所绘制的每个像素上执行光照运算的复杂处理进行简化。
材质的颜色与光源的颜色略有不同。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R=1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR×MR、LG×MG、LB×MB)。
同样,虚拟焊接场景中的两束光,相应的值分别为(R1、G1、B1)和(R2、G2、B2),则OpenGL将各个颜色成分相加,得到(R1+R2、G1+G2、B1+B2),若任一种成分的和大于1(超出了设备所能显示的亮度)则约简到1.0。这样最终的光照效果是光线与物体表面共同作用的结果,入射光和物体对光的吸收和反射决定了所看到的颜色。
虚拟焊接场景所包括的各种物体模型,在程序中都使用了不同的材质,这样整个场景看起来层次感更加明显。在程序中通过函数glMaterial(GLenum face,GLenum pname,TYPE param)来定义光照计算中用到的当前材质。face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;pname说明一个特定的材质;param是材质的具体数值。
2.3 双缓存动画效果
动画是计算机图形学的一个重要组成部分。要实现连续的动画,不出现人眼能觉察到的闪烁跳动,一般要达到24帧/s的刷新速度。程序设计中,采用了精简程序、强制刷新函数和双缓存技术三项技术来保证场景的刷新速度。
本程序测试中,运行时间小于0.04s,即画面刷新速度大于25帧/秒,满足连续动画的要求。强制刷新函数可以保证程序在设定时间周期对画面进行自动刷新,程序运行中设为20ms。OpenGL提供了双缓存技术支持动画制作。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。在焊接场景中,采用了双缓存技术,并在display()函数的结尾处,使用了前后台交换函数:void glutSwapBuffers(void)。即执行完一次display()焊接场景绘制过程,便交换前后台缓存,以便让下一帧图形在屏幕后绘制完成。
2.4 场景漫游效果
虚拟漫游技术是计算机仿真中重要的交互手段之一。它可以使得生成的虚拟场景更为生动。本文实现了对虚拟焊接三维场景的漫游,用户可以从不同角度、不同距离观察虚拟焊接场景。
在焊接场景中,通过改变场景模型的位置来实现漫游,即观察者的视点不动,通过模型的平移和旋转来改变观察场景模型的视角。在程序编制时,通过键盘的按键实现对漫游的控制,首先在视图的创建函数中设置视点的初始值,然后规定w键按下时远离场景;s键按下时靠近场景;z、x键按下时围绕x轴旋转;a、d键按下时围绕y轴旋转。实现焊接虚拟场景漫游后,还设置了一个默认位置恢复键,不管漫游到什么位置,按下Esc键后,都回到默认的焊工观察操作位置,进行焊接培训操作。
3 结语
本文利用OpenGL实现了焊接场景中光照效果、材质效果、双缓存动画效果、场景漫游效果等特效,大大提高了虚拟焊接场景中的真实感,在焊工的培训、焊接智能化方面有较好的应用。
参考文献
[1] LaLonde Wilf,Pugh John.Preparing for 3D graphics: interfacing to OpenGL.Journal of Object-Oriented Programming[J].1995,8(2):77.
[2] Faust Nickolas L,Bhaumik Dharmajyoti,Hodges Larry F.,Ribarsky William,Koller David, Lindstrom Peter.OpenGL VGIS.Proceedings of SPIE-The International Society for Optical Engineering[C].1996,2740:42-49.