基于OpenGL的飛機模型運動3D實時仿真顯示_第1頁
基于OpenGL的飛機模型運動3D實時仿真顯示_第2頁
基于OpenGL的飛機模型運動3D實時仿真顯示_第3頁
基于OpenGL的飛機模型運動3D實時仿真顯示_第4頁
基于OpenGL的飛機模型運動3D實時仿真顯示_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、本科畢業論文(科研訓練、畢業設計)題 目:基于OpenGL的飛機模型運動 3D實時仿真顯示姓 名:李培鋒學 院:物理與機電工程學院系:航空系專 業:航空機械年 級:2009級學 號:3#0指導教師(校內):# 職稱:教授指導教師(校外): 職稱: 2013年 5 月 15 日基于OpenGL的飛機模型運動3D實時仿真顯示摘要 近年來,隨著計算機動畫技術的高速發展,基于計算機動畫技術的實時仿真技術在航天航空、機械設計、游戲開發、地理信息、氣象模擬、虛擬現實等領域的應用越來越廣泛。本文以計算機圖形學,圖像處理技術為基礎,運用OpenGL這一軟件接口,以Visual C+6.0為集成開發環境,在Wi

2、ndows系統中建立飛機模型運動3D仿真應用程序。通過獲取傳感器采集的飛機模型的姿態數據,對繩牽引機器人控制的飛機模型在試驗中的運動進行實時仿真顯示。文中詳細介紹了OpenGL構建模型和實現動畫仿真顯示的原理和過程,以及在編程過程中使用到的雙緩沖,Win32多線程和3DS格式模型導入等關鍵技術。關鍵詞 實時仿真 OpenGL 三維運動 3DS格式模型導入 ABSTRACT In recent years, with the rapid development of the computer animation technology, real-time simulation technolog

3、y, which is based on the computer animation technology, is being used in many fields such as aerospace, mechanical design, game development, geographic information, weather simulation, virtual reality and so on more and more wildly.This paper is mainly based on computer graphics and image processing

4、 technology, using a high performance graphics application programming interface (API): OpenGL and Visual C+ 6.0 as integrated development environment to build model airplane and the external frame in Windows system.The aircraft model entity data is acquired by sensor acquisition to achieve the purp

5、ose that simulates the three-dimensional motion attitude changes of the aircraft model controlled by traction rope robot in time. This paper introduces the principles and processes of OpenGL to build model and achieve animation , as well as the key technologies used in the programming process such a

6、s double buffering, Win32 multi-threading , 3DS format models import and so on.Key Word Real-time simulation OpenGL three-dimensional motion 3DS format models import目錄第一章緒論11.1 本文研究的背景意義11.2 本文的主要工作21.3 本文的主要內容2第二章 OpenGL簡介及其實現繪圖的原理和過程22.1 OpenGL簡介32.1.1 OpenGL功能32.1.2 OpenGL圖形顯示方式42.2 OpenGL繪圖前期準備4

7、第三章 實時仿真顯示的關鍵技術和關鍵環節63.1 VC簡介63.2 多線程技術63.3 本文涉及的坐標系73.3 3DS格式模型文件的生成73.4 3DS模型文件導入OpenGL9第四章 飛機模型運動3D實時仿真顯示的實現114.1 3D實時仿真顯示應用程序的總體設計114.2 創建窗口124.3 程序初始化134.4 模型場景構建及運動仿真144.4.1 飛機模型運動實時數據的獲得和顯示144.4.2 飛機模型的繪制15第五章 成果展示和功能分析17第六章 總結19參考文獻20致謝語21第一章 緒論1.1 本文研究的背景意義本文研究目的是完善現有的繩牽引并聯支撐系統(WDPSS)1主控制界面

8、(簡稱主控制界面)。在分析現有的WPDSS原理樣機和主控制界面后,發現實驗者在實驗過程中不便于直接觀察飛機模型的運動情況,而現有的主控制界面沒有實時顯示飛機模型姿態方面的功能。這不利于實驗者在實驗過程中直觀地掌握飛機模型的運動情況并根據實時仿真顯示結果對飛機模型的運動姿態進行相應的調整。本文就是針對這一不足,制定合理的方案去解決問題。近年來,隨著計算機動畫技術的高速發展,利用計算機動畫技術實現仿真顯示在國內外各個領域都日益成為最熱門的研究課題之一。現已有多家公司各自開發出了相應的仿真軟件。現在主流的仿真軟件主要有由美國MultiGen-Paradigm公司開發的能用于虛擬現實、實時視景仿真、聲

