

【摘 要】文中針對目前主要由于汽車結構復雜,平面圖形難以顯示、學生學習比較困難等問題,提出了汽車三維仿真模型交互顯示及模擬拆裝系統以提高學生的學習效果,并對系統結構、關鍵技術、系統集成等核心問題進行了研究。
【關鍵詞】汽車三維仿真模型 交互式 顯示 Cult3D OpenGL
【中圖分類號】TP391 【文獻標識碼】A 【文章編號】1674-4810(2013)35-0050-02
一 開發汽車結構與操作綜合演示系統的意義
通過汽車結構的教學和各個結構模型的開發和演示,可清楚地了解汽車內在部位的結構和作用,使學生更快地掌握各種軍用汽車的專業知識。通過三維結構模型的交互演示、動畫演示和模擬拆裝等多種形式對軍用汽車各結構進行模擬顯示、拆解、裝配、調整和故障診斷,從而可以使受訓人員快速掌握各種軍用汽車的基本結構、各結構的調整和維護保養方法,以及各結構在調整保養中應注意的實際問題,從而提高受訓人員的基本操作能力,最終提高我軍汽車運輸車隊的運輸效能。
二 汽車三維仿真模型交互顯示及模擬拆裝系統的設計方法
采用軟件編程和動畫制作、圖像處理等相結合的方法進行系統開發。本系統在系統開發過程中主要使用的應用軟件有:VC++編程軟件、director多媒體制作軟件、圖形處理與制作軟件PhotoShop、三維模型制作軟件3DSMAX等。每個汽車系列主要內容包括:汽車基本結構三維模型交互顯示、基本總成拆裝仿真、基本原理演示講解、常見故障原因分析及故障診斷、基本參數查詢等五個模塊。在每一個模塊中均采用模型設計、圖片顯示、動畫演示等形式進行綜合演示。比如,對于汽車的某個基本結構,可進行基本結構立體模型的建立,然后采用圖片的整體演示和局部演示,模型基本結構組成演示,模型基本結構組成演示又可通過動畫形式進行分解、拆裝等演示(可分步進行演示),達到圖文并茂、條理清晰,從而使受訓人員一目了然,更易接受。
在進行汽車三維仿真模型交互顯示及模擬拆裝系統的設計時,其設計思路為:(1)首先用Pro/E建立汽車各種結構的三維模型,并導出為STL格式的模型;(2)把STL格式的模型導入到3DSMAX進行貼圖、渲染和動畫制作,并導出為C3D格式的三維模型;(3)把C3D格式的三維模型導入到Cult3D進行交互處理;(4)在VC++中實現對3DSMAX構造OpenGL模型的控制;(5)用VC++、OpenGL等軟件開發出三維模型文件嵌入控件,用于三維模型在多媒體顯示軟件的嵌入式和交互式顯示。
三 汽車三維仿真模型交互顯示及模擬拆裝系統的關鍵技術研究
1.三維模型的交互式處理
所有的建模都有不同的應用領域軟件,而虛擬模型要解決兩個關鍵問題,即模型轉換和幾何模型的建立。在汽車零部件三維模型的建立方面,專業三維造型軟件3DSMAX或Pro/E以它強大的建模和材質貼圖渲染功能占據著得天獨厚的優勢。在汽車結構建模設計中,首先用Pro/E建立汽車各種結構的三維模型,并導出為STL格式的模型并保存;然后將STL格式的三維模型導入到3DSMAX進行貼圖、渲染和動畫制作,并導出為C3D格式的三維模型;然后將渲染好的C3D格式的三維模型導入到Cult3D中。導入之前,需要安裝插件Cuh3D Exporter for 3DSMAX,此輸出插件支持從主流動畫制作媒體中將模型文件導出為Cult3D中間文件格式。這樣,3DMAX就能將3D模型輸出成Cult3D Design的C3D格式。將三維軟件中輸出的C3D格式文件置入到專業的3DVR軟件中進行場景設置、交互編輯以及在需要說明的地方加入文字介紹等,這樣就可輸出具有交互功能的三維模型了。
在交互性能的實現上,Cult3D采用基于Java的內核,不但可以直接在Cult3D Designer中完成基本的交互動態展示,還可以通過Cult3D API開發程序,利用JavaScript進行編譯,并將它應用于Cuh3D對象,使用戶可以利用熟悉的多媒體用戶界面,例如按鈕和下拉列表框控制Cult3D對象的外觀和行為。使用戶通過鼠標拖拽對象,從不同角度真實地了解到汽車三維模型的外形、結構和功能,甚至更換汽車三維模型的顏色、紋理,甚至將其組合或拆分,大大豐富了三維瀏覽時的交互效果。具體流程見圖1。
2.在VC++中實現對3DSMAX構造OpenGL模型的控制
3D設計的最復雜而最費時的工作是構造3D模型。OpenGL沒有提供高級命令函數來定義復雜的三維形體,只提供了基本的點、線和多邊形方式構造3D模型。如何利用一些優秀的商用建模軟件。例如,3DSMAX、AutoCAD等來構造3D模型,在OpenGL中加以采用并進行實時控制一直是困擾程序員的難題。下面就相關問題的解決方法加以說明。
第一,用3DSMAX修改、渲染模型并轉換文件。在3DSMAX中修改、渲染模型以后,保存文件名后綴為.max的文件,然后用3D Exploration進行轉換,可以選擇Simple App、Data Only和Display List 三個選項之一:Simple App生成一個OpenGL的簡單應用;Data Only只生成OpenGL像素數據;Display List生成OpenGL的顯示列表;選擇一個選項即可。為了不同的應用,可以生成包括一個實體的法向量、材質、紋理等多種應用,將文件名后綴為.max的文件保存為cpp OpenGL Code形式,即可以在VC++引入這一文件。
第二,在VC++中控制三維模型。下面簡單介紹VC++的MFC編程中運用OpenGL三維圖形庫編寫實時動畫應注意的幾個問題:(1)在主視的文件中應包含OpenGL的頭文件,即GL/gl.h,GL/glu.h和GL/glaux.h;(2)使用Windows的設備上下文句柄,也需要申請OpenGL的著色設備上下文句柄,同時保證正確釋放著色設備上下文句柄;(3)OpenGL函數只存在指定窗口類型為cs.style=WS_CLIPSIBLINGS |WS_CLIPCHILDREN時才有效;(4)注冊并實現OpenGL的設備上下文句柄,并保證與Windows的窗口句柄的正確連接;(5)在用OpenGL繪圖時,必須指定像素格式;(6)由于要保證窗口尺寸變化時圖形應做到不變形。因此,應實現新的窗口縱橫比和視口尺寸。這里只是對編程中的幾個要點作說明,讀者可以根據自己的具體需要實現繪圖。
為了優化系統性能,一般應采用調用顯示清單的方法調用這些數據。一個顯示清單就是一組先被存儲再被運行的OpenGL命令,當一個顯示清單被觸發時,它內部的命令以它們被發布的順序被執行,這有別于OpenGL的立即模式。即立即執行命令的方式。OpenGL的顯示清單實際上就是命令的一個高速緩沖存儲器,而不是一個動態數據庫,即一個顯示清單一旦被創建了,它就不能被修改。無論是在運行OpenGL程序的本地機上,還是在運行OpenGL程序的服務器上,合理地使用顯示清單都可以改善系統性能。
運用OpenGL的顯示清單主要包括以下幾個步驟:(1)創建顯示清單用glNewList( )和glEndList( )語句對,在兩句中間包含顯示清單的內容;(2)控制顯示清單和它們的索引,當然可以用任意一個正整數作為顯示清單的索引,但這易引起混淆,因此用glGenLists( )函數自動產生一個未創建的索引;(3)調用顯示清單用glcallList( )即可;(4)有時有多個顯示清單索引,如果要使顯示清單索引可以再被使用,應用glDeleteLists( )函數刪除顯示清單。
3.用VC++及OpenGL開發出三維模型文件嵌入控件
在VC++下用ATL做一個OpenGL的三維模型文件嵌入(CO)控件,其步驟如下:
第一,新建一個ATL空項目(項目名OpenGL_ATL)。
第二,添加一個ATL對象(MyControl)(VC6下為Full Control,VC7下為ATL控件)。
第三,在對象的.H頭文件中添加: #include
第四,在接口實現類添加一個OpenGL的RC(rendering context)成員變量:HGLRC m_hRC。
第五,添加一個設置OpenGL像素格式(接口實現類的)成員函數。
第六,添加一個Windows消息WM_CREATE:
LRESULT CMyControl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL /*bHandled*/);{
HDC hdc = GetDC( ); RECT rc;GetClientRect(rc);
CreateContext(hdc, rc);//初始化
return 0;}
第七,添加一個Windows消息WM_DESTROY LRE SULT CMyControl::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL /*bHandled*/)
{ wglMakeCurrent(NULL, NULL);
if (m_hRC) { wglDeleteContext(m_hRC);m_hRC = NULL;} return 0;}
第八,添加一個事件OnRender,點擊ClassView中的IMyControlEvents添加方法OnRender參數int right,int left,int bottom,int top,然后編譯idl文件,點擊CMyControl實現連接點選中IMyControlEvents。
第九,在OnDraw添加代碼:
HRESULT OnDraw(ATL_DRAWINFO di)
{ HDC hdc = di.hdcDraw; RECT rc = *(RECT*) di.prcBounds; wglMakeCurrent(hdc, m_hRC); glClearColor (1.0f, 0.0f, 0.0f, 10.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//激發OnRender事件
FireOnRender(rc.right , rc.left, rc.bottom , rc.top);
OnRender(rc.right,rc.left,rc.bottom,rc.top) ; glFinish( ); SwapBuffers(wglGetCurrentDC( )); return S_OK;}
第十,編譯。要使用本控件,首先注冊,然后拖到要顯示的窗體上,并在OnRender事件中寫入要顯示的物體。
四 應用舉例
拆卸步驟:(1)拆下變速器上蓋總成;(2)拆下一軸總成;(3)用拉器拉出二軸后軸承;(4)取出二軸總成。
裝復:與分解順序相反,點擊零部件進行裝復。
圖2 三維模型的交互式拆裝訓練界面
圖2應用本文闡述的方法開發的汽車三維仿真模型交互顯示及模擬拆裝系統界面,該系統通過網絡環境下的ASP動態網頁技術與Cult3D網絡三維瀏覽技術以及網絡數據庫技術實現了汽車結構三維模型在線展示,也可以在Director、PowerPoint、VC++等軟件中進行汽車結構三維模型動態交互展示,即可以對三維模型進行旋轉、縮小、拆分和裝復等。
五 結束語
本文討論了基于多媒體的汽車三維仿真模型交互顯示及模擬拆裝系統開發過程中的若干關鍵技術和系統的主要構架,提出了三維可視化和交互式瀏覽的顯示設計方法,即使用Pro/E、3DSMAX和Cult3D建立產品模型,通過Cult3D Java API和VC++實現場景交互,從而實現對三維模型進行旋轉、縮小、拆分和裝復等。
參考文獻
[1]阿新工作室.任我虛擬Cult3D/3ds max 4.2/Maya 4三維產品設計與互動教程[M].北京:北京希望電子出版社,2002
[2]侯俊杰.深入淺出MFC[M].武漢:華中科技大學出版社,2001
[3]《電腦編程技巧與維護》雜志社.Visual C/C++系統開發典型實例解析[M].北京:中國水利水電出版社,2007
〔責任編輯:龐遠燕〕