基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示_第1頁
基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示_第2頁
基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示_第3頁
基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示_第4頁
基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、/t/OA J本科畢業(yè)論文(科研訓(xùn)練、畢業(yè)設(shè)計)題 目:基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示姓 名:李培鋒學(xué) 院:物理與機(jī)電工程學(xué)院系:航空系專業(yè):航空機(jī)械年 級:2009級學(xué) 號:3#0指導(dǎo)教師(校內(nèi)):#職稱:教授指導(dǎo)教師(校外):職稱:2013年 5 月15日摘要基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示摘要近年來,隨著計算機(jī)動畫技術(shù)的高速發(fā)展,基于計算機(jī)動畫技術(shù)的實時仿真技術(shù)在 航天航空、機(jī)械設(shè)計、游戲開發(fā)、地理信息、氣象模擬、虛擬現(xiàn)實等領(lǐng)域的應(yīng)用越來越廣泛。本文以計算機(jī)圖形學(xué),圖像處理技術(shù)為基礎(chǔ),運(yùn)用OpenGL這一軟件接口,以VisualC+6.0為集成開發(fā)環(huán)境,在

2、Windows系統(tǒng)中建立飛機(jī)模型運(yùn)動3D仿真應(yīng)用程序。通過獲取 傳感器采集的飛機(jī)模型的姿態(tài)數(shù)據(jù),對繩牽引機(jī)器人控制的飛機(jī)模型在試驗中的運(yùn)動進(jìn)行實 時仿真顯示。文中詳細(xì)介紹了 Ope nGL構(gòu)建模型和實現(xiàn)動畫仿真顯示的原理和過程,以及在 編程過程中使用到的雙緩沖, Win32多線程和3DS格式模型導(dǎo)入等關(guān)鍵技術(shù)。關(guān)鍵詞實時仿真 OpenGL三維運(yùn)動 3DS格式模型導(dǎo)入ABSTRACT6.0 asWin32ABSTRACT In rece nt years, with the rapid developme nt of the computer ani mati on tech no logy,

3、real-time simulati on tech no logy, which is based on the computer ani mati on tech no logy, is being used in many fields such as aerospace, mecha ni cal desig n, game developme nt, geographic in formati on, weather simulati on, virtual reality and so on more and more wildly.This paper is mainly bas

4、ed on computer graphics and image process ing tech no logy, using a high performa nee graphics applicati on program ming in terface (API): OpenGL and Visual C+ in tegrated developme nt environment to build model airpla ne and the exter nal frame in Win dows system. The aircraft model en tity data is

5、 acquired by sen sor acquisiti on to achieve the purpose that simulates the three-dime nsional moti on attitude cha nges of the aircraft model con trolled by tracti on rope robot in time. This paper introduces the principles and processes of OpenGL to build model and achieve animation , as well as t

6、he key tech no logies used in the program mingprocess such as double bufferi ng,multi-threadi ng , 3DS format models import and so on.Key Word Real-time simulatio nOpe nGLthree-dime nsional moti on3DS format models import目錄目錄第一章 緒論11.1 本文研究的背景意義 1.1.2 本文的主要工作 2.1.3本文的主要內(nèi)容2.第二章OpenGL簡介及其實現(xiàn)繪圖的原理和過程32.

7、1 Ope nGL 簡介3.2.1.1 OpenGL 功能3.2.1.2 OpenGL圖形顯示方式4.2.2 OpenGL繪圖前期準(zhǔn)備5.第三章實時仿真顯示的關(guān)鍵技術(shù)和關(guān)鍵環(huán)節(jié) .6.3.1 VC 簡介6.3.2多線程技術(shù)6.3.3 本文涉及的坐標(biāo)系 7.3.3 3DS格式模型文件的生成 7.3.4 3DS模型文件導(dǎo)入OpenGL9.第四章飛機(jī)模型運(yùn)動3D實時仿真顯示的實現(xiàn)1.14.1 3D實時仿真顯示應(yīng)用程序的總體設(shè)計 1.14.2 創(chuàng)建窗口 .12.4.3程序初始化1.3.4.4模型場景構(gòu)建及運(yùn)動仿真144.4.1飛機(jī)模型運(yùn)動實時數(shù)據(jù)的獲得和顯示 144.4.2 飛機(jī)模型的繪制 15第五章

8、成果展示和功能分析1.7第六章總結(jié)1.9.參考文獻(xiàn)20.致謝語21.緒論第一章緒論11本文研究的背景意義本文研究目的是完善現(xiàn)有的繩牽引并聯(lián)支撐系統(tǒng)(WDPSS)主控制界面(簡稱主控制界面)。在分析現(xiàn)有的WPDSS原理樣機(jī)和主控制界面后,發(fā)現(xiàn)實驗者在實驗過程中不便于直 接觀察飛機(jī)模型的運(yùn)動情況,而現(xiàn)有的主控制界面沒有實時顯示飛機(jī)模型姿態(tài)方面的功能。 這不利于實驗者在實驗過程中直觀地掌握飛機(jī)模型的運(yùn)動情況并根據(jù)實時仿真顯示結(jié)果對飛 機(jī)模型的運(yùn)動姿態(tài)進(jìn)行相應(yīng)的調(diào)整。本文就是針對這一不足,制定合理的方案去解決問題。近年來,隨著計算機(jī)動畫技術(shù)的高速發(fā)展,利用計算機(jī)動畫技術(shù)實現(xiàn)仿真顯示在國內(nèi)外 各個領(lǐng)域都