9、音仿真以及其他可視化領域的軟件工具Vega2,由Quantum公司開發的軟件工具VTree3和由美國MultiGen-Paradigm公司開發的Multigen Creator系列軟件等。雖然上述軟件工具都被廣泛的使用,但是各有側重的領域。Vega提供了穩定、兼容、易用的界面使開發、支持和維護工作更快和高效。Vega能有效地減少在圖形編程上花費的時間,在對復雜系統進行仿真的時候有明顯的優勢。Multigen Creator擁有針對實時應用優化的OpenFlight數據格式和多種專業選項及插件,能高效、最優化地生成實時三維(RT3D)數據庫,能與后續的實時仿真軟件緊密結合。Multigen Cr

10、eator在大型的視景仿真和娛樂游戲環境的創建時較為適合。VTree則適合于開發高幀速率三維圖像應用。OpenGL(全寫Open Graphics Library)是由SGI公司于1992年7月發布的,并且在此之后一直保持對軟件相對高頻率的更新升級,這使得OpenGL的功能越來越強大,現已成為主流的專業三維圖形程序接口。 OpenGL可以和各種編程語言緊密結合,以它為基礎的開發應用程序方便在各個平臺間的移植,而且它為實現交互式視景仿真和虛擬現實提供了高效率的庫函數,因此功能強大4。對比上述軟件工具, OpenGL在本文研究的課題中有以下幾點優勢:首先OpenGL的使用相對簡單;其次,由于Ope

11、nGL發展較為成熟,其各類輔助學習和編程的資料較為完整且容易獲取;最重要的是OpenGL能容易地在Visual C+ 6.0(簡稱VC+6.0,是Visual Studio的一個開發工具庫)環境下和主控制界面程序編寫在一起。因此,本文選擇使用OpenGL編寫實時仿真顯示子界面(簡稱子界面),完善現有的主控制界面。通過使用子界面,實驗者能在實驗中直觀的了解飛機模型運動情況并據此對飛機模型的運動進行調整。1.2 本文的主要工作本文研究目的是通過使用OpenGL實現飛機運動3D實時仿真顯示。具體而言就是以計算機圖形學和圖像處理技術為理論基礎,在Win32基礎上運用OpenGL,以VC+6.0為集成開

12、發環境,對實驗過程中飛機模型的運動情況進行實時仿真顯示。為了達到這個目的,本文完成工作主要包含以下幾方面:1. 學習和了解OpenGL和其他必要軟件。研究坐標變換、雙緩沖和多線程等關鍵技術。2. 使用OpenGL搭建飛機模型場景,研究如何設計應用程序實現飛機模型運動實時仿真。創建一個OpenGL窗口,顯示飛機模型的運動仿真。3. 使用多線程技術將設計好的子界面鏈接到主控制界面中。1.3 本文的主要內容本文詳細介紹了研究課題的實現過程和設計方法,具體的章節安排如下。第一章為緒論部分,主要簡述了本文研究課題的背景意義、主要工作和主要內容。第二章中對OpenGL的特點和功能進行了簡要的介紹。分析了在

13、本文研究課題中使用到OpenGL的主要技術環節,并且說明了上述技術在本文中的使用。第三章首先對OpenGL的VC開發環境進行介紹,并通過使用多線程技術,實現主控制界面和子界面的鏈接,最后研究如何使用3DMAX生成3DS模型文件和3DS模型文件導入OpenGL。第四章編寫了基于OpenGL的飛機模型運動3D實時仿真顯示的應用程序(簡稱應用程序)。通過分析總體結構和介紹具體模塊的流程及重要代碼,闡述了應用程序的開發過程。第五章對應用程序編寫的成果和功能進行基本的介紹。第六章是對本次畢業設計的總結和分析。介紹應用程序設計的不足和設計過程中的得失。第二章 OpenGL簡介及其實現繪圖的原理和過程本章首

