版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、本科畢業(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這一軟件接口,以Visual C+6.0為集成開發(fā)環(huán)境,在Wi
2、ndows系統(tǒng)中建立飛機(jī)模型運(yùn)動3D仿真應(yīng)用程序。通過獲取傳感器采集的飛機(jī)模型的姿態(tài)數(shù)據(jù),對繩牽引機(jī)器人控制的飛機(jī)模型在試驗中的運(yùn)動進(jìn)行實時仿真顯示。文中詳細(xì)介紹了OpenGL構(gòu)建模型和實現(xiàn)動畫仿真顯示的原理和過程,以及在編程過程中使用到的雙緩沖,Win32多線程和3DS格式模型導(dǎo)入等關(guān)鍵技術(shù)。關(guān)鍵詞 實時仿真 OpenGL 三維運(yùn)動 3DS格式模型導(dǎo)入 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 本文的主要內(nèi)容2第二章 OpenGL簡介及其實現(xiàn)繪圖的原理和過程22.1 OpenGL簡介32.1.1 OpenGL功能32.1.2 OpenGL圖形顯示方式42.2 OpenGL繪圖前期準(zhǔn)備4
7、第三章 實時仿真顯示的關(guān)鍵技術(shù)和關(guān)鍵環(huán)節(jié)63.1 VC簡介63.2 多線程技術(shù)63.3 本文涉及的坐標(biāo)系73.3 3DS格式模型文件的生成73.4 3DS模型文件導(dǎo)入OpenGL9第四章 飛機(jī)模型運(yùn)動3D實時仿真顯示的實現(xiàn)114.1 3D實時仿真顯示應(yīng)用程序的總體設(shè)計114.2 創(chuàng)建窗口124.3 程序初始化134.4 模型場景構(gòu)建及運(yùn)動仿真144.4.1 飛機(jī)模型運(yùn)動實時數(shù)據(jù)的獲得和顯示144.4.2 飛機(jī)模型的繪制15第五章 成果展示和功能分析17第六章 總結(jié)19參考文獻(xiàn)20致謝語21第一章 緒論1.1 本文研究的背景意義本文研究目的是完善現(xiàn)有的繩牽引并聯(lián)支撐系統(tǒng)(WDPSS)1主控制界面
8、(簡稱主控制界面)。在分析現(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)域都日益成為最熱門的研究課題之一。現(xiàn)已有多家公司各自開發(fā)出了相應(yīng)的仿真軟件?,F(xiàn)在主流的仿真軟件主要有由美國MultiGen-Paradigm公司開發(fā)的能用于虛擬現(xiàn)實、實時視景仿真、聲
9、音仿真以及其他可視化領(lǐng)域的軟件工具Vega2,由Quantum公司開發(fā)的軟件工具VTree3和由美國MultiGen-Paradigm公司開發(fā)的Multigen Creator系列軟件等。雖然上述軟件工具都被廣泛的使用,但是各有側(cè)重的領(lǐng)域。Vega提供了穩(wěn)定、兼容、易用的界面使開發(fā)、支持和維護(hù)工作更快和高效。Vega能有效地減少在圖形編程上花費(fèi)的時間,在對復(fù)雜系統(tǒng)進(jìn)行仿真的時候有明顯的優(yōu)勢。Multigen Creator擁有針對實時應(yīng)用優(yōu)化的OpenFlight數(shù)據(jù)格式和多種專業(yè)選項及插件,能高效、最優(yōu)化地生成實時三維(RT3D)數(shù)據(jù)庫,能與后續(xù)的實時仿真軟件緊密結(jié)合。Multigen Cr
10、eator在大型的視景仿真和娛樂游戲環(huán)境的創(chuàng)建時較為適合。VTree則適合于開發(fā)高幀速率三維圖像應(yīng)用。OpenGL(全寫Open Graphics Library)是由SGI公司于1992年7月發(fā)布的,并且在此之后一直保持對軟件相對高頻率的更新升級,這使得OpenGL的功能越來越強(qiáng)大,現(xiàn)已成為主流的專業(yè)三維圖形程序接口。 OpenGL可以和各種編程語言緊密結(jié)合,以它為基礎(chǔ)的開發(fā)應(yīng)用程序方便在各個平臺間的移植,而且它為實現(xiàn)交互式視景仿真和虛擬現(xiàn)實提供了高效率的庫函數(shù),因此功能強(qiáng)大4。對比上述軟件工具, OpenGL在本文研究的課題中有以下幾點(diǎn)優(yōu)勢:首先OpenGL的使用相對簡單;其次,由于Ope
11、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ī)模型的運(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為集成開
12、發(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è)計好的子界面鏈接到主控制界面中。1.3 本文的主要內(nèi)容本文詳細(xì)介紹了研究課題的實現(xiàn)過程和設(shè)計方法,具體的章節(jié)安排如下。第一章為緒論部分,主要簡述了本文研究課題的背景意義、主要工作和主要內(nèi)容。第二章中對OpenGL的特點(diǎn)和功能進(jìn)行了簡要的介紹。分析了在
13、本文研究課題中使用到OpenGL的主要技術(shù)環(huán)節(jié),并且說明了上述技術(shù)在本文中的使用。第三章首先對OpenGL的VC開發(fā)環(huán)境進(jìn)行介紹,并通過使用多線程技術(shù),實現(xiàn)主控制界面和子界面的鏈接,最后研究如何使用3DMAX生成3DS模型文件和3DS模型文件導(dǎo)入OpenGL。第四章編寫了基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示的應(yīng)用程序(簡稱應(yīng)用程序)。通過分析總體結(jié)構(gòu)和介紹具體模塊的流程及重要代碼,闡述了應(yīng)用程序的開發(fā)過程。第五章對應(yīng)用程序編寫的成果和功能進(jìn)行基本的介紹。第六章是對本次畢業(yè)設(shè)計的總結(jié)和分析。介紹應(yīng)用程序設(shè)計的不足和設(shè)計過程中的得失。第二章 OpenGL簡介及其實現(xiàn)繪圖的原理和過程本章首
14、先對OpenGL的概念、特點(diǎn)、基本功能進(jìn)行分析,在此基礎(chǔ)上著重研究了OpenGL圖形顯示和OpenGL繪圖的前期準(zhǔn)備兩個方面。通過對OpenGL的初步研究為接下來應(yīng)用程序的編寫做準(zhǔn)備。2.1 OpenGL簡介OpenGL是一圖形硬件的一種軟件接口5,被廣泛應(yīng)用于游戲開發(fā)、地理信息、氣象模擬、虛擬現(xiàn)實等領(lǐng)域。OpenGL是高性能圖形和交互場景處理的行業(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)掌
15、管。ARB由IBM、Intel、Microsoft、ATI等著名公司創(chuàng)立,每隔四年舉行一次會議,對OpenGL規(guī)范進(jìn)行維護(hù)、改善和升級,使OpenGL能一直保持與時代同步。OpenGL的主要特點(diǎn)是具有高度的可移植性,豐富的函數(shù)庫,簡單易記的函數(shù)功能及命名,高性能的圖形渲染和與C語言能緊密結(jié)合能力。優(yōu)秀的性能使得OpenGL成為當(dāng)下主流的計算機(jī)仿真軟件工具。2.1.1 OpenGL功能總的來說OpenGL是一個功能非常強(qiáng)大的專業(yè)三維圖形程序接口,主要具有以下八大功能:1. 建模:OpenGL圖形庫除了提供點(diǎn)、線、多邊形等基本圖元的繪制函數(shù)外,還提供了復(fù)雜的三維物體(球、錐、多面體、茶壺等)以及復(fù)
16、雜曲線和曲面繪制函數(shù)。2. 矩陣變換:復(fù)雜的圖形都是由基本圖元組成并經(jīng)過一系列的變換實現(xiàn)的,而OpenGL的變換都是通過乘以對應(yīng)的矩陣來實現(xiàn)的。OpenGL提供了兩種變換方式:基本變換和投影變換。其中基本變換包含了平移、縮放、旋轉(zhuǎn)和鏡像四種,投影變換包含了平行投影(正射投影)和透視投影兩種。3. 顏色模式設(shè)置:OpenGL提供了RGBA模式和顏色索引模式(Color Index)兩種顏色模式。RGBA模式為每個像素點(diǎn)指定顏色,而顏色索引模式則提供一個顏色表,各像素點(diǎn)通過索引顏色表得到顏色值。4. 光照和材質(zhì)設(shè)置:OpenGL假設(shè)光由三原色(RGB)組成,物體對三原色分別有不同的反射率,通過物理
17、光學(xué)模型,計算物體實際顏色。5. 紋理映射:OpenGL提供了完善的紋理映射機(jī)制可以十分逼真地表達(dá)物體表面細(xì)節(jié)。6. 位圖顯示:OpenGL提供基本的拷貝和像素讀寫能力。7. 圖像增強(qiáng):OpenGL提供融合、霧和反走樣這三種特殊圖像效果處理,使被仿真物體更具真實感,增加圖形顯示效果。8. 雙緩沖動畫:雙緩沖技術(shù)是OpenGL出色的動畫效果的重要保障。OpenGL繪圖前會先分配兩個顏色緩沖區(qū),在繪圖時,一個緩沖區(qū)執(zhí)行繪圖命令(后臺),另一個進(jìn)行圖形顯示(前臺)。循環(huán)反復(fù),保證屏幕(前臺)上總是顯示已經(jīng)畫好的圖形,以此實現(xiàn)圖形顯示的連續(xù)變化,達(dá)到動畫效果,其中動畫交換幀函數(shù)為SwapBuffers
18、(g_hDC)。此外,利用OpenGL還能實現(xiàn)深度暗示、運(yùn)動模糊等特殊效果,從而實現(xiàn)消隱算法6。在本文應(yīng)用程序編寫過程中主要需要使用到建模、矩陣變換、顏色模式設(shè)置、光照和材質(zhì)設(shè)置、位圖顯示及雙緩沖動畫等功能。2.1.2 OpenGL圖形顯示方式絕大多數(shù)OpenGL在實現(xiàn)圖像顯示時都有相似的操作順序,一系列相關(guān)的處理階段叫做OpenGL渲染管線7,如圖1所示。雖然沒有嚴(yán)格的規(guī)定OpenGL必須采用這樣的實現(xiàn)方式,但是圖1所示的順序是一個已經(jīng)得到證明的可靠的操作順序,所以本次論文中選擇通過這一順序來實現(xiàn)圖形顯示。幾何頂點(diǎn)數(shù)據(jù)求值器圖像像素數(shù)據(jù)顯示列表圖像操作紋理裝配逐個頂點(diǎn)操作與圖元裝配光柵化幀緩
19、沖區(qū)片段操作圖1. OpenGL渲染管線2.2 OpenGL繪圖前期準(zhǔn)備OpenGL繪圖的前期準(zhǔn)備的第一步是選擇一個編譯環(huán)境。現(xiàn)在Windows系統(tǒng)的主流編譯環(huán)境有Visual Studio,Broland C+ Builder,Dev-C+等,這些編譯環(huán)境都是支持OpenGL的。在本文中,現(xiàn)有的主控制界面的編寫環(huán)境是VC+6.0,因此同樣選擇VC+6.0作為應(yīng)用程序的開發(fā)環(huán)境。第二步是要安裝導(dǎo)入OpenGL工具包。幾乎對于所有的OpenGL應(yīng)用程序,在使用之前都需要導(dǎo)入OpenGL頭文件和工具函數(shù)庫(GLU),本文中編寫程序的過程也不例外,另外Microsoft Windows要求在Open
20、GL頭文件之前包含windows.h頭文件。所以在本文的應(yīng)用程序編程前先將OpenGL頭文件和GLU導(dǎo)入程序目錄下,然后在源代碼開頭編寫以下代碼:#include <windows.h>#include <includeopenglgl.h>#include <includeopenglglu.h>#include <includeopenglglaux.h>#include <includeopenglglut.h>#include <includeopenglglext.h>#include <includeop
21、englwglext.h>第三步是建立OpenGL應(yīng)用程序的框架,也就是創(chuàng)建OpenGL窗口并對OpenGL進(jìn)行初始化。這部分的具體內(nèi)容在本文第四章中會有詳細(xì)介紹。第三章 實時仿真顯示的關(guān)鍵技術(shù)和關(guān)鍵環(huán)節(jié)在上一章對OpenGL進(jìn)行研究的基礎(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)。在本章的最后,對3D
22、S模型文件的生成和導(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)用程序的高級語言,具有強(qiáng)大的功能和較高的執(zhí)行效率。它提供了程序設(shè)計領(lǐng)域中所涉及的多種技術(shù),如文件訪問,圖形圖像處理,數(shù)據(jù)處理和多媒體等,VC的開發(fā)對象幾乎涵蓋所有領(lǐng)域。VC是一個基于Windows操作系統(tǒng)的可視化且面向?qū)ο蟮募砷_發(fā)環(huán)境8,用戶可使用該環(huán)境開發(fā)有關(guān)C和C+的各種應(yīng)用程序,包括了建立,編輯,瀏覽,保存,編譯,鏈接和測試等操作。其中應(yīng)用程序的開發(fā)主要有兩種模式:Windows
23、API方式和MFC方式,兩種模式各具特色。3.2 多線程技術(shù)在一個程序中,獨(dú)立運(yùn)行的程序片斷被叫作“線程”(Thread)9。多線程的基本概念是程序中包含多個執(zhí)行流,即在一個程序中可以同時運(yùn)行多個不同的線程來執(zhí)行不同的任務(wù),也就是說允許單個程序創(chuàng)建多個并行執(zhí)行的線程來完成各自的任務(wù)。其目的不是為了提高運(yùn)行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的效率。Win32多線程技術(shù)提供線程創(chuàng)建,線程掛起,恢復(fù)線程,線程退出、獲取當(dāng)前線程ID和條件鎖等基本操作,用戶通過使用這些操作可以實現(xiàn)基本功能。在本文研究中,已經(jīng)存在有主線程。本文為防止OpenGL應(yīng)用程序的運(yùn)行對主線程產(chǎn)生影響,把OpenGL應(yīng)用
24、程序獨(dú)立編寫成一個線程,保證兩個界面窗口能正常的同時運(yùn)行。本文創(chuàng)建線程的具體操作如下:1. 定義一個OpenGL線程的入口函數(shù),代碼如下所示DWORD WINAPI ThreadFunc1(LPVOID n)OpenGL_Main();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,0,ThreadFunc1,0,0,NULL)創(chuàng)建線程。該線程在點(diǎn)擊了主控制界面中特定的按鈕后開始創(chuàng)建。線程創(chuàng)建之后,OpenG
25、L窗口打開,開始繪制飛機(jī)模型。窗口打開的具體過程在第五章中會詳細(xì)介紹。3.3 本文涉及的坐標(biāo)系本文需要涉及到坐標(biāo)系的過程主要是在OpenGL窗口中模型的繪制以及模型平移旋轉(zhuǎn)。上述兩個過程涉及多個坐標(biāo)系,在編寫時需要明確具體涉及哪坐標(biāo)系并根據(jù)該坐標(biāo)系的特點(diǎn)進(jìn)行處理,這樣才能保證程序正確運(yùn)行。本文涉及的四種OpenGL坐標(biāo)系,包括世界坐標(biāo)、模型坐標(biāo)、設(shè)備坐標(biāo)和視點(diǎn)坐標(biāo)。接下來對這四種坐標(biāo)系分別進(jìn)行介紹。世界坐標(biāo)是OpenGL中用來描述場景的坐標(biāo),Z軸正方向垂直屏幕向外,X軸正方向從左到右,Y軸正方向軸從下到上,是右手笛卡爾坐標(biāo)系統(tǒng)。我們用這個坐標(biāo)系來描述物體及光源的位置。模型坐標(biāo)是以模型某一點(diǎn)為原
26、點(diǎn)而建立的“世界坐標(biāo)”,僅對模型本身適用,用來方便對模型坐標(biāo)的描述。模型在OpenGL中移動時,整體的相對位置是不變的,所以用模型自身的坐標(biāo)來描述模型,和人的思維習(xí)慣一致。設(shè)備坐標(biāo)是指將三維的世界坐標(biāo)經(jīng)過變換、投影等計算后最終算出的在顯示設(shè)備上對應(yīng)的位置。視點(diǎn)坐標(biāo)是以視點(diǎn)坐標(biāo)為原點(diǎn),以視線的方向為Z軸正方向的坐標(biāo)系。3.3 3DS格式模型文件的生成目前使用OpenGL繪制模型的方法主要有兩種。第一種是使用OpenGL圖形庫提供的點(diǎn)、線、多邊形等基本圖元繪制函數(shù)或者相對復(fù)雜的三維物體以及復(fù)雜曲線和曲面的繪制函數(shù),通過高級語言環(huán)境(主要是C語言)進(jìn)行開發(fā)。此方法比較靈活,適用性強(qiáng),在模型結(jié)構(gòu)較為簡
27、單的時候有明顯的優(yōu)勢,但要求開發(fā)者熟練掌握編程技術(shù)和OpenGL,當(dāng)模型結(jié)構(gòu)比較復(fù)雜的時候工作量極大,而且并容易出錯。另一種方法是使用專業(yè)的三維模型繪制軟件繪制生成OpenGL能夠讀取的模型文件,通過將模型文件導(dǎo)入OpenGL實現(xiàn)模型的繪制。此方法由于其在處理復(fù)雜模型結(jié)構(gòu)時有明顯優(yōu)勢,被廣泛地使用。圖2. 3DMAX中的飛機(jī)模型在本文的研究中,為保證OpenGL中的模型是飛機(jī)模型實體按比例縮小的結(jié)果,同時考慮到已有SolidWorks生成的飛機(jī)模型WRL格式文件,故而采用第二種方法對飛機(jī)模型進(jìn)行繪制。OpenGL強(qiáng)大的功能使得自身支持DFX,3DS等多種模型文件的導(dǎo)入。由于3DS格式文件Int
28、el式的存儲方式很符合windows系統(tǒng)下編程習(xí)慣,不需要對文件進(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)整后原點(diǎn)與飛機(jī)重心重合,機(jī)身長軸及短軸分別與X,Y軸重合。原點(diǎn)到機(jī)頭頂點(diǎn)方向為X軸正方向,從飛機(jī)正前方觀察向右為Y軸正方向,機(jī)身垂直向下為Z軸正方向。最后將生成的3DS模型文件命名為“feiji.3DS”,放在程序目錄下。飛機(jī)模型在3D MAX軟件中調(diào)整后的最終效果如圖2所示。3.4 3DS模型文件導(dǎo)入Open
29、GL3DS模型文件由許多的塊(Chunk)組成的,每個塊包含頭和主體。眾多塊之間是相互嵌套的,即塊是有分層的。通常一個塊會包含下級子塊作為自己的數(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ù),是
30、3DS模型文件導(dǎo)入OpenGL過程的重點(diǎn)研究對象。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)存空間分配
31、后,將每個塊的數(shù)據(jù)分類導(dǎo)入對應(yīng)的定義好的模塊結(jié)構(gòu)體中。直到所有需要的塊讀取完畢后,將每個塊的相關(guān)數(shù)據(jù)生成顯示列表,3DS模型文件導(dǎo)入OpenGL過程結(jié)束。具體過程的流程圖如圖3所示。NY打開3DS文件讀取一個塊讀取一個塊ID分配內(nèi)存空間儲存塊信息生成顯示列表清空這個塊的內(nèi)存空間是否讀取所有塊清空內(nèi)存空間結(jié)束開始圖3. 3DS模型文件導(dǎo)入OpenGL流程圖第四章 飛機(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)行研究和說明。
32、4.1 3D實時仿真顯示應(yīng)用程序的總體設(shè)計在對OpenGL、3DMAX等軟件進(jìn)行研究之后,為了解決如何基于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繪圖的特點(diǎn)和程序整體功能的要求,應(yīng)用程序主要分為創(chuàng)建窗口,程序初始化和模型場景構(gòu)建及
33、運(yùn)動仿真三個模塊。對三個模塊分別進(jìn)行設(shè)計編輯之后,完成的應(yīng)用程序的流程圖如圖4所示。本章接下來將對三個模塊程序編寫的具體流程和關(guān)鍵的程序代碼進(jìn)行分析,研究整個應(yīng)用程序的實現(xiàn)過程。YNY窗口創(chuàng)建開始初始化OpenGL是否是3ds文件寫入模型文件讀入模型文件模型信息分配模型信息內(nèi)存空間生成模型信息顯示列表顯示姿態(tài)數(shù)據(jù)導(dǎo)入姿態(tài)數(shù)據(jù)設(shè)置視點(diǎn)和光照處理姿態(tài)數(shù)據(jù)遍歷顯示列表繪制飛機(jī)模型OpenGL線程是否結(jié)束清空模型信息顯示列表釋放模型信息內(nèi)存空間結(jié)束圖4. 3D實時仿真顯示程序的總體設(shè)計4.2 創(chuàng)建窗口實時仿真顯示功能的實現(xiàn)首先需要建立一個OpenGL窗口。在本文應(yīng)用程序中通過自行定義的HWND Cre
34、ateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, HINSTANCE hInstance)函數(shù)來創(chuàng)建顯示窗口的。窗口創(chuàng)建程序的流程如圖5所示。最后生成一個初始大小為800×600,名字為“飛機(jī)動態(tài)飛行模擬”的窗口。窗口創(chuàng)建函數(shù)將HWND gl_hWnd設(shè)置為窗口句柄。用WNDCLASS wndclass這個窗口類結(jié)構(gòu)來保存窗口信息,在窗口信息中包含了WndProc函數(shù),用來處理Windows消息及鍵盤響應(yīng)。然后通過RegisterClass(&wndclass)函數(shù)注冊窗口。在設(shè)置完窗
35、口的屬性和大小以后,用CreateWindow()函數(shù)完成窗口的創(chuàng)建。最后用ShowWindow()函數(shù)設(shè)置窗口的顯示狀態(tài)后,返回窗口句柄。WndProc函數(shù)用于處理窗口消息,主要添加的消息主要是兩個部分:第一個部分是用于控制窗口的形狀變化,響應(yīng)窗口右上角的最小化和最大化功能,并且使窗口能夠通過拉伸來調(diào)整大小。第二個部分是用于關(guān)閉窗口的,響應(yīng)窗口右上角的關(guān)閉功能。實際上在本文中關(guān)閉窗口并沒有將OpenGL線程停止,而是調(diào)用ShowWindow(gl_hWnd,SW_HIDE)將窗口隱藏起來。設(shè)置窗口句柄設(shè)置并保存窗口信息響應(yīng)Windows消息拓展窗口風(fēng)格設(shè)置窗口顯示狀態(tài)返回窗口句柄圖5. 創(chuàng)建
36、窗口流程圖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è)置窗口的像素格式,并聲明一個PIXELFORMATDESCRIPTOR的結(jié)構(gòu)體變量用來保存相關(guān)信息。第二步是為OpenGL建立一個圖形操作描述表RC。具體步驟是先用wglCreateCurrent(g_hD
37、C)函數(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)做過具體的分析在這里就不加以贅述。根據(jù)上述原理,在C語言程序中編寫3DS模型文件導(dǎo)入函數(shù)g_Load3ds.Import3DS (&g_3DModel, FILE_NAME)。程序初始化中導(dǎo)入3DS文件的具體過程是首先
38、在程序開頭將飛機(jī)3DS模型文件名"feiji.3DS"定義到FILE_NAME中,然后在Init(HWND gl_hWnd)函數(shù)中調(diào)用導(dǎo)入函數(shù),把3DS文件裝入模型結(jié)構(gòu)體中。獲取窗口客戶區(qū)坐標(biāo)設(shè)置像素格式建立圖形操作描述表RC初始化投影變換導(dǎo)入3DS模型文件圖6. 程序初始化流程圖4.4 模型場景構(gòu)建及運(yùn)動仿真4.4.1 飛機(jī)模型運(yùn)動實時數(shù)據(jù)的獲得和顯示本文的應(yīng)用程序的編寫是應(yīng)用于WDPSS系統(tǒng)控制的飛機(jī)模型試驗中的,該試驗系統(tǒng)樣機(jī)安裝有用于采集飛機(jī)模型試驗位姿系統(tǒng)關(guān)鍵數(shù)據(jù)的傳感器。在實驗過程中通過傳感器采集數(shù)據(jù),進(jìn)行處理后得到飛機(jī)模型運(yùn)動的六個姿態(tài)數(shù)據(jù)(俯仰,滾轉(zhuǎn),偏航的
39、角度以及X,Y,Z軸上的位移)。由于數(shù)據(jù)的采集和處理在原有主程序中已有完整的函數(shù),故而在本文研究的應(yīng)用程序中只需要直接調(diào)用數(shù)據(jù)即可。由于數(shù)據(jù)采集和處理部分不是本文研究的重點(diǎn),所以在此不加以展開。本文研究的課題是“基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示”,接下來對實時性進(jìn)行分析。在仿真顯示的實現(xiàn)過程中,有幾個過程會產(chǎn)生時間上的滯后,分別是數(shù)據(jù)采集過程,數(shù)據(jù)處理過程和OpenGL窗口中飛機(jī)模型繪制過程。所以本文中所指的實時并不是完全意義上的和飛機(jī)模型實體的運(yùn)動同步。但是分別分析幾個過程,其中OpenGL繪圖采用雙緩沖技術(shù),刷新頻率和屏幕的刷新頻率一致,故而滯后時間一般是在0.01s數(shù)量級的
40、。書籍處理過程只有幾個計算函數(shù)和數(shù)據(jù)傳遞,滯后的時間很短。而數(shù)據(jù)的采集的滯后時間也是小于0.01s數(shù)量級的。又由于本實驗創(chuàng)建基于OpenGL的飛機(jī)模型運(yùn)動3D實時仿真顯示窗口的目的只要是觀察飛機(jī)模型運(yùn)動的情況,對于實時性這一指標(biāo)在時間的精確性上要求并不是非常高。故而上述三個過程產(chǎn)生的總的滯后時間用肉眼很難分辨,故而其對實時性的影響在本文研究過程中可以忽略,即能夠本文編寫的OpenGL應(yīng)用程序能達(dá)到本文研究課題對于實時性的要求。OpenGL應(yīng)用程序從主程序中獲得到六個姿態(tài)數(shù)據(jù)以后,使用Win API函數(shù)TextOut()將姿態(tài)數(shù)據(jù)顯示在OpenGL窗口的左上角。使實驗者可以在觀察飛機(jī)模型運(yùn)動動畫
41、的同時,觀察到實時的姿態(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,strlen(str_pitch);SetTextColor(g_hDC,RGB(0,200,0);4.4.2 飛機(jī)模型的繪制在繪制飛機(jī)模型前,首先需要調(diào)用glClear(
42、)函數(shù)對OpenGL進(jìn)行顏色清除以及深度緩沖。然后用glLoadIdentity()函數(shù)設(shè)置單位矩陣,具體作用就是將飛機(jī)模型自身坐標(biāo)系和世界坐標(biāo)系重合。最后使用gluLookAt()函數(shù)設(shè)置觀察視角。在設(shè)置好這些參數(shù)后,就具備了繪制飛機(jī)模型的基本條件。具體飛機(jī)模型場景的繪制有兩個部分。第一部分是使用OpenGL圖形庫提供線繪制函數(shù)glBegin(GL_LINE_LOOP)繪制一個0.82×0.78×1.04的長方體框架(尺寸具體參考已有的WDPSS控制的風(fēng)洞試驗原理樣機(jī)的設(shè)計尺寸1)。具體的思路就是先計算出長方體的八個頂點(diǎn)的坐標(biāo),然后根據(jù)點(diǎn)繪制線,最后通過分別繪制長方體框架
43、的六個面來完成框架的繪制。第二部分是繪制已經(jīng)導(dǎo)入的3DS模型文件中的飛機(jī)模型。繪制的具體方法是遍歷飛機(jī)模型中所有的對象生成的顯示列表(具體生成過程在第三章中有詳細(xì)介紹),將3DS模型文件導(dǎo)入過程中生成的顯示列表里的信息全部顯示出來。在主控制界面調(diào)整飛機(jī)姿態(tài)數(shù)據(jù)后,數(shù)據(jù)傳遞到OpenGL線程后。需要使用位移變化和旋轉(zhuǎn)函數(shù)調(diào)整飛機(jī)模型的位置。由于位移變化和旋轉(zhuǎn)是以世界坐標(biāo)為基準(zhǔn)的,所以在調(diào)用位移和旋轉(zhuǎn)函數(shù)后需要配對調(diào)用glPushMatrix()和glPopMatrix()函數(shù)。這兩個函數(shù)配對調(diào)用在本文應(yīng)用程序中實現(xiàn)的作用是保證下一次調(diào)用位移和旋轉(zhuǎn)函數(shù)時飛機(jī)模型自身坐標(biāo)系和世界坐標(biāo)系重合。具體的程
44、序代碼如下: glTranslatef(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使用率,通過在交換緩沖區(qū)前調(diào)用Sleep(5)函數(shù),使交換緩沖區(qū)過程停滯5毫秒。能夠在不影響視覺效果的情況下降低刷新頻率,從而減低CPU使用
45、率。本文中應(yīng)用程序為避免與主控制界面程序中的定時器發(fā)生沖突,在模型場景構(gòu)建及運(yùn)動仿真部分并未單獨(dú)設(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è)備的屏幕的刷新頻率相同。第五章 成果展示和功能分析本文應(yīng)用程序編寫完成后,生成OpenGL.h和OpenGL.cpp兩個文件,將兩個文件和OpenGL庫文件及頭文件添加到主控制界面程序中。在主控制
46、界面程序中利用多線程技術(shù)創(chuàng)建OpenGL子線程,編譯運(yùn)行通過后,就可以得到主控制界面,如圖7所示,并在主控制界面中找到打開子界面的功能。本章將對生成的OpenGL子界面的打開方法和OpenGL子界面的功能進(jìn)行介紹。圖7. 主控制界面OpenGL子界面的打開是需要通過主控制界面上的功能鍵來實現(xiàn)的。具體操作為鼠標(biāo)左鍵單擊界面左上角工具欄中“窗口”鍵(如圖8所示),將鼠標(biāo)移動到“3D顯示”鍵上,左鍵單擊即可得到OpenGL子界面(如圖9所示)。圖8. 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ù)點(diǎn)后三位。OpenGL子界面窗口中間部分是飛機(jī)模型和外部框架。用于實時顯示飛機(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年教育信息化解決方案銷售與服務(wù)合同模板3篇
- 二零二五版機(jī)動車質(zhì)押典當(dāng)與汽車后市場專業(yè)服務(wù)合同3篇
- 二手車個人買賣合同書樣本版B版
- 2025年度中小企業(yè)創(chuàng)新基金貸款合同簽訂與創(chuàng)業(yè)孵化服務(wù)
- 二零二五年度終止勞動合同員工離職后社會保障待遇合同
- 二零二五年度轉(zhuǎn)租協(xié)議甲乙丙三方及物業(yè)管理服務(wù)合同
- 2025年度退定金協(xié)議:旅游度假村預(yù)訂退訂合同
- 二零二五年度無子女無財產(chǎn)快速離婚協(xié)議指南
- 2025年度魚塘承包經(jīng)營權(quán)變更及合作開發(fā)協(xié)議
- 二零二五年度庭院租賃房屋院落環(huán)保改造合同
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報告
- 【地理】地圖的選擇和應(yīng)用(分層練) 2024-2025學(xué)年七年級地理上冊同步備課系列(人教版)
- (正式版)CB∕T 4552-2024 船舶行業(yè)企業(yè)安全生產(chǎn)文件編制和管理規(guī)定
- JBT 14588-2023 激光加工鏡頭 (正式版)
- 2024年四川省成都市樹德實驗中學(xué)物理八年級下冊期末質(zhì)量檢測試題含解析
- 九型人格與領(lǐng)導(dǎo)力講義
- 廉潔應(yīng)征承諾書
- 2023年四川省成都市中考物理試卷真題(含答案)
- 泵車述職報告
- 2024年山西文旅集團(tuán)招聘筆試參考題庫含答案解析
- 恢復(fù)中華人民共和國國籍申請表
評論
0/150
提交評論