9、日益成為最熱門的研究課題之一?,F(xiàn)已有多家公司各自開發(fā)出了相應(yīng)的仿真軟件?,F(xiàn)在主流的仿真軟件主要有由美國MultiGe n-Paradigm公司開發(fā)的能用于虛擬現(xiàn)實、實時視景仿真、聲音仿真以及其他可視化領(lǐng)域的軟件工具Vegaf2,由Quantum公司開發(fā)的軟件工具VTree和由美國MultiGen-Paradigm公司開發(fā)的 Multigen Creator系列軟件等。雖然上述軟件工具都被廣泛的使用,但是各有側(cè)重的領(lǐng)域。Vega提供了穩(wěn)定、兼容、易用的界面使開發(fā)、支持和維護(hù)工作更快和高效。Vega能有效地減少在圖形編程上花費的時間, 在對復(fù)雜系統(tǒng)進(jìn)行仿真的時候有明顯的優(yōu)勢。Multigen Cr

10、eator擁有針對實時應(yīng)用優(yōu)化的Ope nF light數(shù)據(jù)格式和多種專業(yè)選項及插件,能高效、最優(yōu)化地生成實時三維(RT3D)數(shù)據(jù)庫,能與后續(xù)的實時仿真軟件緊密結(jié)合。Multigen Creator在大型的視景仿真和娛樂游戲環(huán)境 的創(chuàng)建時較為適合。VTree則適合于開發(fā)高幀速率三維圖像應(yīng)用。OpenGL (全寫Open Graphics Library)是由SGI公司于1992年7月發(fā)布的,并且在此之 后一直保持對軟件相對高頻率的更新升級,這使得OpenGL的功能越來越強(qiáng)大,現(xiàn)已成為主流的專業(yè)三維圖形程序接口。 Ope nGL可以和各種編程語言緊密結(jié)合,以它為基礎(chǔ)的開發(fā)應(yīng) 用程序方便在各個平臺

11、間的移植,而且它為實現(xiàn)交互式視景仿真和虛擬現(xiàn)實提供了高效率的 庫函數(shù),因此功能強(qiáng)大 。對比上述軟件工具,OpenGL在本文研究的課題中有以下幾點優(yōu)勢:首先OpenGL的使用相對簡單;其次,由于 Ope nGL發(fā)展較為成熟,其各類輔助學(xué)習(xí)和編程的資料較為完整且 容易獲??;最重要的是 OpenGL能容易地在 Visual C+ 6.0(簡稱VC+6.0,是Visual Studio 的一個開發(fā)工具庫)環(huán)境下和主控制界面程序編寫在一起。因此,本文選擇使用OpenGL編寫實時仿真顯示子界面(簡稱子界面),完善現(xiàn)有的主控 制界面。通過使用子界面,實驗者能在實驗中直觀的了解飛機(jī)模型運(yùn)動情況并據(jù)此對飛機(jī)模

12、型的運(yùn)動進(jìn)行調(diào)整。1.2本文的主要工作本文研究目的是通過使用 OpenGL實現(xiàn)飛機(jī)運(yùn)動3D實時仿真顯示。具體而言就是以計 算機(jī)圖形學(xué)和圖像處理技術(shù)為理論基礎(chǔ),在 Win32基礎(chǔ)上運(yùn)用OpenGL,以VC+6.0為集成 開發(fā)環(huán)境,對實驗過程中飛機(jī)模型的運(yùn)動情況進(jìn)行實時仿真顯示。為了達(dá)到這個目的,本文 完成工作主要包含以下幾方面:1. 學(xué)習(xí)和了解OpenGL和其他必要軟件。研究坐標(biāo)變換、雙緩沖和多線程等關(guān)鍵技術(shù)。2. 使用OpenGL搭建飛機(jī)模型場景,研究如何設(shè)計應(yīng)用程序?qū)崿F(xiàn)飛機(jī)模型運(yùn)動實時仿真。 創(chuàng)建一個OpenGL窗口,顯示飛機(jī)模型的運(yùn)動仿真。3. 使用多線程技術(shù)將設(shè)計好的子界面鏈接到主控制界

13、面中。1.3本文的主要內(nèi)容本文詳細(xì)介紹了研究課題的實現(xiàn)過程和設(shè)計方法,具體的章節(jié)安排如下。第一章為緒論部分,主要簡述了本文研究課題的背景意義、主要工作和主要內(nèi)容。第二章中對OpenGL的特點和功能進(jìn)行了簡要的介紹。分析了在本文研究課題中使用到 OpenGL的主要技術(shù)環(huán)節(jié),并且說明了上述技術(shù)在本文中的使用。第三章首先對OpenGL的VC開發(fā)環(huán)境進(jìn)行介紹,并通過使用多線程技術(shù),實現(xiàn)主控制 界面和子界面的鏈接,最后研究如何使用 3DMAX生成3DS模型文件和3DS模型文件導(dǎo)入 Open GL。第四章編寫了基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示的應(yīng)用程序(簡稱應(yīng)用程 序)。通過分析總體結(jié)構(gòu)和介