14、先對OpenGL的概念、特點、基本功能進行分析,在此基礎上著重研究了OpenGL圖形顯示和OpenGL繪圖的前期準備兩個方面。通過對OpenGL的初步研究為接下來應用程序的編寫做準備。2.1 OpenGL簡介OpenGL是一圖形硬件的一種軟件接口5,被廣泛應用于游戲開發、地理信息、氣象模擬、虛擬現實等領域。OpenGL是高性能圖形和交互場景處理的行業標準,它是一個函數庫而不是一種編程語言。開發人員可以使用它提供的功能自由選擇操作系統,在合適的開發平臺上編寫出功能強大的三維圖形應用程序。OpenGL是一個開發的標準,雖然由SGI公司首創,但是它的標準是由OpenGL體系結構審核委員會(ARB)掌

15、管。ARB由IBM、Intel、Microsoft、ATI等著名公司創立,每隔四年舉行一次會議,對OpenGL規范進行維護、改善和升級,使OpenGL能一直保持與時代同步。OpenGL的主要特點是具有高度的可移植性,豐富的函數庫,簡單易記的函數功能及命名,高性能的圖形渲染和與C語言能緊密結合能力。優秀的性能使得OpenGL成為當下主流的計算機仿真軟件工具。2.1.1 OpenGL功能總的來說OpenGL是一個功能非常強大的專業三維圖形程序接口,主要具有以下八大功能:1. 建模:OpenGL圖形庫除了提供點、線、多邊形等基本圖元的繪制函數外,還提供了復雜的三維物體(球、錐、多面體、茶壺等)以及復

16、雜曲線和曲面繪制函數。2. 矩陣變換:復雜的圖形都是由基本圖元組成并經過一系列的變換實現的,而OpenGL的變換都是通過乘以對應的矩陣來實現的。OpenGL提供了兩種變換方式:基本變換和投影變換。其中基本變換包含了平移、縮放、旋轉和鏡像四種,投影變換包含了平行投影(正射投影)和透視投影兩種。3. 顏色模式設置:OpenGL提供了RGBA模式和顏色索引模式(Color Index)兩種顏色模式。RGBA模式為每個像素點指定顏色,而顏色索引模式則提供一個顏色表,各像素點通過索引顏色表得到顏色值。4. 光照和材質設置:OpenGL假設光由三原色(RGB)組成,物體對三原色分別有不同的反射率,通過物理

17、光學模型,計算物體實際顏色。5. 紋理映射:OpenGL提供了完善的紋理映射機制可以十分逼真地表達物體表面細節。6. 位圖顯示:OpenGL提供基本的拷貝和像素讀寫能力。7. 圖像增強:OpenGL提供融合、霧和反走樣這三種特殊圖像效果處理,使被仿真物體更具真實感,增加圖形顯示效果。8. 雙緩沖動畫:雙緩沖技術是OpenGL出色的動畫效果的重要保障。OpenGL繪圖前會先分配兩個顏色緩沖區,在繪圖時,一個緩沖區執行繪圖命令(后臺),另一個進行圖形顯示(前臺)。循環反復,保證屏幕(前臺)上總是顯示已經畫好的圖形,以此實現圖形顯示的連續變化,達到動畫效果,其中動畫交換幀函數為SwapBuffers

18、(g_hDC)。此外,利用OpenGL還能實現深度暗示、運動模糊等特殊效果,從而實現消隱算法6。在本文應用程序編寫過程中主要需要使用到建模、矩陣變換、顏色模式設置、光照和材質設置、位圖顯示及雙緩沖動畫等功能。2.1.2 OpenGL圖形顯示方式絕大多數OpenGL在實現圖像顯示時都有相似的操作順序,一系列相關的處理階段叫做OpenGL渲染管線7,如圖1所示。雖然沒有嚴格的規定OpenGL必須采用這樣的實現方式,但是圖1所示的順序是一個已經得到證明的可靠的操作順序,所以本次論文中選擇通過這一順序來實現圖形顯示。幾何頂點數據求值器圖像像素數據顯示列表圖像操作紋理裝配逐個頂點操作與圖元裝配光柵化幀緩

