利用OpenGL开发化工过程仿真视景系统
实时视景仿真系统是一套多媒体实时计算机网络系统,主要用于驾驶模拟、军事指挥、仪表模拟、控制系统模拟等方面,将其用于化工过程仿真培训器[1],成为培训器现场操作站的重要组成部分,与现场操作站配合使用。现场操作站是用来模拟生产装置控制室外的操作环境,如电机、泵、管道、阀门、现场仪表、现场控制盘等,从而提供副操作员的操作平台。视景系统为现场操作人员实时提供进行现场操作的虚拟景象,可以逼真地再现实际现场的生产情况和主要设备,可以使现场操作人员的感官和思维活动进入仿真回路中,在形象时空中获得生动的感官体验,进一步增强仿真培训效果。
1 开发工具介绍
OpenGL是Microsoft、SGI、IBM、SUN、HP等多家世界著名公司在GL的基础上联合推出的一个通用共享的开放式三维图形标准,它独立于窗口系统和操作系统,实际上也是一个图形与硬件的接口。OpenGL可在Windows NT 3.51以上版本或Windows 95上运行,采用Visual C++2.0或以上版本作为开发平台。
OpenGL[2]是一套图形标准,它严格按照计算机图形学原理设计而成,符合光学和视觉原理,非常适合视景仿真系统。首先,在OpenGL中允许视景对象用图形方式表达,如由物体表面顶点坐标集合构成的几何模型,这类图形数据含有丰富的几何信息,得到的仿真图像能充分表达出其形体特征;而且在OpenGL中有针对三维坐标表示的顶点的几何变换,通过该变换可使顶点在三维空间内进行平移和旋转,对于由顶点的集合表达的物体则可以实现其在空间的各种运动;其次,OpenGL通过光照处理能表达出物体的三维特性,其光照模型是整体光照模型,它把顶点到光源的距离、顶点到光源的方向向量以及顶点到视点的方向向量等参数代入该模型,计算顶点颜色。因此,视景仿真图像的颜色体现着物体与视点以及光源之间的空间位置关系,具有很强的三维效果。另外,为弥补图形方法难于生成复杂自然背景的不足,OpenGL提供了对图像数据的使用方法,即直接对图像数据读、写和拷贝,或者把图像数据定义为纹理与图形方法结合在一起生成视景图像以增强效果。为增强计算机系统三维图形的运算能力,有关厂家已研制出了专门对OpenGL进行加速的三维图形加速卡,其效果可与工作站相媲美。由此可见,OpenGL非常适合微机环境下化工过程仿真培训器中视景系统的开发。
2 系统结构
化工过程仿真培训器中视景系统的主要功能就是根据教师站上运行仿真模型所产生的生产过程状态数据,从外观上逼真地反映出实际生产现场各种设备的运行情况,同时容许培训人员进行模拟的现场操作,并将这些操作结果及时反馈到教师站的数学模型中,以便能够根据从教师站的数学模型中所产生的新的生产过程状态数据,及时反映操作后的现场情况。
为了解决微机仿真网络系统的可靠性差、可扩展能力低等问题,本系统充分利用了Windows NT的多任务处理、消息驱动技术、图形处理技术和网络功能。在教师站上利用空状态函数进行模型程序的计算,提供定时控制其运算周期;在学员站上通过MDI各子窗口完成操作画面的实现;利用多线程技术和面向对象的消息驱动技术来实现现场操作站视景表现。这样程序的总控模块得到了简化,各操作画面间的调用简单。其仿真培训器系统结构如图1所示。
图1 系统结构框图
3 视景的表示与生成
VC环境下基于OpenGL标准开发视景系统,首先应解决OpenGL与VC窗口系统的接口问题,为OpenGL创建适当的图形操作描述表并设置正确的点格式。下面举例说明建立应用程序框架的具体方法和基本步骤:
① 利用MFC创建名为MyExc基于单文档(或多文档)的项目文件;
② 选择Project/Setting菜单选项,在Link栏的Lib输入域中添加Opengl32.lib,Glu32.lib和Glaux.lib三个库函数;
③ 选择View/ClassWizard菜单选项,打开MFC ClassWizard对话框,选择Message Maps,在ClassName栏中选择CMyExcView类,进行如下操作:
static PIXELFORMATDESCRIPTOR pfd={
sizeof (PIXELFORMATDESCRIPTOR),
1,
PFD-DRAW-TO-WINDOW|PFD-SUPPORT-
OPENGL|
PFD-DOUBLEBUFFER,
PFD-TYPE-RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0,
32,
0,0,
PFD-MAIN-PLANE,
0, 0,0,0 };
CClientDC dc (this);
int pixelFormat=ChoosePixelFormat (dc.m-hDC, &pfd);
BOOL success=SetPixelFormat (dc.m-hDC, pixelFormat, &pfd);
m-hRC=wglCreateContext(dc.m-hDC);
.选择WM-CREATE消息,在OnCreate()函数中对OpenGL进行初始化,定义像素存储格式;
.选择WM-DESTROY消息,在OnDestroy()中添加以下代码:
wglDeleteContext (m-hRC);
.在PreCreateWindows()中,添加
cs.style|= WS-CLIPSIBLINGS|WS-CLIPCHILDREN;
.在OnDraw()中,添加
wglMakeCurrent(pDC->m-hDC, m-hRC);
DrawScene();//用户自定义函数,用于绘制三维场景;
wglMakeCurrent(pDC->m-hDC, NULL);
.添加成员函数DrawScene():
void CmyExcView::DrawScene() { /* 三维场景绘制代码*/}
.添加头文件说明:#include “GL\gl.h”
#include “GL\glu.h”
#include “GL\glaux.h”
最后在MyExcView.h中对CMyExcView类添加保护型成员变量声明: protected: HGLRC m-hRC; 同时添加成员函数声明:void DrawScene(); 这样一个基于OpenGL标准的程序框架已构造好,只需在DrawScene()函数中添加所要显示的视景代码。
OpenGL基本库提供了绘制基本图元的函数,如绘制点、线、多边形等,调用这些函数即可构造并显示视景。对于复杂物体,这样做显得过于繁琐,浪费大量的时间和计算机资源。利用名为“Convert”的转化软件和常用的动画软件3DS可以简化复杂物体的建模,方法如下:先利用3DS建立复杂物体的几何模型,再利用“Convert”将*.3ds类型的文件转化为符合OpenGL格式的*.c类型的文本文件,即可得到相应复杂物体的顶点坐标值及对应点的纹理坐标值等数据,且内含该物体的OpenGL显示列表,直接用于系统调用生成仿真图像;关于显示三维实体所用的几何变换、投影变换、裁剪、视区变换、建立光照模型、定义材质等操作这里就不再详述,可查阅相关手册或在线帮助。
4 计算机图像生成
计算机图像生成[3,4](CIG)是利用计算机以视频速率模拟产生光学画面的一种方法,广泛用于各种军事及民用工业设备的训练与教学,主要用于获取具有真实感的背景图像。计算机图像生成的途径主要有两类:第一类方法是用计算机图形学的三角形面片为基元,配以纹理填充和光照模型,最后以透视投影到视见区产生可见画面,利用OpenGL中的纹理映射技术、融合技术及深度测试可以实现具有真实感的自然景物背景,其缺点是速度受硬件限制;第二类方法是图像序列法。在海量外存(光盘或实时磁盘)上存储空间连续的大量图像(可达1.0×105帧),可记录相当范围的实际景物,随后根据操纵者的运动选取所需场景予以动态显示。这类方法达到实时要求的关键是高速海量外存,其特点是算法运算量固定,不随景物复杂度和逼真度的增加而改变,并且用户可以根据需要更换仿真内容,但不利于表达运动物体。通过比较,可以看出图像序列法逼真度高,运算量固定,是一种很有前途的方法,但为获得连续景物显示,需要克服价格昂贵的大容量、高速外存设备等不利因素。图像生成系统一般结构如图2所示。
图2 图像生成系统结构框图
5 动画表现
仿真对象可视化信息的动画表现是一个关键问题。目前,AutoCAD、3D Studio、Animator都具有一定的动画功能,但都是传统的计算机动画,即关键帧动画,帧动画是由若干幅连续的画面组成的图像或图形序列,即物体的运动路径需人为指定;而基于物理的计算机动画(也称过程动画、算法动画、造型动画)可将环境及特征因素考虑在内,利用运动学、动力学等学科规律,建立模型的运动方程,作为动画模型的运动路径。造型动画需对每一个活动对象分别进行设计,赋予每个对象一些特征(如形状、尺寸、颜色等),然后用这些对象拼成完整的画面,这些对象在设计要求下实时变换,最终形成连续的动画过程。由于硬件速度和其他主客观条件的限制,目前只能采用关键帧动画,但三维实体造型动画一直是动画开发人员及用户追求的最终目标。
双缓存(double-buffering)显示法是实现实时动画的理想方法,又称实时动画法、换页面动画法。采用双缓存器显示法时,尽量减少在绘图页面上的作图时间是增强动画效果的关键。OpenGL提供了双缓存技术的一系列函数,该技术提供了生成动画效果图形所需要的机制,使得所生成的图形能够像电影一样平滑运动。双缓存即前台缓存和后台缓存,任何时刻只显示前台位面,其绘图例程正常情况下只更新后台位面。为了获得平滑的动画效果,将一个已完全画好的图像在前台位面显示一段时间(如1/30 s),与此同时,清空后台位面并绘好下一幅图像,然后调用SwapBuffers()函数交换前后台位面,把已经生成的图像从内存拷贝到屏幕上显示,这样就很方便地实现了动画效果。
6 结束语
OpenGL三维图形标准这一开放式图形库使得在微机上实现三维真实感图形的生成与显示成为可能。开发者可以有效地利用OpenGL提供的丰富的三维变换、光照、纹理、动画及特殊效果函数等来建立三维模型和进行三维实时交互,从而开发出效果理想的视景系统,并进一步为虚拟现实的研究与开发打下坚实的基础。同时由于目前国内介绍OpenGL的资料极少且很少涉及到其内核,故利用OpenGL进行开发时需要不断摸索并有效地利用互联网来获取信息。
上一页12