14、紹具體模塊的流程及重要代碼,闡述了應(yīng)用程序的開發(fā)過程。第五章對應(yīng)用程序編寫的成果和功能進(jìn)行基本的介紹。第六章是對本次畢業(yè)設(shè)計的總結(jié)和分析。介紹應(yīng)用程序設(shè)計的不足和設(shè)計過程中的得失。2OpenGL簡介及其實現(xiàn)繪圖的原理和過程第二章 OpenGL簡介及其實現(xiàn)繪圖的原理和過程本章首先對OpenGL的概念、特點、基本功能進(jìn)行分析,在此基礎(chǔ)上著重研究了 OpenGL 圖形顯示和OpenGL繪圖的前期準(zhǔn)備兩個方面。通過對 OpenGL的初步研究為接下來應(yīng)用程 序的編寫做準(zhǔn)備。2.1 OpenGL 簡介OpenGL是一圖形硬件的一種軟件接口,被廣泛應(yīng)用于游戲開發(fā)、地理信息、氣象模擬、 虛擬現(xiàn)實等領(lǐng)域。Ope

15、nGL是高性能圖形和交互場景處理的行業(yè)標(biāo)準(zhǔn),它是一個函數(shù)庫而不 是一種編程語言。開發(fā)人員可以使用它提供的功能自由選擇操作系統(tǒng),在合適的開發(fā)平臺上 編寫出功能強(qiáng)大的三維圖形應(yīng)用程序。OpenGL是一個開發(fā)的標(biāo)準(zhǔn),雖然由 SGI公司首創(chuàng),但是它的標(biāo)準(zhǔn)是由 OpenGL體系結(jié) 構(gòu)審核委員會(ARB)掌管。ARB由IBM、In tel、Microsoft、ATI等著名公司創(chuàng)立,每隔四 年舉行一次會議,對 OpenGL規(guī)范進(jìn)行維護(hù)、改善和升級,使 OpenGL能一直保持與時代同 步。OpenGL的主要特點是具有高度的可移植性,豐富的函數(shù)庫,簡單易記的函數(shù)功能及命 名,高性能的圖形渲染和與C語言能緊密結(jié)合

16、能力。優(yōu)秀的性能使得 OpenGL成為當(dāng)下主流 的計算機(jī)仿真軟件工具。2.1.1 OpenGL 功能總的來說OpenGL是一個功能非常強(qiáng)大的專業(yè)三維圖形程序接口,主要具有以下八大功 能:1. 建模:OpenGL圖形庫除了提供點、線、多邊形等基本圖元的繪制函數(shù)外,還提供了復(fù)雜的三維物體(球、錐、多面體、茶壺等)以及復(fù)雜曲線和曲面繪制函數(shù)。2. 矩陣變換:復(fù)雜的圖形都是由基本圖元組成并經(jīng)過一系列的變換實現(xiàn)的,而OpenGL的變換都是通過乘以對應(yīng)的矩陣來實現(xiàn)的。Ope nGL提供了兩種變換方式:基本變換和投影 變換。其中基本變換包含了平移、縮放、旋轉(zhuǎn)和鏡像四種,投影變換包含了平行投影(正射 投影)和

17、透視投影兩種。3. 顏色模式設(shè)置:OpenGL提供了 RGBA模式和顏色索引模式(Color Index)兩種顏色 模式。RGBA模式為每個像素點指定顏色,而顏色索引模式則提供一個顏色表,各像素點通 過索引顏色表得到顏色值。4. 光照和材質(zhì)設(shè)置:OpenGL假設(shè)光由三原色(RGB)組成,物體對三原色分別有不同 的反射率,通過物理光學(xué)模型,計算物體實際顏色。5. 紋理映射:Ope nGL提供了完善的紋理映射機(jī)制可以十分逼真地表達(dá)物體表面細(xì)節(jié)。6. 位圖顯示:Ope nGL提供基本的拷貝和像素讀寫能力。7. 圖像增強(qiáng):OpenGL提供融合、霧和反走樣這三種特殊圖像效果處理,使被仿真物體 更具真實感

18、,增加圖形顯示效果。8. 雙緩沖動畫:雙緩沖技術(shù)是OpenGL出色的動畫效果的重要保障。OpenGL繪圖前會 先分配兩個顏色緩沖區(qū),在繪圖時,一個緩沖區(qū)執(zhí)行繪圖命令(后臺),另一個進(jìn)行圖形顯示(前臺)。循環(huán)反復(fù),保證屏幕(前臺)上總是顯示已經(jīng)畫好的圖形,以此實現(xiàn)圖形顯示的連 續(xù)變化,達(dá)到動畫效果,其中動畫交換幀函數(shù)為SwapBuffers(g_hDC)。此外,利用OpenGL還能實現(xiàn)深度暗示、運(yùn)動模糊等特殊效果,從而實現(xiàn)消隱算法。在本文應(yīng)用程序編寫過程中主要需要使用到建模、矩陣變換、顏色模式設(shè)置、光照和材 質(zhì)設(shè)置、位圖顯示及雙緩沖動畫等功能。2.1.2 OpenGL圖形顯示方式絕大多數(shù)Open