19、沖區片段操作圖1. OpenGL渲染管線2.2 OpenGL繪圖前期準備OpenGL繪圖的前期準備的第一步是選擇一個編譯環境。現在Windows系統的主流編譯環境有Visual Studio,Broland C+ Builder,Dev-C+等,這些編譯環境都是支持OpenGL的。在本文中,現有的主控制界面的編寫環境是VC+6.0,因此同樣選擇VC+6.0作為應用程序的開發環境。第二步是要安裝導入OpenGL工具包。幾乎對于所有的OpenGL應用程序,在使用之前都需要導入OpenGL頭文件和工具函數庫(GLU),本文中編寫程序的過程也不例外,另外Microsoft Windows要求在Open

20、GL頭文件之前包含windows.h頭文件。所以在本文的應用程序編程前先將OpenGL頭文件和GLU導入程序目錄下,然后在源代碼開頭編寫以下代碼:#include <windows.h>#include <includeopenglgl.h>#include <includeopenglglu.h>#include <includeopenglglaux.h>#include <includeopenglglut.h>#include <includeopenglglext.h>#include <includeop

21、englwglext.h>第三步是建立OpenGL應用程序的框架,也就是創建OpenGL窗口并對OpenGL進行初始化。這部分的具體內容在本文第四章中會有詳細介紹。第三章 實時仿真顯示的關鍵技術和關鍵環節在上一章對OpenGL進行研究的基礎上,本章主要介紹了在實現飛機運動實時仿真顯示過程中使用到的關鍵技術環節,為應用程序的編寫提供技術支持。本章首先介紹了本文應用程序的VC+6.0開發環境,然后分析使用多線程技術鏈接子界面和主控制界面的過程。由于在使用計算機動畫技術實現仿真的過程中涉及各種坐標系,在實際操作中易因為混淆而產生錯誤,所以本章詳細介紹了本文中用到的幾個坐標。在本章的最后,對3D

22、S模型文件的生成和導入OpenGL這兩個關鍵環節進行研究。通過對本章中內容的研究,為應用程序的開發奠定理論基礎。3.1 VC簡介Visual C+ 6.0是Microsoft公司推出的一種開發Windows應用程序的高級語言,具有強大的功能和較高的執行效率。它提供了程序設計領域中所涉及的多種技術,如文件訪問,圖形圖像處理,數據處理和多媒體等,VC的開發對象幾乎涵蓋所有領域。VC是一個基于Windows操作系統的可視化且面向對象的集成開發環境8,用戶可使用該環境開發有關C和C+的各種應用程序,包括了建立,編輯,瀏覽,保存,編譯,鏈接和測試等操作。其中應用程序的開發主要有兩種模式:Windows

23、API方式和MFC方式,兩種模式各具特色。3.2 多線程技術在一個程序中,獨立運行的程序片斷被叫作“線程”(Thread)9。多線程的基本概念是程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個并行執行的線程來完成各自的任務。其目的不是為了提高運行效率,而是為了通過提高資源使用效率來提高系統的效率。Win32多線程技術提供線程創建,線程掛起,恢復線程,線程退出、獲取當前線程ID和條件鎖等基本操作,用戶通過使用這些操作可以實現基本功能。在本文研究中,已經存在有主線程。本文為防止OpenGL應用程序的運行對主線程產生影響,把OpenGL應用

24、程序獨立編寫成一個線程,保證兩個界面窗口能正常的同時運行。本文創建線程的具體操作如下:1. 定義一個OpenGL線程的入口函數,代碼如下所示DWORD WINAPI ThreadFunc1(LPVOID n)OpenGL_Main();return 0; 在上述函數中,OpenGL_Main()是OpenGL應用程序的入口函數。使用線程創建函數創建子線程后,可以調用ThreadFunc1這個線程函數進入子線程。2. 創建線程:用函數CreateThread(NULL,0,ThreadFunc1,0,0,NULL)創建線程。該線程在點擊了主控制界面中特定的按鈕后開始創建。線程創建之后,OpenG

