微智科技网
您的当前位置:首页基于MFC的Vega Prime场景漫游驱动框架的设计

基于MFC的Vega Prime场景漫游驱动框架的设计

来源:微智科技网
第21卷 第2期 Vo1.21 No.2 电子设计工程 Electronic Design Engineering 2013年1月 Jan.2013 基于MFC的Vega Prime 场景漫游驱动框架的设计 赵月.王建华 (江苏科技大学电子信息学院,江苏镇江212003) 摘要:采用Vega Prime仿真技术结合MFC(Microsoft Foundation Classes)多线程机制实现场景驱动框架的设计。分析 了多线程中场景切换遇到的问题,并给出了解决方法。通过对各个进程进行黑箱化和对不同模块进行单独封装.用共 享内存映射文件实现进程间的数据交换,利用windows消息机制实现进程间的同步。解决场景切换的问题和进程并 发存取数据的问题 关键词:MFC;Vega Prime;多线程;内存映射 中图分类号: rP317 文献标识码:A 文章编号:1674—6236(2013)02—0031—03 Research on designing the virtual scene-driven framework of Vega Prime based on MFC ZHAO Yue,WANG Jian—hua (School ofElectronics andInformation,Jiangsu University ofScience and Technology,Zhenjiang 212003,China) Abstract:Achieve the design of the scene-driven framework based on Vega Prime and combined with the multi-threads of the MFC.Analysed the problems in switching screens,and a proper solution was presented.Used the technology of black box to process every process and packaged diferent modules.Memory—mapped file was used to fulifll inter-process communication. Used the windows message system tO achieve inter-process synchronization.The method not only solves the problem of switching screens,and also the problem of concurrent access to data. Key words:MFC;Vega Prime;multi-threads;memory-mapped 虚拟漫游是在真实场景或虚拟场景中,借助必要的装备 以自然的方式在该场景中进行漫游.从任意角度对环境中虚 驱动.在Windows平台上进行VP开发,采用VC++编程。MFC 基于文档/视图结构的应用程序框架结构是开发Windows应 用程序的主要框架结构。文档对象用于保存应用程序的数 据.视图对象用于数据的显示和用户的交互圆。两种结构联系 又.分工明确.简化了开发过程 MFC提供多线程应用程序编程[31。包括用户界面线程UI (User Interface)和工作者线程,两种线程区别于UI线程有消 息循环功能,工作者线程没有。UI线程既是MFC的主线程, 进行创建窗口并处理发送到该窗13的消息.作为主要仿真界 拟对象进行观察,从而产生身临其境的感觉,同时也可以对 其中的物体进行规划和操作。 文中是为了实现在实时仿真系统虚拟环境中的漫游,建 立视景驱动框架实现实时驱动虚拟场景的变化。Vega Prime (VP)提供多种开发模式Ⅲ,一是使用VP的Lynx Prime图形 界面,适合简单交互性不高的小系统:二是运用VP的API函 数进行的开发,通过C++编程,调用VP的API函数实现对视 景的驱动,可以开发较复杂的系统:三是结合前两种模式进 行的全面开发,首先通过Lynx Prime用户界面建立acf文件, 再将VP的API函数与已经配置完成的acf文件进行结合。 面,负责开启VP线程、终止VP线程等,控制VP仿真过程。 相对UI线程外的其它线程是工作者线程。在MFC下实现VP 程序.即创建一工作者线程,在线程主函数里调用VP初始化 函数和执行主循环。系统框架如图1所示。 外部数据和 文中采用第3种模式。可以大幅减少源代码开发时间.降低 对开发人员要求.这是也最常用的开发模式。 鉴于MFC的开发框架有着友好的交互界面和消息驱动 机制.本文详细介绍了在MFC框架下开发基于Vega Prime 视景驱动程序的方法。 VP状态 图1系统框架 Fig.1 System framework 1 建立基于MFC的VP视景驱动程序 实现虚拟场景的漫游,首先需要解决的是三维视景实时 收稿日期:2012—09—25 稿件编号:201209182 基于MFC的VP窗口显示包含了MFC和VP窗口。MFC 窗13应作为VP窗13的父窗口,配置过程中将要利用VP中vr Window类提供的setParent(Window win)函数 。将MFC的视 图类CView窗口句柄m_hWnd传递到vpWindow窗13即可。 作者简介:赵月(1988一),女,安徽六安人,硕士研究生。研究方向:信号与信息处理,虚拟现实技术。 一31— 《电子设计工程)2013年第2期 假设基于MFC的VP项目名称为MFCVP。 VP工作线程控制函数主要代码如下: UINT vpWorkThread(LPVOID pP ̄am) { CMFCVPView pView=(CMFCVPView )pParam: vp::initialize(一arge,一argv); myVPApp myApp=new myVPApp(); myApp->define(“simple.acf”); myApp->configure(); vpWindow myvpWin= vpWindow::begin(); If(myvpWin) ( myvpWin->setParent(pView一>GetSafeHwnd()); CRect rect; pView一>GetClientRect(&rect); myvpWin->setOrigin(0,0); myvpWin->setSize(rect.Width(),rect.Height()); myvpWin->setBorderEnable(false); } pView一>m—bRunning=TRUE; While((pView->m_bRunning)&&(myApp->beginFrame ()>0)) { myApp一>endFrame(); l myApp->unconfigure(); myApp一>unref(); VP::shutdown(); retum 0; } 启动VP工作线程主要代码: Void CMFCVPView::vpStart() { If fm_bVPStarted==FALSE) { mbEndVPThread=FALSE: _m_bVPStamed=TRUE: vpThread=AfxBeginThread(vpWorkThread,this); while(!getvpDefined()) { Sleep(10); ) J 中止VP工作线程,在UI线程结束之前,应先结束VP 工作线程。因为VP是基于多线程的,若直接退出主线程会引 发异常。 // ̄止VP工作线程主要代码: -32- Void CMFCVPView::vpStop() { If(m_bVPStamed==TRUE) f mbEndVPThread=TRUE: WaitForSingleObject(vegaThread->m_hThread,INFINITE); ) CView::OnDestroy(); } 2 MFC框架下VP的问题分析及解决 MFC类库编程环境下调用VP基本采用如下的方法: 首先单独创建一工作线程运行VP整个程序流程,包括 初始化、定义、配置、仿真循环。然后在MFC框架视图类叶I添 加成员函数负责开启线程。再利用API函数AfxBeginThread ()开启VP线程_5l’并将该视图类的指针传到VP线程中,作 为线程函数的输人参数。这样使得文档类和视图类的公有成 员变量在VP线程中可以被方便的读写.编程的灵活性得到 了提高。 但这样的方案却存在着问题,因为视图类(CView)的指 针被传送到主线程之外其它线程中去.使得不同线程在运行 时可以访问到相同的CView类实例。而MFC类库本身设计 并没有考虑到多线程的访问.所以在线程问传递视图类 (CView)是不安全的 2.1在VP线程中更新视图时访问保护异常错误的研究 在实际开发应用中.在不退出当前应用程序前提下进行 更新视图会出现错误。VP线程在没有退出的情况下进行重 新配置将导致失败,那么终止正在运行的线程,然后再重新 开启一新的线程.在初始化VP阶段时.VP也会出现地址访 问保护错误。 下面分析错误产生的原因[61.基于MFC的VP应用程序 在配置中要利用VP中vrWindow类提供的void setParent (Window win)函数,将MFC的Windows窗口句柄m~hWnd 传递给VP作为其父窗口。由此可以判断出,基于MFC的vP 应用程序实质上是将VP渲染放人到MFC的View窗口中进 行的。 VP由于是基于多线程的.所以在初始化过程中会自动 开启一个VP窗口子线程 该子线程会根据传送的窗口句柄 去创建一个与该句柄对应的窗口有相同大小的窗口,附存该 窗口上。在用户终止VP线程时,该窗口线程不会自动中止, 而且也没给用户提供终止函数。再次启动VP线程,进行初始 化时.不会启动新的VP窗口线程.任保留原来没有被终止的 窗口线程。这样就会导致再次启动VP线程时会出现地址保 护错误。因此,终止VP线程也不能实现场景切换。 2.2基于进程的场景切换方法 首先分别创建两个进程,VP进程和MFC主进程。就是 将同一个应用程序中的不同部分进行相互黑箱化 ,彼此之 赵月,等 基于MFC的Vega Prime场景漫游驱动框架的设计 间仅通过定义好的接口进行访问,这就最大限度地减小各部 分之间的相互影响。 ,/关闭文件映射对象CloseHandle(m hMap); CloseHandle(m_hMapSave); /,删除临时文件 然后在此基础上对Vega Prime场景中对实例的驱动,包 括初始化、定义、配置、仿真循环和退出等操作封装成一个 类,对特效模块如碰撞等效果封装成一个类,各类功能互不 干扰,程序互相访问调用。 最后解决VP进程和MFC主进程之间快速有效地进行 DeleteFile(m_FileName); 4多场景仿真系统进程的实现 根据上文提出的方法,对于多进程仿真系统中实现多场 景的驱动框图如图2所示,其中图中省略了VP进程部分对 实例驱动和特效模块用不同的类进行封装的结构图。图2中 显示了两个进程间实现的流程图。进程间采用内存文件映射 通信问题。 因为在VP进程和MFC主进程间除了要传递大量的视 景驱动数据外,还要进行一些控制信息的传递,鉴于实现的 快捷性、进程通信速度上的性能要求以及便与功能的扩展等 方面的综合考虑,采用内存映射文件的方式。 本文通过共享内存实现进程间的数据交换.利用 windows消息机制实现进程间的同步,两种机制结合使用,不 仅解决了交换数据量小的问题.还解决了进程并发存取数据 的问题。 3 同机进程间内存映射的实现 从使用者的角度看,数据共享方法是通过让两个或多个 进程映射同一文件映射对象的视图来实现的.这意味着他们 将共享磁盘上同一文件或者物理存储器的同一页面。因此, 当一个进程将数据写入一个共享文件映射对象的视图时.其 它进程可以立即看到它们视图中的数据变更情况。通过上述 操作,用户操作文件就能够达到操作内存一样的效率,多个 进程操作该映射文件实现进程间内存一级的高速数据交互。 部分实现如下: //创建文件内核对象.其句柄保存于m_hFiteSave HANDLE m_hFileSave=CreateFile(m_FileName(保存文 件),GENERIC—READ IGENERIC—WRITE,0,NULL, OPEN—ALWAYS,FILE—A ITRIBUTE—NORMAL,NUU ) // ̄:Z实际数据长度创建另外一个文件映射内核对象 m_hMapSave=CreateFileMapping(m_hFileSave,NULL, PAGE_READWRITE,0,((DWORD)qwFileOffset&0xfffffff) *sizeof(DW0RD));NULL); ,/关闭文件内核对象 CloseHandle(m hFileSave); //将文件数据映射到进程的地址空间 IMapAddressSave =(PDWORD) MapViewOfFile (m_hMapSave, FILE—MAP_AU ACCESS,0,0, qwFileOffset sizeof(DWO RD)); ,/将数据从原来的内存映射文件复制到此内存映射文件 Memcpy (1pbMapAddressSave,lpbMapAddress, qwFileOffset sizeof(DWORD)); //从进程的地址空间撤销文件数据映象 UnmapViewOfFile (1pbMapAddress);UnmapViewOfFile (1pbMapAddressSave); 和消息机制进行数据通信,MFC主进程负责创建终止VP仿 真进程。 MFC主进程 + VP进程 墨生. 墨鳌l l启动 接收数据并向内存映射 初始化VP系统 文件写入数据,并发送 数据更新消息 响应消息读取内存映射 文件中的数据,写入仿真 响应消息,读取内存l 改据并发送数据更新消息 映射文件中的数据J t < 翕 是 结束 结束 图2 MFC与VP进程间通信流程图 Fig.2 Communication flow chart between MFC and VP processes 5结 论 文中介绍了虚拟场景中漫游驱动的实现,在基于MFC 的Vega Prime框架的设计.具体分析了多场景切换中遇到的 问题。从面向对象的角度,提出了较为全面和稳定的解决方 法。此方法可以满足多场景的数据共享和快速通信,具有广 泛的通用性和实用性。 参考文献: 【l】张波,丁莹.基5-Vega Prime视景仿真系统的研g[Cl//g 六届全国仿真器学术会议。2007:261—265. [2】车忠志,孙雪雁.MFC应用程序基本框架分析[J].农业网络 信息,2010,29(9):154—147. CHE Zhong—zhi.SUN Xue-yan.,I’he analysis of MFC application framework[J].Agriculture Network Information, 2010,29(9):154-147. 【3】王娇艳,康凤举.MFC框架下多通道视景仿真技术[J].火力 与指挥控制,2010,35(7):130—132. WANG Jiao・yan,KANG Feng-ju.Research on multi-channel based on Vega Prime under MFC framework[J].Fire Control &Command Control,2010,35(7):130—132. (下转第37页) -33- 崔得龙,等基于改进SIFT的图像拼接算法 IEEE Trans on Signal Processing,2003,51(1):230-243. 方向进行照度曲线拟合,可得到现场照度中心方向的坐标。 然后再用同样的方法对y方向的照度也进行拟合,这样 就得到了现场的照度中心坐标(粕, ),图像的二维灰度校正 函数就可以表示为 c=————_== :::一 cos4(sx/(x-x0)2+(y-y0) ) (11) [5]CHEN Fu ̄ing,WANG Run ̄heng.Fast RANSAC with preview model parameters evahlation[J].Journal of Software,2006,1 6 (8):1431—1437. [6]Kasar T,Ramakrishnaa A G.Block—based feature detection and matching for mosaicing of camera—captured document 利用式(11)生成与原图尺寸相同的灰度校正曲线,并将 该曲线与原图相乘即可对原图进行灰度校正。 images[C]fProc of IEEE Region 10 Conference,Symposium on Applications of Holography in Mechanics,New York: ASME.2007:1-4. 4结 论 本文针对目前基于SI胛的图像拼接算法复杂度较高和 特征点匹配不准等问题,提出了一种基于改进SIFT的图像拼 接算法。算法在SIT特征提取过程中简化了SIFFT特征描述 符,降低了算法的复杂度。同时在特征匹配过程中采用模拟退 火算法进行特征点匹配,降低了匹配误差。实验结果表明.本 文算法在降低SIFT特征提取的同时,取得了良好的图像拼接 效果。今后的工作将从进一步深入探讨SIT特征点的稳定性 F以及特征点匹配精度,进一步提高算法整体性能等方面展开。 参考文献: [1】Kybic J.High-dimensional mutual information estimation for 【7】邹北骥,阮鹏,向遥.一种精确匹配的全景图自动拼接算 法[J].计算机工程与科学,2010,32(8):60—63. ZOU Bei-ji,RUAN Peng,XIANG Yao.An automatic panoramic images mosaic algorithm with precise matching]J]. Computer Engineering&Science,201 0,32(8):60-63. 【8]FANG Xian-yong,ZHANG Ming—min,PAN Zhi—geng,et a1.A new method of manifold mosaic for large displacement images[J].Journal of Computer Science and Technology, 2006,21(2):218—223. 【9】Lowe D.Distinctive image features from scale invariant keypoints[J1.International Journal of Computer Vision,2004, 60(2):91—11O. image registration using control point and intensity]J].IEEE Transaction on Image,2004,13(8):1115—1127. [10]兰世爽,孙劲光.基于改进SIFT的抗几何攻击的数字水 印【J1.计算机工程与应用,2011,49(7):200—203. IAN Shi—shuang.SUN Jin-guang.Geometircal attack digital 【21 Zitova B,Flusser J.Image registration methods:a survey[J]. Image and vision computing,2003,21(11):977—1000. 【3】田伟刚,郭雷,黄雷.一种应用于图像配准中的点特征匹 配算法[J】.微电子学与计算机,2008,25(3):172—174. TIAN Wei—gang,GUO Lei,HUANG Lei.An algorithm for point pattern matching applied to the registration of images watermarking based on improved SIFvIm Computer Engineering and Applications,2011,49(7):200—203. 【¨】金聪,叶俊民,许凯华,等.具有抗几何攻击能力的盲数字 图像水印算法[J].计算机学报,2007,30(3):474—482. JIN Cong,YE Jun-Min,XU Kai-hua.Blind image watermarking with relatively great afifne geometirc distortion]J]. Microelectronics&Computer,2008,25(3):172—174. algorithm resist to geometrical attacks]J].Chinese Journal of Computers,2007,30(3):474—482. [4】CHEN Jiun-hung,CHEN Chu—song,Chen Yong—sheng.Fast algorithm for robust template matching with M—estimators[J]. (上接第33页) 『4]刘淑霞,范雄飞,孟艳.基于MFC的Vega Prime ̄序框架研 究[C 系统仿真技术及其应用学术会议论文集,2009: 418-421. 计算机仿真,2007,24(12):193—196. SUN Ke—feng,LI Jie.Vfious seense renging system flame based on Vega prime『J].Computer simulation,2007,24(1 2): 193-196. 【51胡梓楠,于劲松.基于MFC框架的Vega Prime ̄#.件集成技 术的研究『J1.系统仿真学报,2007,21(14):4291—4295. HU Zi-nan.YU Jin-song.The research on the framework of 【7】李军,王邵棣,常建刚,等.基q-Vega视景驱动软件的分 析与设计[J].系统仿真学报,2003,15(3):397—401. LI Jun,WANG Shao・di,CHANG Jian-gang,et a1.Aalysis vegaprime software integration technology based on MFC[J]. Journal OfSystem Simulation,2007,21(14):4291—4295. and design of renging software based on Vega]J].Journal of System Smulation,2003,15(3):397—401. [6】孙科峰,李洁.基-I-Vega Prime多场景仿真系统框架[J]. -37- 

因篇幅问题不能全部显示,请点此查看更多更全内容