19、GL在實現(xiàn)圖像顯示時都有相似的操作順序,一系列相關(guān)的處理階段叫做 OpenGL渲染管線,如圖1所示。雖然沒有嚴(yán)格的規(guī)定 OpenGL必須采用這樣的實現(xiàn)方式, 但是圖1所示的順序是一個已經(jīng)得到證明的可靠的操作順序,所以本次論文中選擇通過這一 順序來實現(xiàn)圖形顯示。圖1. OpenGL渲染管線2.2 OpenGL繪圖前期準(zhǔn)備Ope nGL繪圖的前期準(zhǔn)備的第一步是選擇一個編譯環(huán)境?,F(xiàn)在 Win dows系統(tǒng)的主流編譯 環(huán)境有 Visual Studio, Broland C+ Builder,Dev-C+等,這些編譯環(huán)境都是支持 OpenGL 的。 在本文中,現(xiàn)有的主控制界面的編寫環(huán)境是 VC+6.0

20、,因此同樣選擇VC+6.0作為應(yīng)用程序 的開發(fā)環(huán)境。第二步是要安裝導(dǎo)入OpenGL工具包。幾乎對于所有的 OpenGL應(yīng)用程序,在使用之前 都需要導(dǎo)入OpenGL頭文件和工具函數(shù)庫(GLU),本文中編寫程序的過程也不例外,另外 Microsoft Windows要求在OpenGL頭文件之前包含 windows.h頭文件。所以在本文的應(yīng)用程 序編程前先將OpenGL頭文件和GLU導(dǎo)入程序目錄下,然后在源代碼開頭編寫以下代碼:#in clude <win dows.h>#in clude <in cludeope nglgl.h>#in clude <in clude

21、ope nglglu.h>#in clude <in cludeope nglglaux.h>#in clude <in cludeope nglglut.h>#in clude <in cludeope nglglext.h>#in clude <i nclude'ope nglwglext.h>第三步是建立OpenGL應(yīng)用程序的框架,也就是創(chuàng)建 OpenGL窗口并對OpenGL進(jìn)行初 始化。這部分的具體內(nèi)容在本文第四章中會有詳細(xì)介紹。5實時仿真顯示的關(guān)鍵技術(shù)和關(guān)鍵環(huán)節(jié)第三章實時仿真顯示的關(guān)鍵技術(shù)和關(guān)鍵環(huán)節(jié)在上一章對OpenGL進(jìn)

22、行研究的基礎(chǔ)上,本章主要介紹了在實現(xiàn)飛機(jī)運(yùn)動實時仿真顯示 過程中使用到的關(guān)鍵技術(shù)環(huán)節(jié),為應(yīng)用程序的編寫提供技術(shù)支持。本章首先介紹了本文應(yīng)用 程序的VC+6.0開發(fā)環(huán)境,然后分析使用多線程技術(shù)鏈接子界面和主控制界面的過程。由于 在使用計算機(jī)動畫技術(shù)實現(xiàn)仿真的過程中涉及各種坐標(biāo)系,在實際操作中易因為混淆而產(chǎn)生 錯誤,所以本章詳細(xì)介紹了本文中用到的幾個坐標(biāo)。在本章的最后,對3DS模型文件的生成和導(dǎo)入OpenGL這兩個關(guān)鍵環(huán)節(jié)進(jìn)行研究。通過對本章中內(nèi)容的研究,為應(yīng)用程序的開發(fā)奠 定理論基礎(chǔ)。3.1 VC簡介Visual C+ 6.0是Microsoft公司推出的一種開發(fā) Windows應(yīng)用程序的高級語

23、言,具有強(qiáng) 大的功能和較高的執(zhí)行效率。它提供了程序設(shè)計領(lǐng)域中所涉及的多種技術(shù),如文件訪問,圖 形圖像處理,數(shù)據(jù)處理和多媒體等,VC的開發(fā)對象幾乎涵蓋所有領(lǐng)域。VC是一個基于Windows操作系統(tǒng)的可視化且面向?qū)ο蟮募砷_發(fā)環(huán)境,用戶可使用 該環(huán)境開發(fā)有關(guān)C和C+的各種應(yīng)用程序,包括了建立,編輯,瀏覽,保存,編譯,鏈接和 測試等操作。其中應(yīng)用程序的開發(fā)主要有兩種模式:Windows API方式和MFC方式,兩種模式各具特色。3.2多線程技術(shù)在一個程序中,獨立運(yùn)行的程序片斷被叫作線程”(Thread)9。多線程的基本概念是程序中包含多個執(zhí)行流,即在一個程序中可以同時運(yùn)行多個不同的線程來執(zhí)行不同的任

24、務(wù), 也就是說允許單個程序創(chuàng)建多個并行執(zhí)行的線程來完成各自的任務(wù)。其目的不是為了提高運(yùn) 行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的效率。Win32多線程技術(shù)提供線程創(chuàng)建,線程掛起,恢復(fù)線程,線程退出、獲取當(dāng)前線程ID和條件鎖等基本操作,用戶通過使用這些操作可以實現(xiàn)基本功能。在本文研究中,已經(jīng)存在有主線程。本文為防止Ope nGL應(yīng)用程序的運(yùn)行對主線程產(chǎn)生影響,把OpenGL應(yīng)用程序獨立編寫成一個線程,保證兩個界面窗口能正常的同時運(yùn)行。本文創(chuàng)建線程的具體操作如下:1. 定義一個OpenGL線程的入口函數(shù),代碼如下所示DWORD WINAPI ThreadFu nc1(LPVOID n)Op