25、L窗口打開,開始繪制飛機模型。窗口打開的具體過程在第五章中會詳細介紹。3.3 本文涉及的坐標系本文需要涉及到坐標系的過程主要是在OpenGL窗口中模型的繪制以及模型平移旋轉。上述兩個過程涉及多個坐標系,在編寫時需要明確具體涉及哪坐標系并根據該坐標系的特點進行處理,這樣才能保證程序正確運行。本文涉及的四種OpenGL坐標系,包括世界坐標、模型坐標、設備坐標和視點坐標。接下來對這四種坐標系分別進行介紹。世界坐標是OpenGL中用來描述場景的坐標,Z軸正方向垂直屏幕向外,X軸正方向從左到右,Y軸正方向軸從下到上,是右手笛卡爾坐標系統。我們用這個坐標系來描述物體及光源的位置。模型坐標是以模型某一點為原

26、點而建立的“世界坐標”,僅對模型本身適用,用來方便對模型坐標的描述。模型在OpenGL中移動時,整體的相對位置是不變的,所以用模型自身的坐標來描述模型,和人的思維習慣一致。設備坐標是指將三維的世界坐標經過變換、投影等計算后最終算出的在顯示設備上對應的位置。視點坐標是以視點坐標為原點,以視線的方向為Z軸正方向的坐標系。3.3 3DS格式模型文件的生成目前使用OpenGL繪制模型的方法主要有兩種。第一種是使用OpenGL圖形庫提供的點、線、多邊形等基本圖元繪制函數或者相對復雜的三維物體以及復雜曲線和曲面的繪制函數,通過高級語言環境(主要是C語言)進行開發。此方法比較靈活,適用性強,在模型結構較為簡

27、單的時候有明顯的優勢,但要求開發者熟練掌握編程技術和OpenGL,當模型結構比較復雜的時候工作量極大,而且并容易出錯。另一種方法是使用專業的三維模型繪制軟件繪制生成OpenGL能夠讀取的模型文件,通過將模型文件導入OpenGL實現模型的繪制。此方法由于其在處理復雜模型結構時有明顯優勢,被廣泛地使用。圖2. 3DMAX中的飛機模型在本文的研究中,為保證OpenGL中的模型是飛機模型實體按比例縮小的結果,同時考慮到已有SolidWorks生成的飛機模型WRL格式文件,故而采用第二種方法對飛機模型進行繪制。OpenGL強大的功能使得自身支持DFX,3DS等多種模型文件的導入。由于3DS格式文件Int

28、el式的存儲方式很符合windows系統下編程習慣,不需要對文件進行進一步轉換,因此本文選擇使用3DS格式模型文件導入OpenGL。為此在應用程序編寫前首先需要使用3D MAX軟件將原有的飛機模型WRL格式文件轉化為3DS格式,并且對模型自身的三維坐標系進行調整設置。飛機模型自身坐標系調整后原點與飛機重心重合,機身長軸及短軸分別與X,Y軸重合。原點到機頭頂點方向為X軸正方向,從飛機正前方觀察向右為Y軸正方向,機身垂直向下為Z軸正方向。最后將生成的3DS模型文件命名為“feiji.3DS”,放在程序目錄下。飛機模型在3D MAX軟件中調整后的最終效果如圖2所示。3.4 3DS模型文件導入Open

29、GL3DS模型文件由許多的塊(Chunk)組成的,每個塊包含頭和主體。眾多塊之間是相互嵌套的,即塊是有分層的。通常一個塊會包含下級子塊作為自己的數據,因此在讀取3DS模型文件時,必須用遞歸的方式讀取塊。在3DS模型文件導入OpenGL過程中主編輯塊、材質塊、物體塊、紋理塊和顏色塊等對模型繪制起關鍵作用。3DS模型文件導入OpenGL的過程本質上就是合理讀取塊的過程,下面對幾個主要的塊進行介紹:1. 主編輯塊(0X3D3D)主編輯塊是主塊(0X4D4D)的一個子塊,其中包含了場景中使用的材質、配置和視口的定義方式、背景顏色等一系列相關信息。主編輯塊存儲了當前編輯場景的狀況和當前窗口的配置數據,是

30、3DS模型文件導入OpenGL過程的重點研究對象。2. 材質塊材質塊定義了3DS文件材質庫中的信息,包括材質名稱、顏色和紋理等。3. 物體塊物體塊包括了物體網格塊和物體材質塊。此處的物體材質塊和材質塊是不同的,物體材質塊定義的是當前物體所使用的材質信息而材質塊則定義了整個文件中所有用到的材質信息。在VC+6.0中讀取3DS模型文件首先需要定義若干結構體變量并分配內存空間用于保存對應塊的數據。讀取3DS模型文件的基本過程是先使用ReadChunk()函數分別讀出單個塊并為該模塊分配內存空間,完成后釋放當前模塊的內存空間并將當前模塊設置成前面模塊。循環使用上述方法將所有需要讀取的塊進行內存空間分配

