MFC框架下基于Vega的视景驱动程序设计研究.pdf
现代计算机(总第二六九期)MODERN CO MPUTER2 0 0 7.1 0开发案例0引 言视景仿真是仿真动画的高级阶段,也是虚拟现实技术的重要表现形式,它是使用户身临其境的交互式仿真环境,实现了用户与该环境直接进行自然交互 1。视景仿真的实时渲染依赖于图形库的支持,常见的最底 层 的 图 形 库 有 两 种:O p e n G L和D i r e c t X,其 中O p e n G L是跨平台的图形标准库,大多数渲染软件都是采用O p e n G L作为底层图形库 2。在O p e n G L的基础上,有许多用于虚拟现实系统的视景开发软件,比较常见的有:Wo r l dT o o l K i t、O p e n G V S和V e g a,其中WT K和O p e n G V S对虚拟场景的控制更为灵活,但需要的编程工作也更多,开发过程更复杂,而V e g a提供有图形化的虚拟场景配置工具L y n X可以使开发过程大大简化,复杂的控制功能也可通过V e g a提供的A P I来实现。在工程应用上M u l t i G e n-P a r a d i g m公司的V e g a软件环境已经是视景仿真业界的主流开发平台3。1 V e g a软件介绍V e g a是美国M u l t i G e n-P a r a d i g m公司推出的先进的软件环境,它主要用于虚拟现实技术中的实时视景仿真、声音仿真以及科学计算可视化等领域,它支持快速复杂的视觉仿真程序,为用户提供一种处理复杂仿真时间的便捷手段。V e g a把常用的软件工具和高级仿真功能结合起来,可使用户以简单的操作迅速地创建、编辑和运行复杂的仿真程序。由于V e g a大幅度地减少了源代码,从而大大地提高了工作效率,可以迅速创建各种实时交互的三维环境,以满足各种用户的需要 4。V e g a在实时视景仿真和虚拟现实中的应用中,是一个高性能的软件环境和工具包,其中包括了图形用户界面即L y n X、V e g a库和可调用的C函数的头文件。任何一个V e g a应用程序在开始运行时都要对各种参数提供初始值,在运行期间要保持或不断修改参数值,这些数据信息都存放在一个应用程序定义的文件中,英文为A p p l i c a t i o n D e f i n i t i o n F i l e s,简称A D F文件。L y n X界面实际上是创建和修改A D F文件的一个编辑器。2 MF C框架下开发V e g a应用程序V e g a起初是应用在S G I U N I X平台上的开发工具,技术基本成熟后才移植到Wi n d o w s平台 5,移植最基本目标就是确保己存在于U N I X平台上的V e g a程序能够容易地在P C平台上应用,所以其程序设计风格仍保持与U N I X程序设计相近,在Wi n d o w s平台下Wi n 3 2控制台对U N I X的兼容性比较好,大多数Wi n-d o w s下的V e g a开发都是在Wi n 3 2控制台下进行的。对于Wi n d o w s平台上的V e g a应用程序开发,有3种开发环境分别为:Wi n 3 2控制台程序、传统的Wi n-d o w s应用程序(带有Wi n M a i n()函数)和基于M F C(M i c r o s o f t F o u n d a t i o nC l a s s e s)的应用程序 6。2.13种开发环境比较分析基于Wi n 3 2控制台的程序没有特定的窗口函数,V e g a函数库中提供的窗口和事件管理的函数远不能MF C框架下基于 V e g a 的视景驱动程序设计研究李明泽,毛学刚,范文义(东北林业大学,哈尔滨1 5 0 0 4 0)摘要:关键词:程序开发;V e g a;MF C;视景驱动介绍V e g a视景开发软件的体系结构和在Wi n d o w s平台上V e g a可选择3种开发环境,根据实践详细地论述了基于MF C和V e g a应用程序设计的方法,以及MF C框架下开发V e g a视景驱动所遇到的问题及解决方法。该研究能够使开发者较容易的开发出基于MF C的V e g a应用程序,并为其提供很好的借鉴和帮助。收稿日期:2 0 0 7-0 8-0 3修稿日期:2 0 0 7-0 9-3 0作者简介:李明泽(1 9 7 9-),男,在读博士,助教,研究方向为遥感和地理信息系统!MODERN CO MPUTER2 0 0 7.1 0现代计算机(总第二六九期)开发案例满足实际应用的要求,而且Wi n 3 2控制台下实现网络数据传输等操作相当繁琐,基于传统的Wi n d o w s应用程序开发也是一项繁琐的过程,很多基础工作(例如窗口、菜单的创建)都需要自己动手逐行编写代码,这导致工作量增大,而使用M F C框架开发程序能有效应用套接字等封装类,从而极大地减小程序开发工作量。相对而言,应用M F C类库是Wi n d o w s平台下开发具有良好图形用户界面应用程序最方便的途径,V i s u a l C+6.0中的M F C类库已是一个相当成熟的类库,其中基于文档/视图结构的应用程序框架,己成为开发Wi n d o w s应用程序的主流框架结构。因此,选择把M F C作为V e g a应用程序的开发环境将是主流。2.2MF C框架下开发V e g a应用程序创建M F C框架下的V e g a应用程序主要有两种方法分别为:修改由向导生成的主视图类创建V e g a应用程序和用V e g a提供的z s V e g a V i e w类创建V e g a应用程序。下面就分别介绍这两种方法。(1)通过z s V e g a V i e w类开发M F C的应用程序为了便于开发者开发基于M F C的V e g a应用程序,V e g a通过继承M F C中的C V i e w类而派生出一个子类z s V e g a V i e w,这个z s V e g a V i e w类提供了启动一个V e g a线程最基本的功能,还以虚函数的形式定义了特定的应用要进行操作的通用接口,因此用户的应用程序只需从z s V e g a V i e w派生出新类,并根据需要重载必要的虚函数即可。从设计模式的观点来看,它是采用了模板方法模式(T e m p l a t e M e t h o d)。模板方法模式是一种类行为模式,其意图是定义一个操作算法的骨架,而将一些具体步骤延迟到子类中去,这是代码重用的一种基本技术。通过采用模板方法将用户开发一个基于M F C应用的工作量减少到最低,这是V e g a系统提供的方法,其初衷是好的,但由于M F C类库并不是一个支持多线程访问的类库。用户派生的子类通过在O n I n i t i a l U p d a t e()函数中调用基类的r u n-V e g a()来启动V e g a线程,并将派生类的指针作为参数传给新启动的子线程,这就是通过z s V e g a V i e w类开发M F C的应用程序存在的问题。由于源代码中的类空间和线程运行时的线程空间是可以相互交迭的,也就是说不同的线程在运行时可以访问相同的类的实例对象,而M F C类库本身设计时并未考虑到多线程访问,因此在线程间传递视类C V i e w将是危险的,实践也证明了这一点,在单文档多视中在V e g a线程中改变文档数据后通过调用函数U p d a t e A l l V i e w s()来更新所有相应的视图时旋即出现了访问保护异常的错误。(2)通过修改主视图类开发M F C的应用程序为了既能保持由模板方法设计带来的好处,又能够避免出现以上的错误,最好的方法就是通过修改由应用程序向导生成的主视图类来创建M F C框架下的V e g a应用程序。在Wi n d o w s环境下V e g a图形绘制工作由一个独立线程进行,所以,在应用程序向导产生的M F C程序的主视图类中,应调用线程函数A f x B e-g i n T h r e a d()来开启一个线程,其函数的原形如下:C Wi n T h r e a d*A f x B e g i n T h r e a d(A F X _ T H R E A D P R O Cp f n T h r e a d P r o c,L P V O I Dp P a r a m,i n t n P r i o r i t y=T H R E A D _ P R I O R I T Y _ N O R M A L,U I N Tn S t a c k S i z e=0,D WO R Dd w C r e a t e F l a g s=0,L P S E C U R I T Y _ A T T R I B U T E Sl p S e c u r i t y A t t r s=N U L L);其中:p f n T h r e a d P r o c为指向工作者线程控制函数的指针,该线程控制函数必须声明为如下所示的形式:U I NT M y Wo r k e r T h r e a d F u n c t i o n(L P V O I D p T h r e a d-P a r a m);因此,为了实现单独的V e g a线程,还应在主视图类中加入一个线程控制函数r u n V e g a P r o c(),其代码如下:U I N Tr u n V e g a P r o c(L P V O I Dp P a r a m)C M F C V e g a V i e w*h P a r e n t=(C M F C V e g a V i e w*)p P a r a m;v g I n i t Wi n S y s(A f x G e t I n s t a n c e H a n d l e(),h P a r e n t-G e t-S a f e H w n d();h P a r e n t-s e t V e g a I n i t t e d(T R U E);h P a r e n t-p o s t I n i t t e d();v g D e f i n e S y s(h P a r e n t-g e t A d f N a m e();h P a r e n t-s e t V e g a D e f i n e d(T R U E);h P a r e n t-p o s t D e f i n e d();v g C o n f i g S y s();h P a r e n t-s e t V e g a C o n f i g e d(T R U E);h P a r e n t-p o s t C o n f i g e d();w h i l e(h P a r e n t-g e t V e g a R u n n i n g()v g S y n c F r a m e();h P a r e n t-p o s t S y n c();v g F r a m e();h P a r e n t-p o s t F r a m e();h P a r e n t-s e t V e g a I n i t t e d(F A L S E);v g E x i t(0);r e t u r n0;!现代计算机(总第二六九期)MODERN CO MPUTER2 0 0 7.1 0开发案例创建完线程函数之后,就要加入一个V e g a启动函数,其目的是以当前视口句柄为参数调用A f x B e-g i n T h r e a d()函数来启动V e g a绘制线程。其中将初始化函数v g l n i t S y s()替换成为以当前视口的句柄为参数调用的v g I n i t Wi n S y s(),使V e g a绘制区附于应用程序客户区。其函数如下:v o i dC M F C V e g a V i e w:r u n V e g a()i f(m _ V e g a T h r e a d=N U L L)m _ V e g a T h r e a d=A f x B e g i n T h r e a d(r u n V e g a P r o c/V e g a线程控制函数入口t h i s/传递给控制函数的参数T H R E A D _ P R I O R I T Y _ N O R M A L/设定线程的优先级0/设定堆栈大小和父线程相同0/设定线程创建后立即执行N U L L/设定线程的安全属性);w h i l e(!g e t V e g a D e f i n e d()S l e e p(1 0);最后还要创建一个停止运行V e g a函数,把该函数放在主视图类的析构函数中。这样一个完整的基于M F C的V e g a应用程序基本完成,一个其主要过程如图1所示。图1M F C框架下V e g a应用程序创建过程3开发过程中遇到的问题及解决方法以下是笔者在M F C下开发V e g a视景驱动的编程中所遇问题,经过不断的探索和实践,其中大部分问题都得到了解决。在基于M F C框架程序中调用位置函数对模型直接定位,往往出现物体从场景中消失的现象,而通过为 物 体 附 加V e g a提 供 的P l a y e r类 对 象,并 调 用v g U p d a t e()函数强制更新当前实例,能够有效解决这个问题。用函数调用方式在程序中引进模型时,会出现内存大量被占用或者模型无法正确加载到场景中的现象,在需要引入大规模场景的情况下,用这种方式引入模型是不经济的,解决方法是在工程定义文件(*.A D F)中预先引进所有模型,但不要直接加入到场景中,而要在程序中根据需要对模型选择后再加入场景。在同时使用V e g a特殊效果模块和D I-G u y人物模块,并用到两个模块的初始化函数v g I n i t D I G u y()和v g I n i t F x()时,必须先调用v g I n i t D I G u y()然后在调用v g I n i t F x(),否则在应用程序中会看不到人物。应用程序退出后,V e g a线程仍需数十秒钟才能退出,对用户来说,会有一个相当长的不响应时间,这个问题可以利用V e g a线程句柄强制结束线程,达到快速退出应用程序的目的。通过以上问题的解决,M F C下的V e g a应用程序基本上能够稳定运行。其运行的结果如图2所示。图2M F C框架下V e g a应用程序运行结果图4结果与讨论用该方法创建基于V e g a和M F C的视景驱动应用程序,可以使用户从繁琐的程序框架细节的实现中解放出来,而把主要的精力放在应用程序本身的功能扩展上,完成各种所需的交互功能和要求的视觉效果。用该方法和V e g a软件提供的标准方法相比较,基本上解决了M F C下V e g a表现不稳定的问题。该方法能够使开发者较容易的开发出基于M F C的V e g a应用程序,并为开发者提供借鉴和帮助。但是在实际工程使用中仍然存在一些问题,例如内存泄露等,这些问题有待进一步研究。(下转第1 1 2页)!MODERN CO MPUTER2 0 0 7.1 0现代计算机(总第二六九期)开发案例R e s e a r c ho nV i s u a l D r i v e r D e s i g nB a s e do nV e g au n d e r MF CF r a me w o r kL I M i n g-z e,M A OX u e-g a n g,F A NWe n-y i(N o r t h e a s t F o r e s t r y U n i v e r s i t y,H a e r b i n1 5 0 0 4 0)A b s t r a c t:K e y w o r d s:P r o g r a mD e v e l o p m e n t;V e g a;M F C;V i e wA c t u a t i o n参考文献 1 F r e d e r i c kWi e l a n d,A l e x S z a b o.N a v a l R e s e a r c hL a b o r t o r y,J o n e H a y n e s.O b j e c t-O r i e n t e dD e s i g no f a S c e n e G e n e r a t i o nS i m u l a t i o n.P r o c e e d i n g s o f t h e 1 9 9 4C o m p u t e r S i m u l a t i o nC o n f e r e n c e,1 9 9 5:1 7 4 1 8 0 2 卢仁甫.基于V E G A平台的虚拟现实技术的研究.武汉:华中师范大学,2 0 0 6 3 董博,马立元,罗婧.基于M F C的V e g a应用程序设计.微计算机信息,2 0 0 6,2 2(0 4):2 6 4 2 6 5 4 龚卓蓉.V e g a程序设计.北京:国防工业出版社,2 0 0 2I n t r o d u c e st h es y s t e mo f V e g av i e wd e v e l o p m e n t s o f t w a r ea n dt h r e ek i n d so f d e v e l o p m e n te n v i r o n m e n t s w h e r eV e g ai s p l a c e di nWi n d o w s p l a t f o r m.A c c o r d i n gt op r a c t i c e,e l a b o r a t e st h e o c c u r r i n g p r o b l e m s a n dt h e i r s o l u t i o n s i nt h e d e v e l o p m e n t o f V e g av i e wa c t u a t i o nb a s e do nt h em e t h o do f M F Ca n dt h eV e g ap r o g r a m,a s w e l l a st h ef r a m eo f M F C.T h i s r e s e a r c he n a b l e sd e v e l o p e r st od e v e l o pV e g ap r o g r a m b a s e do nt h eM F C,a n do f f e r sav e r yg o o dm o d e l a n dh e l pt o d e v e l o p e r s.R e s e a r c ho nt h eA p p l i c a t i o no fWe bT e x t Mi n i n gT e c h n o l o g yi nP o w e r S u p p l yE I PO UL i,WA N GX i n-x u,C H E NM i n(G u a n g d o n g P o w e r G r i dC o r p o r a t i o nY u n f uP o w e r S u p p l y B u r e a u,Y u n f u5 2 7 3 0 0)A b s t r a c t:K e y w o r d s:A u t o m a t i c A b s t r a c t i n g;I n f o r m a t i o nE x t r a c t i o n;I n t e l l i g e n t D o c u m e n t s;E I PO nt h eb a s i s o fWe bt e x t m i n i n gt e c h n o l o g ya n dr e l a t e dt h e o r y,d e s i g n s We bt e x t m i n i n gs y s t e mf o r t h e o v e r a l l f r a m e w o r k,c o m b i n e s We bt e x t m i n i n g t e c h n o l o g y a n di n t e l l i g e n t d o c-u m e n t a t i o n,a n d E I Pt e c h n o l o g y,a s t h e l a t t e r s h o w s t h e f o r m e r f r o n t-e n d t o o l s,g r e a t l y b o o s t e dt h e f o r m e r s a p p l i c a t i o n.!(上接第9 5页)!#