25、e nGL_Mai n();return 0;在上述函數(shù)中,OpenGL_Main()是OpenGL應(yīng)用程序的入口函數(shù)。使用線程創(chuàng)建函數(shù)創(chuàng)建子 線程后,可以調(diào)用ThreadFunc1這個線程函數(shù)進(jìn)入子線程。2. 創(chuàng)建線程:用函數(shù) CreateThread(NULL,O,ThreadFunc1,0,0,NULL)創(chuàng)建線程。該線程在點擊了主控制界面中特定的按鈕后開始創(chuàng)建。線程創(chuàng)建之后,Ope nGL窗口打開,開始繪制飛機(jī)模型。窗口打開的具體過程在第五章中會詳細(xì)介紹。3.3本文涉及的坐標(biāo)系本文需要涉及到坐標(biāo)系的過程主要是在Ope nGL窗口中模型的繪制以及模型平移旋轉(zhuǎn)。上述兩個過程涉及多個坐標(biāo)系,在

26、編寫時需要明確具體涉及哪坐標(biāo)系并根據(jù)該坐標(biāo)系的特點 進(jìn)行處理,這樣才能保證程序正確運(yùn)行。本文涉及的四種OpenGL坐標(biāo)系,包括世界坐標(biāo)、模型坐標(biāo)、設(shè)備坐標(biāo)和視點坐標(biāo)。接 下來對這四種坐標(biāo)系分別進(jìn)行介紹。世界坐標(biāo)是OpenGL中用來描述場景的坐標(biāo),Z軸正方向垂直屏幕向外,X軸正方向從 左到右,丫軸正方向軸從下到上,是右手笛卡爾坐標(biāo)系統(tǒng)。我們用這個坐標(biāo)系來描述物體及 光源的位置。模型坐標(biāo)是以模型某一點為原點而建立的“世界坐標(biāo)”,僅對模型本身適用,用來方便 對模型坐標(biāo)的描述。模型在 OpenGL中移動時,整體的相對位置是不變的,所以用模型自身 的坐標(biāo)來描述模型,和人的思維習(xí)慣一致。設(shè)備坐標(biāo)是指將三維

27、的世界坐標(biāo)經(jīng)過變換、投影等計算后最終算出的在顯示設(shè)備上對應(yīng) 的位置。視點坐標(biāo)是以視點坐標(biāo)為原點,以視線的方向為Z軸正方向的坐標(biāo)系。3.3 3DS格式模型文件的生成目前使用OpenGL繪制模型的方法主要有兩種。第一種是使用OpenGL圖形庫提供的點、 線、多邊形等基本圖元繪制函數(shù)或者相對復(fù)雜的三維物體以及復(fù)雜曲線和曲面的繪制函數(shù),通過高級語言環(huán)境(主要是 C語言)進(jìn)行開發(fā)。此方法比較靈活,適用性強(qiáng),在模型結(jié)構(gòu)較為簡單的時候有明顯的優(yōu)勢,但要求開發(fā)者熟練掌握編程技術(shù)和OpenGL,當(dāng)模型結(jié)構(gòu)比較復(fù)雜的時候工作量極大,而且并容易出錯。另一種方法是使用專業(yè)的三維模型繪制軟件繪制 生成OpenGL能夠讀

28、取的模型文件,通過將模型文件導(dǎo)入 OpenGL實現(xiàn)模型的繪制。此方法 由于其在處理復(fù)雜模型結(jié)構(gòu)時有明顯優(yōu)勢,被廣泛地使用。0呂u is視昇實D左D樹!E*=l學(xué)擊或單擊笄拖站咲逸擇時策問冃標(biāo)記陸走對8!PhyscsJ©日圖2. 3DMAX中的飛機(jī)模型在本文的研究中,為保證OpenGL中的模型是飛機(jī)模型實體按比例縮小的結(jié)果,同時考 慮到已有SolidWorks生成的飛機(jī)模型 WRL格式文件,故而采用第二種方法對飛機(jī)模型進(jìn)行 繪制。OpenGL強(qiáng)大的功能使得自身支持 DFX,3DS等多種模型文件的導(dǎo)入。由于3DS格式 文件Intel式的存儲方式很符合 windows系統(tǒng)下編程習(xí)慣,不需要