31、后,將每個塊的數據分類導入對應的定義好的模塊結構體中。直到所有需要的塊讀取完畢后,將每個塊的相關數據生成顯示列表,3DS模型文件導入OpenGL過程結束。具體過程的流程圖如圖3所示。NY打開3DS文件讀取一個塊讀取一個塊ID分配內存空間儲存塊信息生成顯示列表清空這個塊的內存空間是否讀取所有塊清空內存空間結束開始圖3. 3DS模型文件導入OpenGL流程圖第四章 飛機模型運動3D實時仿真顯示的實現在前幾章研究的基礎上,本章將詳細研究飛機模型運動3D實時仿真顯示應用程序的開發過程。具體組成是首先對整個應用程序進行了總體設計,然后通過介紹各個子模塊的具體實現過程,對整個應用程序的編寫進行研究和說明。

32、4.1 3D實時仿真顯示應用程序的總體設計在對OpenGL、3DMAX等軟件進行研究之后,為了解決如何基于OpenGL實現飛機模型運動的實時仿真顯示這一課題,首先對整個應用程序進行了總體設計。在本次研究中,應用程序編寫的思路主要是模塊化設計。模塊化設計的含義就是對應用程序進行分析后將整個程序分成若干個子模塊,然后對子模塊分別進行設計,最后將子模塊有機結合在一起滿足應用程序功能上的需求。模塊化設計的采用有利于使應用程序的結構更加清晰、調試更加容易,從而提供程序的可靠性、可修改性、可讀性和可移植性。根據OpenGL繪圖的特點和程序整體功能的要求,應用程序主要分為創建窗口,程序初始化和模型場景構建及

33、運動仿真三個模塊。對三個模塊分別進行設計編輯之后,完成的應用程序的流程圖如圖4所示。本章接下來將對三個模塊程序編寫的具體流程和關鍵的程序代碼進行分析,研究整個應用程序的實現過程。YNY窗口創建開始初始化OpenGL是否是3ds文件寫入模型文件讀入模型文件模型信息分配模型信息內存空間生成模型信息顯示列表顯示姿態數據導入姿態數據設置視點和光照處理姿態數據遍歷顯示列表繪制飛機模型OpenGL線程是否結束清空模型信息顯示列表釋放模型信息內存空間結束圖4. 3D實時仿真顯示程序的總體設計4.2 創建窗口實時仿真顯示功能的實現首先需要建立一個OpenGL窗口。在本文應用程序中通過自行定義的HWND Cre

34、ateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, HINSTANCE hInstance)函數來創建顯示窗口的。窗口創建程序的流程如圖5所示。最后生成一個初始大小為800×600,名字為“飛機動態飛行模擬”的窗口。窗口創建函數將HWND gl_hWnd設置為窗口句柄。用WNDCLASS wndclass這個窗口類結構來保存窗口信息,在窗口信息中包含了WndProc函數,用來處理Windows消息及鍵盤響應。然后通過RegisterClass(&wndclass)函數注冊窗口。在設置完窗

35、口的屬性和大小以后,用CreateWindow()函數完成窗口的創建。最后用ShowWindow()函數設置窗口的顯示狀態后,返回窗口句柄。WndProc函數用于處理窗口消息,主要添加的消息主要是兩個部分:第一個部分是用于控制窗口的形狀變化,響應窗口右上角的最小化和最大化功能,并且使窗口能夠通過拉伸來調整大小。第二個部分是用于關閉窗口的,響應窗口右上角的關閉功能。實際上在本文中關閉窗口并沒有將OpenGL線程停止,而是調用ShowWindow(gl_hWnd,SW_HIDE)將窗口隱藏起來。設置窗口句柄設置并保存窗口信息響應Windows消息拓展窗口風格設置窗口顯示狀態返回窗口句柄圖5. 創建

36、窗口流程圖4.3 程序初始化程序初始化部分承接了創建窗口,并為模型場景構建及運動仿真做準備,是應用程序重要的組成部分。本文中用void Init(HWND gl_hWnd)此函數實現程序初始化,其流程如圖6所示。獲取窗口坐標用GetClientRect(g_hWnd, &g_rRect)函數實現。初始化OpenGL就是對整個OpenGL繪圖環境進行設置,總共可分為三步。第一步是重新設置窗口的像素格式,并聲明一個PIXELFORMATDESCRIPTOR的結構體變量用來保存相關信息。第二步是為OpenGL建立一個圖形操作描述表RC。具體步驟是先用wglCreateCurrent(g_hD

37、C)函數建立圖形操作描述表。該函數的作用是以設備描述句柄g_hRC為參數,返回與設備描述表相關的圖形操作描述表句柄g_hDC。再以g_hRC和g_hDC兩個句柄為參數調用wglMakeCurrent(g_hDC, g_hRC)函數,使建立的圖形操作描述表成為線程當前使用的圖形操作描述表。第三步是對投影變化進行初始化。3DS文件導入OpenGL的技術和原理在本文第三章中已經做過具體的分析在這里就不加以贅述。根據上述原理,在C語言程序中編寫3DS模型文件導入函數g_Load3ds.Import3DS (&g_3DModel, FILE_NAME)。程序初始化中導入3DS文件的具體過程是首先

38、在程序開頭將飛機3DS模型文件名"feiji.3DS"定義到FILE_NAME中,然后在Init(HWND gl_hWnd)函數中調用導入函數,把3DS文件裝入模型結構體中。獲取窗口客戶區坐標設置像素格式建立圖形操作描述表RC初始化投影變換導入3DS模型文件圖6. 程序初始化流程圖4.4 模型場景構建及運動仿真4.4.1 飛機模型運動實時數據的獲得和顯示本文的應用程序的編寫是應用于WDPSS系統控制的飛機模型試驗中的,該試驗系統樣機安裝有用于采集飛機模型試驗位姿系統關鍵數據的傳感器。在實驗過程中通過傳感器采集數據,進行處理后得到飛機模型運動的六個姿態數據(俯仰,滾轉,偏航的

39、角度以及X,Y,Z軸上的位移)。由于數據的采集和處理在原有主程序中已有完整的函數,故而在本文研究的應用程序中只需要直接調用數據即可。由于數據采集和處理部分不是本文研究的重點,所以在此不加以展開。本文研究的課題是“基于OpenGL的飛機模型運動3D實時仿真顯示”,接下來對實時性進行分析。在仿真顯示的實現過程中,有幾個過程會產生時間上的滯后,分別是數據采集過程,數據處理過程和OpenGL窗口中飛機模型繪制過程。所以本文中所指的實時并不是完全意義上的和飛機模型實體的運動同步。但是分別分析幾個過程,其中OpenGL繪圖采用雙緩沖技術,刷新頻率和屏幕的刷新頻率一致,故而滯后時間一般是在0.01s數量級的

40、。書籍處理過程只有幾個計算函數和數據傳遞,滯后的時間很短。而數據的采集的滯后時間也是小于0.01s數量級的。又由于本實驗創建基于OpenGL的飛機模型運動3D實時仿真顯示窗口的目的只要是觀察飛機模型運動的情況,對于實時性這一指標在時間的精確性上要求并不是非常高。故而上述三個過程產生的總的滯后時間用肉眼很難分辨,故而其對實時性的影響在本文研究過程中可以忽略,即能夠本文編寫的OpenGL應用程序能達到本文研究課題對于實時性的要求。OpenGL應用程序從主程序中獲得到六個姿態數據以后,使用Win API函數TextOut()將姿態數據顯示在OpenGL窗口的左上角。使實驗者可以在觀察飛機模型運動動畫