29、對文件進(jìn)行進(jìn)一步轉(zhuǎn)換,因 此本文選擇使用3DS格式模型文件導(dǎo)入OpenGL。為此在應(yīng)用程序編寫前首先需要使用 3D MAX軟件將原有的飛機(jī)模型 WRL格式文件轉(zhuǎn)化為3DS格式,并且對模型自身的三維坐標(biāo)系 進(jìn)行調(diào)整設(shè)置。飛機(jī)模型自身坐標(biāo)系調(diào)整后原點與飛機(jī)重心重合,機(jī)身長軸及短軸分別與X,丫軸重合。原點到機(jī)頭頂點方向為 X軸正方向,從飛機(jī)正前方觀察向右為 丫軸正方向,機(jī)身 垂直向下為Z軸正方向。最后將生成的3DS模型文件命名為“ feiji.3DS”,放在程序目錄下。 飛機(jī)模型在3D MAX軟件中調(diào)整后的最終效果如圖 2所示。3.4 3DS模型文件導(dǎo)入OpenGL3DS模型文件由許多的塊(Chun

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

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

32、數(shù)據(jù)分類導(dǎo)入對應(yīng) 的定義好的模塊結(jié)構(gòu)體中。直到所有需要的塊讀取完畢后,將每個塊的相關(guān)數(shù)據(jù)生成顯示列 表,3DS模型文件導(dǎo)入OpenGL過程結(jié)束。具體過程的流程圖如圖 3所示。10圖3. 3DS模型文件導(dǎo)入OpenGL流程圖飛機(jī)模型運(yùn)動3D實時仿真顯示的實現(xiàn)第四章 飛機(jī)模型運(yùn)動3D實時仿真顯示的實現(xiàn)在前幾章研究的基礎(chǔ)上,本章將詳細(xì)研究飛機(jī)模型運(yùn)動3D實時仿真顯示應(yīng)用程序的開發(fā)過程。具體組成是首先對整個應(yīng)用程序進(jìn)行了總體設(shè)計,然后通過介紹各個子模塊的具體 實現(xiàn)過程,對整個應(yīng)用程序的編寫進(jìn)行研究和說明。4.1 3D實時仿真顯示應(yīng)用程序的總體設(shè)計在對OpenGL、3DMAX等軟件進(jìn)行研究之后,為了解決

33、如何基于 OpenGL實現(xiàn)飛機(jī)模型 運(yùn)動的實時仿真顯示這一課題,首先對整個應(yīng)用程序進(jìn)行了總體設(shè)計。在本次研究中,應(yīng)用 程序編寫的思路主要是模塊化設(shè)計。模塊化設(shè)計的含義就是對應(yīng)用程序進(jìn)行分析后將整個程 序分成若干個子模塊,然后對子模塊分別進(jìn)行設(shè)計,最后將子模塊有機(jī)結(jié)合在一起滿足應(yīng)用 程序功能上的需求。模塊化設(shè)計的采用有利于使應(yīng)用程序的結(jié)構(gòu)更加清晰、調(diào)試更加容易, 從而提供程序的可靠性、可修改性、可讀性和可移植性。根據(jù)OpenGL繪圖的特點和程序整體功能的要求,應(yīng)用程序主要分為創(chuàng)建窗口,程序初 始化和模型場景構(gòu)建及運(yùn)動仿真三個模塊。對三個模塊分別進(jìn)行設(shè)計編輯之后,完成的應(yīng)用 程序的流程圖如圖4所示

34、。本章接下來將對三個模塊程序編寫的具體流程和關(guān)鍵的程序代碼 進(jìn)行分析,研究整個應(yīng)用程序的實現(xiàn)過程。圖4. 3D實時仿真顯示程序的總體設(shè)計4.2創(chuàng)建窗口實時仿真顯示功能的實現(xiàn)首先需要建立一個Ope nGL窗口。在本文應(yīng)用程序中通過自行定義的 HWND CreateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, HINSTANCE hInstanee)函數(shù)來創(chuàng)建顯示窗口的。窗口創(chuàng)建程序的流程如圖5所示。最后生成一個初始大小為800X 600,名字為“飛機(jī)動態(tài)飛行模擬”的窗口。窗口創(chuàng)建函數(shù)將 HWND gl_hW