41、的同時,觀察到實時的姿態數據的具體值。具體實時姿態數據顯示函數中顯示俯仰角度數據的代碼如下:char str0100;sprintf(str0, "%-08.3lf", wc.pitch);char str_pitch = "俯仰角度:"strcat(str_pitch, str0);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,5,str_pitch,strlen(str_pitch);SetTextColor(g_hDC,RGB(0,200,0);4.4.2 飛機模型的繪制在繪制飛機模型前,首先需要調用glClear(

42、)函數對OpenGL進行顏色清除以及深度緩沖。然后用glLoadIdentity()函數設置單位矩陣,具體作用就是將飛機模型自身坐標系和世界坐標系重合。最后使用gluLookAt()函數設置觀察視角。在設置好這些參數后,就具備了繪制飛機模型的基本條件。具體飛機模型場景的繪制有兩個部分。第一部分是使用OpenGL圖形庫提供線繪制函數glBegin(GL_LINE_LOOP)繪制一個0.82×0.78×1.04的長方體框架(尺寸具體參考已有的WDPSS控制的風洞試驗原理樣機的設計尺寸1)。具體的思路就是先計算出長方體的八個頂點的坐標,然后根據點繪制線,最后通過分別繪制長方體框架

43、的六個面來完成框架的繪制。第二部分是繪制已經導入的3DS模型文件中的飛機模型。繪制的具體方法是遍歷飛機模型中所有的對象生成的顯示列表(具體生成過程在第三章中有詳細介紹),將3DS模型文件導入過程中生成的顯示列表里的信息全部顯示出來。在主控制界面調整飛機姿態數據后,數據傳遞到OpenGL線程后。需要使用位移變化和旋轉函數調整飛機模型的位置。由于位移變化和旋轉是以世界坐標為基準的,所以在調用位移和旋轉函數后需要配對調用glPushMatrix()和glPopMatrix()函數。這兩個函數配對調用在本文應用程序中實現的作用是保證下一次調用位移和旋轉函數時飛機模型自身坐標系和世界坐標系重合。具體的程

44、序代碼如下: glTranslatef(g_x,g_y,g_z);glRotatef(g_Rotatex,1.0f, 0, 0); /繞指定軸旋轉 glRotatef(g_Rotatey, 0, 1.0f, 0); /pitch的角度 glRotatef(g_Rotatez, 0, 0,1.0f); /yaw的角度glPushMatrix(); /將當前變換矩陣(單位陣)壓入堆棧glPopMatrix();在本文程序編寫時為了降低OpenGL使用時的CPU使用率,通過在交換緩沖區前調用Sleep(5)函數,使交換緩沖區過程停滯5毫秒。能夠在不影響視覺效果的情況下降低刷新頻率,從而減低CPU使用

45、率。本文中應用程序為避免與主控制界面程序中的定時器發生沖突,在模型場景構建及運動仿真部分并未單獨設置一個定時器,而是只是使用一個While(1)循環一直循環刷新該部分。具體來說,飛機模型運動數據的獲取的頻率可以理解為和主控制界面中相關部分的定時器設置的刷新頻率相同。而數據的顯示、場景的繪制和飛機模型的運動的刷新頻率在默認設置的情況下根據OpenGL雙緩沖技術的原理和Win32 API的原理和程序運行設備的屏幕的刷新頻率相同。第五章 成果展示和功能分析本文應用程序編寫完成后,生成OpenGL.h和OpenGL.cpp兩個文件,將兩個文件和OpenGL庫文件及頭文件添加到主控制界面程序中。在主控制

46、界面程序中利用多線程技術創建OpenGL子線程,編譯運行通過后,就可以得到主控制界面,如圖7所示,并在主控制界面中找到打開子界面的功能。本章將對生成的OpenGL子界面的打開方法和OpenGL子界面的功能進行介紹。圖7. 主控制界面OpenGL子界面的打開是需要通過主控制界面上的功能鍵來實現的。具體操作為鼠標左鍵單擊界面左上角工具欄中“窗口”鍵(如圖8所示),將鼠標移動到“3D顯示”鍵上,左鍵單擊即可得到OpenGL子界面(如圖9所示)。圖8. OpenGL子界面窗口打開結合圖8分析OpenGL功能。首先右上角的最小化,最大化和關閉鍵能實現OpenGL子界面窗口最基本的縮放和關閉的功能。右上角為OpenGL子界面窗口的名稱:飛機動態飛行模擬。下方綠色字體顯示了飛機模型運動六個姿態數據的實時數值。角度數據的單位是度,位移數據的單位是米,兩組數據都精確到小數點后三位。OpenGL子界面窗口中間部分是飛機模型和外部框架。用于實時顯示飛機模型實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論