35、nd設(shè)置為窗口句柄。用 WNDCLASS wndelass這個窗口類 結(jié)構(gòu)來保存窗口信息,在窗口信息中包含了 WndProe函數(shù),用來處理 Windows消息及鍵盤響 應(yīng)。然后通過RegisterClass(&wndelass函數(shù)注冊窗口。在設(shè)置完窗口的屬性和大小以后,用 CreateWindow()函數(shù)完成窗口的創(chuàng)建。最后用ShowWindow()函數(shù)設(shè)置窗口的顯示狀態(tài)后, 返回窗口句柄。WndProc函數(shù)用于處理窗口消息,主要添加的消息主要是兩個部分:第一個部分是用于 控制窗口的形狀變化,響應(yīng)窗口右上角的最小化和最大化功能,并且使窗口能夠通過拉伸來 調(diào)整大小。第二個部分是用于關(guān)閉窗

36、口的,響應(yīng)窗口右上角的關(guān)閉功能。實際上在本文中關(guān) 閉窗口并沒有將 OpenGL線程停止,而是調(diào)用 ShowWindow(gl_hWnd,SW_HIDE)將窗口隱藏 起來。圖5創(chuàng)建窗口流程圖4.3程序初始化程序初始化部分承接了創(chuàng)建窗口,并為模型場景構(gòu)建及運(yùn)動仿真做準(zhǔn)備,是應(yīng)用程序重 要的組成部分。本文中用void Init(HWND gl_hWnd)此函數(shù)實現(xiàn)程序初始化,其流程如圖6所 示。獲取窗口坐標(biāo)用 GetClientRect(g_hWnd, &g_rRect)函數(shù)實現(xiàn)。初始化OpenGL就是對整個OpenGL繪圖環(huán)境進(jìn)行設(shè)置,總共可分為三步。第一步是重新設(shè)置窗口的像素格式,并聲明

37、一個PIXELFORMATDESCRIPTOR的結(jié)構(gòu)體變量用來保存相關(guān)信息。第二步是為OpenGL建立一個圖形操作描述表RC。具體步驟是先用wgICreateCurrent(g_hDC)函數(shù)建立圖形操 作描述表。該函數(shù)的作用是以設(shè)備描述句柄 g_hRC為參數(shù),返回與設(shè)備描述表相關(guān)的圖形操 作描述表句柄g_hDC。再以g_hRC和g_hDC兩個句柄為參數(shù)調(diào)用 wglMakeCurrent( g_hDC, g_hRC)函數(shù),使建立的圖形操作描述表成為線程當(dāng)前使用的圖形操作描述表。第三步是對 投影變化進(jìn)行初始化。3DS文件導(dǎo)入OpenGL的技術(shù)和原理在本文第三章中已經(jīng)做過具體的分析在這里就不加 以贅

38、述。根據(jù)上述原理,在 C語言程序中編寫3DS模型文件導(dǎo)入函數(shù)g_Load3ds.lmport3DS(&g_3DModel, FILE_NAME)。程序初始化中導(dǎo)入 3DS文件的具體過程 是首先在程序開頭將飛機(jī)3DS模型文件名"feiji.3DS"定義到FILE_NAME中,然后在Init(HWND gl_hWnd)函數(shù)中調(diào)用導(dǎo)入函數(shù),把 3DS文件裝入模型結(jié)構(gòu)體中。圖6.程序初始化流程圖4.4模型場景構(gòu)建及運(yùn)動仿真441飛機(jī)模型運(yùn)動實時數(shù)據(jù)的獲得和顯示本文的應(yīng)用程序的編寫是應(yīng)用于 WDPSS系統(tǒng)控制的飛機(jī)模型試驗中的,該試驗系統(tǒng)樣 機(jī)安裝有用于采集飛機(jī)模型試驗位姿系

39、統(tǒng)關(guān)鍵數(shù)據(jù)的傳感器。在實驗過程中通過傳感器采集 數(shù)據(jù),進(jìn)行處理后得到飛機(jī)模型運(yùn)動的六個姿態(tài)數(shù)據(jù)(俯仰,滾轉(zhuǎn),偏航的角度以及X,Y,Z軸上的位移)。由于數(shù)據(jù)的采集和處理在原有主程序中已有完整的函數(shù),故而在本文研究的 應(yīng)用程序中只需要直接調(diào)用數(shù)據(jù)即可。由于數(shù)據(jù)采集和處理部分不是本文研究的重點,所以 在此不加以展開。本文研究的課題是“基于 OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示”,接下來對實時性進(jìn)行分析。在仿真顯示的實現(xiàn)過程中,有幾個過程會產(chǎn)生時間上的滯后,分別是數(shù)據(jù)采集過 程,數(shù)據(jù)處理過程和Ope nGL窗口中飛機(jī)模型繪制過程。所以本文中所指的實時并不是完全 意義上的和飛機(jī)模型實體的運(yùn)動同步。

40、但是分別分析幾個過程,其中Ope nGL繪圖采用雙緩沖技術(shù),刷新頻率和屏幕的刷新頻率一致,故而滯后時間一般是在0.01s數(shù)量級的。書籍處理過程只有幾個計算函數(shù)和數(shù)據(jù)傳遞,滯后的時間很短。而數(shù)據(jù)的采集的滯后時間也是小于 0.01s數(shù)量級的。又由于本實驗創(chuàng)建基于 OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示窗口的目 的只要是觀察飛機(jī)模型運(yùn)動的情況,對于實時性這一指標(biāo)在時間的精確性上要求并不是非常 高。故而上述三個過程產(chǎn)生的總的滯后時間用肉眼很難分辨,故而其對實時性的影響在本文 研究過程中可以忽略,即能夠本文編寫的Ope nGL應(yīng)用程序能達(dá)到本文研究課題對于實時性的要求。Ope nGL應(yīng)用程序從主程序

41、中獲得到六個姿態(tài)數(shù)據(jù)以后,使用Win API函數(shù)TextOut()將 姿態(tài)數(shù)據(jù)顯示在OpenGL窗口的左上角。使實驗者可以在觀察飛機(jī)模型運(yùn)動動畫的同時,觀 察到實時的姿態(tài)數(shù)據(jù)的具體值。具體實時姿態(tài)數(shù)據(jù)顯示函數(shù)中顯示俯仰角度數(shù)據(jù)的代碼如下: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,strle n(str_pitch);Set

42、TextColor(g_hDC,RGB(0,200,0);442飛機(jī)模型的繪制在繪制飛機(jī)模型前,首先需要調(diào)用glClear()函數(shù)對OpenGL進(jìn)行顏色清除以及深度緩沖。 然后用glLoadldentity()函數(shù)設(shè)置單位矩陣,具體作用就是將飛機(jī)模型自身坐標(biāo)系和世界坐標(biāo) 系重合。最后使用gluLookAt ()函數(shù)設(shè)置觀察視角。在設(shè)置好這些參數(shù)后,就具備了繪制飛 機(jī)模型的基本條件。具體飛機(jī)模型場景的繪制有兩個部分。第一部分是使用OpenGL圖形庫提供線繪制函數(shù)glBegin(GL_LINE_LOOP)繪制一個0.82X 0.78X 1.04的長方體框架(尺寸具體參考已有的 WDPSS控制的風(fēng)洞

43、試驗原理樣機(jī)的設(shè)計尺寸 )。具體的思路就是先計算出長方體的八個頂點的坐標(biāo),然后根據(jù)點繪制線,最后通過分別繪制長方體框架的六個面來完成框架的繪制。 第二部分是繪制已經(jīng)導(dǎo)入的3DS模型文件中的飛機(jī)模型。繪制的具體方法是遍歷飛機(jī)模型中 所有的對象生成的顯示列表(具體生成過程在第三章中有詳細(xì)介紹),將3DS模型文件導(dǎo)入過程中生成的顯示列表里的信息全部顯示出來。在主控制界面調(diào)整飛機(jī)姿態(tài)數(shù)據(jù)后,數(shù)據(jù)傳遞到Ope nGL線程后。需要使用位移變化和旋轉(zhuǎn)函數(shù)調(diào)整飛機(jī)模型的位置。由于位移變化和旋轉(zhuǎn)是以世界坐標(biāo)為基準(zhǔn)的,所以在調(diào)用位 移和旋轉(zhuǎn)函數(shù)后需要配對調(diào)用 glPushMatrix()和glPopMatrix(

44、)函數(shù)。這兩個函數(shù)配對調(diào)用在本 文應(yīng)用程序中實現(xiàn)的作用是保證下一次調(diào)用位移和旋轉(zhuǎn)函數(shù)時飛機(jī)模型自身坐標(biāo)系和世界坐 標(biāo)系重合。具體的程序代碼如下:glTra nslatef(g_x,g_y,g_z);glRotatef(g_Rotatex,1.0f, 0, 0); 繞指定軸旋轉(zhuǎn) glRotatef(g_Rotatey, 0, 1.0f, 0); /pitch 的角度 glRotatef(g_Rotatez, 0, 0,1.0f); /yaw 的角度 glPushMatrix(); /將當(dāng)前變換矩陣(單位陣)壓入堆棧 glPopMatrix();在本文程序編寫時為了降低 OpenGL使用時的CPU

45、使用率,通過在交換緩沖區(qū)前調(diào)用Sleep(5) 函數(shù),使交換緩沖區(qū)過程停滯 5毫秒。能夠在不影響視覺效果的情況下降低刷新頻率,從而 減低CPU使用率。本文中應(yīng)用程序為避免與主控制界面程序中的定時器發(fā)生沖突,在模型場景構(gòu)建及運(yùn)動仿真部分并未單獨設(shè)置一個定時器,而是只是使用一個 While( 1)循環(huán)一直循環(huán)刷新該部分。 具體來說,飛機(jī)模型運(yùn)動數(shù)據(jù)的獲取的頻率可以理解為和主控制界面中相關(guān)部分的定時器設(shè) 置的刷新頻率相同。而數(shù)據(jù)的顯示、場景的繪制和飛機(jī)模型的運(yùn)動的刷新頻率在默認(rèn)設(shè)置的 情況下根據(jù)OpenGL雙緩沖技術(shù)的原理和 Win32 API的原理和程序運(yùn)行設(shè)備的屏幕的刷新頻 率相同。16成果展示

46、和功能分析18第五章 成果展示和功能分析本文應(yīng)用程序編寫完成后,生成 OpenGL.h和OpenGL.cpp兩個文件,將兩個文件和 OpenGL庫文件及頭文件添加到主控制界面程序中。在主控制界面程序中利用多線程技術(shù)創(chuàng) 建OpenGL子線程,編譯運(yùn)行通過后,就可以得到主控制界面,如圖7所示,并在主控制界面中找到打開子界面的功能。本章將對生成的 Ope nGL子界面的打開方法和Ope nGL子界面 的功能進(jìn)行介紹。戈幷an it'控n吿Y加朋丫拉力丫文住 IdtoiW aon "沖 般cm® 阿廠arasbf角如令丫新滬伽aim號入AHR5rPM*WFjiSGT G#t

47、Cm9U GT GtlCnd irgaie顯恒餌也阿曲豁 a 價詆#*嚴(yán)召伏態(tài)iPMActiff I haA'S | iHARSil 1 DWwa| I 丸廉ifc |【 lnatFis | |gp«nGI>.Kl Iftfeiffg | 弦時 I IlfcifcWiiS IIl仲助 滾轉(zhuǎn)曲xfiwamT3.#9i57.11-71.4301.44-5Q 70拉力仲034.05打蜩2157SV.tl珂斗34I&5.5532S.S1477-95329.13圖7.主控制界面OpenGL子界面的打開是需要通過主控制界面上的功能鍵來實現(xiàn)的。具體操作為鼠標(biāo)左鍵單擊界面左上角工具欄中“窗口”鍵(如圖 8所示),將鼠標(biāo)移動到“ 3D顯示”鍵上,左 鍵單擊即可得到OpenGL子界面(如圖9所示)。/T"nti Robct Cont圖& OpenGL子界面窗口打開結(jié)合圖8分析OpenGL功能。首先右上角的最小化,最大化和關(guān)閉鍵能實現(xiàn)OpenGL子界面窗口最基本的縮放和關(guān)閉的功能。右上角為OpenGL子界面窗口的名稱:飛機(jī)動態(tài)飛行模擬。下方綠色字體顯示了飛機(jī)模型運(yùn)動六個姿態(tài)數(shù)據(jù)的實時數(shù)值。角度數(shù)據(jù)的單位是度, 位移數(shù)據(jù)的單位是米,兩組數(shù)據(jù)都精確到小數(shù)點后三位。OpenGL子界面窗口中間部分是飛機(jī)模型和外部框架。

溫馨提示

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

最新文檔

評論

0/150

提交評論