計(jì)算機(jī)專業(yè)課程設(shè)計(jì)OPENGL旋轉(zhuǎn)立方體_第1頁
計(jì)算機(jī)專業(yè)課程設(shè)計(jì)OPENGL旋轉(zhuǎn)立方體_第2頁
計(jì)算機(jī)專業(yè)課程設(shè)計(jì)OPENGL旋轉(zhuǎn)立方體_第3頁
計(jì)算機(jī)專業(yè)課程設(shè)計(jì)OPENGL旋轉(zhuǎn)立方體_第4頁
計(jì)算機(jī)專業(yè)課程設(shè)計(jì)OPENGL旋轉(zhuǎn)立方體_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、西安文理學(xué)院計(jì)算機(jī)科學(xué)系課程設(shè)計(jì)報告設(shè)計(jì)名稱:軟件課程設(shè)計(jì)設(shè)計(jì)題目:旋轉(zhuǎn)立方體的設(shè)計(jì)學(xué)生學(xué)號:專業(yè)班級:學(xué)生姓名:學(xué)生成績:指導(dǎo)教師(職稱):課題工作時間:2010.5.31至2010.6.11說明:1、報告中的任務(wù)書、進(jìn)度表由指導(dǎo)教師在課程設(shè)計(jì)開始前填寫并發(fā)給每個學(xué)生;四、五兩項(xiàng)(中英文摘要)由學(xué)生在完成綜合設(shè)計(jì)后填寫。2、學(xué)生成績由指導(dǎo)教師根據(jù)學(xué)生的設(shè)計(jì)情況給出各項(xiàng)分值及總評成績。3、指導(dǎo)教師評語一欄由指導(dǎo)教師就學(xué)生在整個設(shè)計(jì)期間的平時表現(xiàn)、設(shè)計(jì)完成情況、報告的質(zhì)量及答辯情況,給出客觀、全面的評價。4、所有學(xué)生必須參加課程設(shè)計(jì)的答辯環(huán)節(jié),凡不參加答辯者,其成績一律按不及格處理。答辯小組成員

2、應(yīng)由2人及以上教師組成。5、報告正文字?jǐn)?shù)一般應(yīng)不少于3000字,也可由指導(dǎo)教師根據(jù)本門綜合設(shè)計(jì)的情況另行規(guī)定。6、平時表現(xiàn)成績低于6分的學(xué)生,取消答辯資格,其本項(xiàng)綜合設(shè)計(jì)成績按不及格處理。計(jì)算機(jī)科學(xué)系課程設(shè)計(jì)任務(wù)書學(xué)生姓業(yè)2008級軟件工程2班名士批J號班級設(shè)計(jì)題目旋轉(zhuǎn)立方體的設(shè)計(jì)內(nèi)容概要:畫出一個正方體,并將它旋轉(zhuǎn)起來文獻(xiàn)資料:1 .譚浩強(qiáng)C程序設(shè)計(jì)(M)(第三版)清華大學(xué)出版社20102 .嚴(yán)蔚敏.吳偉民數(shù)據(jù)Z勾M高等教育20043 .錢能C+程序設(shè)計(jì)教程(M)(第二版)清華大學(xué)出版社20094 .鄭麗VisualBasic程序設(shè)計(jì)清華大學(xué)出版社2009-10-2

3、9設(shè)計(jì)要求:1 .用C/C+或VB實(shí)現(xiàn);2 .友好性:界面要友好;3 .可讀性:源程序代碼清晰、有層次;4 .當(dāng)鼠標(biāo)離屏幕中心的位置遠(yuǎn)近可以決定立方體旋轉(zhuǎn)速度的快慢。工作期限:設(shè)計(jì)工作自2010年5月31日至2010年6月11日止。計(jì)算機(jī)科學(xué)系課程設(shè)計(jì)進(jìn)度安排表專業(yè):軟件工程姓名:王雅寧學(xué)號期內(nèi)容備注5月31日6月1日分析題目,查閱相關(guān)資料6月2日6月3日擬定整體方案,編寫程序6月4日6月6日程序編寫6月7日6月8日調(diào)試程序6月9日6月10日整理報告6月11日6月11日答辯月日月日月日月日月日月日月日月日月日月日月日月日月日月日月日月日月日月日指導(dǎo)教師簽名:指導(dǎo)教師評

4、語指導(dǎo)教師:(簽字)日期:2010年6月10日答辯記錄表學(xué)生姓名:學(xué)號:班級:答辯地點(diǎn):答辯內(nèi)容記錄:答解成績合計(jì)分值各項(xiàng)分值評分標(biāo)準(zhǔn)實(shí)際得分合計(jì)得分備注2510在規(guī)定時間內(nèi)能就所設(shè)計(jì)的內(nèi)容進(jìn)行闡述,言簡意明,重點(diǎn)突出,論點(diǎn)止確,條理清晰。15在規(guī)定時間內(nèi)能準(zhǔn)確、完整、流利地回答教師所提出的問題。答辯小組成員(簽字):成績評定表學(xué)生姓名:學(xué)號:班級:類別合計(jì)分值各項(xiàng)分值評分標(biāo)準(zhǔn)實(shí)際得分合計(jì)得分備注平時表現(xiàn)1010按時參加設(shè)計(jì)指導(dǎo),無違反紀(jì)律情況。完成情況3020按設(shè)計(jì)任務(wù)書的要求完成了全部任務(wù),能完整演示其設(shè)計(jì)內(nèi)容,符合要求。10能對其設(shè)計(jì)內(nèi)容進(jìn)行詳細(xì)、完整的介紹,并能就指導(dǎo)教師提出的問題進(jìn)行

5、止確的回答。報告質(zhì)量3510報告文字通順,內(nèi)容翔實(shí),論述充分、完整,立論止確,結(jié)構(gòu)嚴(yán)謹(jǐn)合理;才給字?jǐn)?shù)符合相關(guān)要求,工整規(guī)范,整齊劃一。5課題背景介紹清楚,綜述分析充分。5設(shè)計(jì)方案合理、可行,論證嚴(yán)謹(jǐn),邏輯性強(qiáng),具有說服力。5符號統(tǒng)一;圖表完備、符合規(guī)范要求。5能對整個設(shè)計(jì)過程進(jìn)行全面的總結(jié),得出有價值的結(jié)論或結(jié)果。5參考文獻(xiàn)數(shù)量在2篇以上,格式符合要求,在正文中止確引用。答辯情況2510在規(guī)定時間內(nèi)能就所設(shè)計(jì)的內(nèi)容進(jìn)行闡述,言簡意明,重點(diǎn)突出,論點(diǎn)止確,條理清晰。15在規(guī)定時間內(nèi)能準(zhǔn)確、完整、流利地回答教師所提出的問題。總評成績:分指導(dǎo)教師:(簽字)日期:2010年6月15日摘要軟件工程專業(yè)經(jīng)

6、過兩年的課程學(xué)習(xí),已經(jīng)積累了相關(guān)高級語言程序設(shè)計(jì)的基本知識。畫出正方體并使之旋轉(zhuǎn),這一題目考察了程序設(shè)計(jì)自頂而下、逐步細(xì)化的相關(guān)基本思想。題目難點(diǎn)在于實(shí)現(xiàn)可視化界面的交互、以及圖像的旋轉(zhuǎn)過程。分析題目可以得出程序可以大致分為兩個方面的內(nèi)容:1 .畫出一個正方體。2 .使正方體旋轉(zhuǎn)起來。經(jīng)過查找相關(guān)資料,本程序采用功能強(qiáng)大的圖形庫OPENGL并調(diào)用一系列WINDOWSAPI采用C/C+語言在MicrosoftVisualC+6.0環(huán)境下編寫。很好的解決了用C/C+編寫圖形界面的難點(diǎn)問題。通過Win32平臺的OPENGLAPI實(shí)現(xiàn)了逼真的三維旋轉(zhuǎn)效果關(guān)鍵詞:正方體;旋轉(zhuǎn);可視化;OPENGLAbs

7、tractSoftwareEngineeringaftertwoyearscourseofstudy,hasaccumulatedarelevanthigh-levellanguageprogrammingbasics.Drawthecubeandmakeitspin,thissubjectexaminesthedesigntop-downprocess,graduallyrefiningthebasicidearelated.Subjectdifficultyistoachieveinteractivevisualinterface,andimagerotationprocess.Analy

8、sisprocedurescanbedrawnsubjectcanbebroadlydividedintotwoaspects:1.Drawacube.2.2.Tomakeacubespin.Afterfindrelevantinformation,thisprogramfeaturesapowerfulgraphicslibraryOPENGLandcallaWINDOWSAPIusingC/C+languageinMicrosoftVisualC+6.0environmentpreparation.GoodsolutionusingC/C+graphicalinterfacewritten

9、anddifficultproblems.OPENGLAPIthroughtheWin32platformtoachievearealisticthree-dimensionalrotationeffectKeywords:cube;spin;visual;OpenGL目錄目錄I第一章課題背景21.1 引言21.1.1 背景及目的21.2 題目概述21.2.1 問題及技術(shù)要求21.2.2 理論依據(jù)及工作內(nèi)容2第二章設(shè)計(jì)簡介及設(shè)計(jì)方案論述34.1 設(shè)計(jì)簡介34.2 OPENGL圖形庫簡介34 OPENGL歷史簡介34 OPENGL特點(diǎn)34 OPENGL工作順序44.3 OPENGL簡單編程方法4

10、4 OPENGL基本語法44 OPENGL狀態(tài)機(jī)制44 OPENGL基本結(jié)構(gòu)54.4 程序所使用的OPENGL庫函數(shù)54.5 OPENGL及WINDOWS坐標(biāo)系64.6 WINDOWS下配置OPENGL環(huán)境74.7 WINDOWS消息機(jī)制74.8 大體設(shè)計(jì)方案8第三章詳細(xì)設(shè)計(jì)101 OPENGL的繪制工作101.2 OPENGL的初始化工作101.2 OPENGL的主體繪制工作101 鼠標(biāo)控制正方體的旋轉(zhuǎn)111 重置OPENGL窗口121 WINDOWS中OPENGL窗體設(shè)置及創(chuàng)建121 完成WINDOWS主程序13第四章設(shè)計(jì)結(jié)果及分析141 設(shè)計(jì)結(jié)果分析141 進(jìn)一步美化程序14總結(jié)15致謝

11、16參考文獻(xiàn)17第一章課題背景引言隨著專業(yè)課程學(xué)習(xí)的深入,相關(guān)高級語言程序設(shè)計(jì)的知識已經(jīng)有所積累,如何更好的掌握并應(yīng)用已經(jīng)成為當(dāng)務(wù)之急。通過軟件工程課程設(shè)計(jì)的過程能夠?qū)W習(xí)程序設(shè)計(jì)的基本思想以及整體流程。背景及目的基本高級語言程序設(shè)計(jì)以及相關(guān)專業(yè)基礎(chǔ)課程已經(jīng)學(xué)習(xí)完畢,在學(xué)習(xí)過程中遇到的一些難點(diǎn)問題,為了綜合以前學(xué)過的課程知識并融會貫通。可以通過課程設(shè)計(jì)的獨(dú)立完成來通過相關(guān)途徑解決,從而能夠更好的掌握程序設(shè)計(jì)的思想,提升編程能力。題目概述問題及技術(shù)要求本題:畫出一個正方體,并將它旋轉(zhuǎn)起來。主要應(yīng)實(shí)現(xiàn)以下4點(diǎn)基本要求:.用C/C+或VB實(shí)現(xiàn);.友好性:界面要友好;.可讀性:源程序代碼清晰、有層次;.

12、當(dāng)鼠標(biāo)離屏幕中心的位置遠(yuǎn)近可以決定立方體旋轉(zhuǎn)速度的快慢。理論依據(jù)及工作內(nèi)容題目難點(diǎn)在于實(shí)現(xiàn)可視化界面的交互、以及圖像的旋轉(zhuǎn)過程。分析題目可以得出程序可以大致分為兩個方面的工作內(nèi)容:1.畫出一個正方體。2.使正方體旋轉(zhuǎn)起來。通過在互聯(lián)網(wǎng)上查找資料,我決定使用OPENGL圖形庫來解決C/C+編寫圖形界面困難的問題。第二章設(shè)計(jì)簡介及設(shè)計(jì)方案論述設(shè)計(jì)簡介為了實(shí)現(xiàn)本程序的兩大功能,計(jì)劃采用OPENGL圖形庫并調(diào)用一系列WINDOWSAPI采用C/C+語言編寫。首先,應(yīng)熟悉OPENGL在WIN32平臺下的相關(guān)API,以及其余WINDOWS窗口交互的相關(guān)接口方法,來構(gòu)建窗口的內(nèi)容。其次,熟悉了解OPENGL

13、庫函數(shù)在窗體中實(shí)現(xiàn)繪圖(既繪制正方體),實(shí)現(xiàn)正方體旋轉(zhuǎn)功能的相關(guān)函數(shù)。最后,實(shí)現(xiàn)OPENGL與WINDOWS的交互的過程,完成程序及注釋。OPENGL圖形庫簡介OPENGL歷史簡介OpenGL是SGI(SiliconGraphicsInc.)公司對IRISGL進(jìn)行改進(jìn),擴(kuò)展可移植性,形成的一個跨平臺開放式圖形編程接口,利用它可以很方便地開發(fā)出有多種特殊視覺效果(如光照、紋理、透明、陰影)的三維圖形。由于OpenGL采用類似C語言的語法,所以對于學(xué)過C語言的人來說使用起來特別方便。OPENGL特點(diǎn)從程序開發(fā)人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述二維和

14、三維幾何物體,并控制這些物體按某種方式繪制到顯示緩沖區(qū)中。OpenGL的API集合提供了物體描述、平移、旋轉(zhuǎn)、縮放、光照、紋理、材質(zhì)、象素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發(fā)二、三維圖形程序所需的各個方面。與一般的圖形開發(fā)工具相比,OpenGL具有以下幾個突出特點(diǎn):(1)應(yīng)用廣泛(2)跨平臺性(3)高質(zhì)量和高性能(4)出色的編程特性(5)網(wǎng)絡(luò)透明性O(shè)PENGL工作順序OpenGL的工作順序就是一個從定義幾何要素到把象素段寫入幀緩沖區(qū)的過程。在屏幕上顯示圖象的主要步驟是以下3步:1)構(gòu)造幾何要素(點(diǎn)、線、多邊形、圖像、位圖),創(chuàng)建對象的數(shù)學(xué)描述。在三維空間放置對象,選擇

15、有利的觀察點(diǎn)。2)計(jì)算對象的顏色,這些顏色可能直接定義,或由光照條件及紋理問接給出03)光柵化,把對象的數(shù)學(xué)描述和顏色信息轉(zhuǎn)換到屏幕的象素。OPENGL簡單編程方法OPENGL基本語法OpenGL基本函數(shù)均使用gl作為函數(shù)名的前綴,如glClearC010r();實(shí)用函數(shù)則使用glu作為函數(shù)名的前綴,如gluSphere(OpenGL基本常量的名字以GL_開頭,如GL_LINE_LOOP;實(shí)用常量的名字以GLU_開頭,如GLU_FILL。一些函數(shù)如glColor*()(定義顏色值),函數(shù)名后可以叁不同的后綴以工持不同的數(shù)據(jù)類型和格式。如glColor3b(,卜glColor3d(,卜glCol

16、or3f(,)和glColor3bv(,)等,這幾個函數(shù)在功能上是相似的,只是適用于不同的數(shù)據(jù)類型和格式,其中3表示該函數(shù)帶有三個參數(shù),b、d、f分別表示參數(shù)的類型是字節(jié)型、雙精度浮點(diǎn)型和單精度浮點(diǎn)型,v則表示這些參數(shù)是以向量(數(shù)組)形式出現(xiàn)的。OpenGL還定義了一些特殊的類型名,如GLfloat,GLvoid。它們其實(shí)就是C中的float和void。在gl.h文件中可以看至1j以下定義:typedeffloatGLfloat;typedefvoidGLvoid;,一些基本的數(shù)據(jù)類型都有類似的定義OPENGL狀態(tài)機(jī)制OpenGL的工作方式是一種狀態(tài)機(jī)制,它可以進(jìn)行各種狀態(tài)或模式設(shè)置,這些狀態(tài)

17、或模式在重新改變它們之前一直有效。例如,當(dāng)前顏色就是一個狀態(tài)變量,在這個狀態(tài)改變之前,繪制的每個象素都將使用該顏色,直到當(dāng)前顏色被設(shè)置為其它顏色為止。OpenGL中大量地使用了這種狀態(tài)機(jī)制,如顏色模式、投影模式、單雙顯示緩存區(qū)的設(shè)置、背景色的設(shè)置、光源的位置和特性等等。OPENGL基本結(jié)構(gòu)OpenGL程序的基本結(jié)構(gòu)可分為三個部分:第一部分是初始化部分,主要是設(shè)置一些OpenGL的狀態(tài)開關(guān),如顏色模式(RGBA或ALPHA等)的選擇,是否作光照處理(若有的話,還需設(shè)置光源的特性),深度檢驗(yàn),裁剪等等。這些狀態(tài)一般都用函數(shù)glEnable(),glDisable()來設(shè)置,()中為相應(yīng)的狀態(tài)。第二

18、部分設(shè)置觀察坐標(biāo)系下的取景模式和取景框位置及大小。主要利用了三個函數(shù):.函數(shù)voidglViewport(left,top,right,bottom):設(shè)置在屏幕上的窗口大小,四個參數(shù)描述屏幕窗口四個邊界坐標(biāo)(以象素表示);.函數(shù)voidglOrtho(left,right,bottom,top,near,far):設(shè)置投影方式為正交投影(平行投影),其取景體積(觀察體)是一個各面均為矩形的六面體;.函數(shù)voidgluPerspective(fovy,aspect,zNear,zFar)設(shè)置投影方式為透視投影,其取景體積(觀察體)是一個截頭錐體(棱臺),在這個體積內(nèi)的物體投影到錐體的頂點(diǎn)。第三

19、部分是OpenGL的主要部分,使用OpenGL的庫函數(shù)構(gòu)造幾何物體對象的數(shù)學(xué)描述,包括點(diǎn)線面的位置和拓?fù)潢P(guān)系,幾何變換,光照處理等.4程序所使用的OPENGL庫函數(shù)1.OpenGL函數(shù)庫分為以下幾類:(1)OpenGL核心庫:gl115個函數(shù)(2)OpenGL編程輔助庫:aux31個函數(shù)(3)OpenGL實(shí)用程序工具包(OpenGLutilitytoolkit,GLUT):glut30多個函數(shù)Windows專用庫:wgl6個函數(shù)(5)OpenGL實(shí)用庫(GLU)利用較低層OpenGL命令編寫一些執(zhí)行特殊任務(wù)的例程,如紋理映射、坐標(biāo)變換、NURBS曲線曲面等。GLU庫函數(shù)前綴都用glu。(6)O

20、penGL的XWindow系統(tǒng)擴(kuò)充(GLX)在使用XWindow系統(tǒng)的機(jī)器上,提供一種建立OpenGL現(xiàn)場(context),并把它與可繪(drawable)窗口關(guān)聯(lián)起來的方法。GLX作為OpenGL的附件提供。GLX庫函數(shù)前綴為glxoOpenGLProgrammingGuide輔助庫(AuxiliaryLibrary)這個庫建立了一系列簡單而又較完整的編程例子,例如初始化窗口、監(jiān)控輸入,以及繪制一些三維幾何體等函數(shù)。輔助庫函數(shù)用前綴aux。在Windows95/98中,相關(guān)的庫以動態(tài)鏈接庫的形式存在,opengl32.lib、glu32.lib、glaux.lib分別表示OpenGL庫,實(shí)

21、用庫和輔助庫,和它們相應(yīng)的頭文件是gl.h、glu.h及glaux.h。2.基本常用函數(shù)初始化(glutInit)創(chuàng)建窗口(glutCreateWindow)設(shè)定窗口的顯示模式(glutInitDisplayMode)指定窗口的位置和大小(glutInitWindowPosition和glutInitWindowSize)指定窗口的顯示內(nèi)容函數(shù)(glutDisplayFunc)運(yùn)行框架(glutMainLoop)刷新窗口的緩沖區(qū)glClear(GL_COLOR_BUFFER_BIT);設(shè)定投影參數(shù)(將三M形投影初顯示窗仃)glMatrixMode(GL_PROJECTION);2.5OPENG

22、L及WINDOWS坐標(biāo)系OPENGL的三維坐標(biāo)系如圖2-1所示:XOY平面為屏幕所在EhlX圖2-1OPENGL三維坐標(biāo)系WINDOWS的窗體坐標(biāo)如圖2-2所示:國_,,日圖2-2WINDOWS窗體二維坐標(biāo)系WINDOWS下配置OPENGL環(huán)境第一步:選擇一個編譯環(huán)境現(xiàn)在Windows系統(tǒng)的主流編譯環(huán)境有VisualStudio,BrolandC+Builder,Dev-C+等,它們都是支持OpenGL的。但這里我選擇VC+6.0作為OpenGL的環(huán)境。第二步:安裝GLUT工具包GLUT不是OpenGL所必須的,但它會給我們的學(xué)習(xí)帶來一定的方便,推薦安裝。Windows環(huán)境下的GLUT下載地址

23、:(大小約為150k)/resources/libraries/glut/glutdlls37beta.zipWindows環(huán)境下安裝GLUT的步驟:1、將下載的壓縮包解開,將得到5個文件2、以我的安裝目錄為例:“d:ProgramFilesMicrosoftVisualStudioVC98includeGL文件夾”。把解壓得到的glut.h放到這個GL文件夾里。沒有GL文件夾可以自己建一個,一般都有的?!癲:ProgramFilesMicrosoftVisualStudioVC98lib文件夾”。把解壓得到的glut.lib和glut32.lib放到靜

24、態(tài)函數(shù)庫所在文件夾,即lib文件夾。(3)把解壓得到的glut.dll和glut32.dll放到操作系統(tǒng)目錄下面的system32文件夾內(nèi)。(典型的位置為:C:WindowsSystem32)這是非常重要的動態(tài)鏈接庫設(shè)置!WINDOWS消息機(jī)制消息機(jī)制是Windows應(yīng)用程序的核心,在Windows中發(fā)生的一切都可以用消息來表示,消息用于告訴操作系統(tǒng)發(fā)生了什么,所有的Windows應(yīng)用程序都是消息驅(qū)動的,除了WM_COMMAND消息,所有以WM_為前綴的消息都是標(biāo)準(zhǔn)的Windows消息,如窗口、鼠標(biāo)移動、窗口大小改變等,程序啟動或退出甚至每一段固定的時間都會產(chǎn)生標(biāo)準(zhǔn)Windows消息。Wind

25、ows消息控制中心一般是三層結(jié)構(gòu),其頂端就是Windows內(nèi)核。Windows內(nèi)核維護(hù)著一個消息隊(duì)列,第二級控制中心從這個消息隊(duì)列中獲取屬于自己管轄的消息,后做出處理,有些消息直接處理掉,有些還要發(fā)送給下一級窗體(Window)或控件(Control)。第二級控制中心一般是各Windows應(yīng)用程序的Application對象。第三級控制中心就是Windows窗體對象,每一個窗體都有一個默認(rèn)的窗體過程,這個過程負(fù)責(zé)處理各種接收到的消息。1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時系統(tǒng)都會發(fā)送消息到某一個窗口

26、。例如當(dāng)菜單轉(zhuǎn)中之后會有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam)是命令的ID號,對菜單來講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,也可以利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。2、誰將收到消息:一個消息必須由一個窗口接收。在窗口的過程(WNDPROC)中可以對消息進(jìn)行分析,對自己感興趣的消息進(jìn)行處理。例如你希望對菜單選擇進(jìn)行處理那么你可以定義對WM_COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對WM_PAINT進(jìn)行處理。3、未處理的消息到那里去了:M$為窗口編寫了默認(rèn)的窗口過程,這個窗口過程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@

27、個默認(rèn)窗口過程我們才可以利用Windows的窗口進(jìn)行開發(fā)而不必過多關(guān)注窗口各種消息的處理。例如窗口在被拖動時會有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。4、窗口句柄:說到消息就不能不說窗口句柄,系統(tǒng)通過窗口句柄來在整個系統(tǒng)中唯一標(biāo)識一個窗口,發(fā)送一個消息時必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口過程,所以用戶的輸入就會被正確的處理。例如有兩個窗口共用一個窗口過程代碼,你在窗口一上按下鼠標(biāo)時消息就會通過窗口一的句柄被發(fā)送到窗口一而不是窗口二。一個消息從產(chǎn)生到被一個窗口響應(yīng),其中有5個步驟:1)系統(tǒng)中發(fā)生了某個事件。Windows把這個事件翻譯為消息,然

28、后把它放到消息隊(duì)列中。3)應(yīng)用程序從消息隊(duì)列中接收到這個消息,把它存放在TMsg記錄中。4)應(yīng)用程序把消息傳遞給一個適當(dāng)?shù)拇翱诘拇翱谶^程。5)窗口過程響應(yīng)這個消息并進(jìn)行處理。步驟3和4構(gòu)成了應(yīng)用程序的消息循環(huán)。消息循環(huán)往往是Windows應(yīng)用程序的核心,因?yàn)橄⒀h(huán)使一個應(yīng)用程序能夠響應(yīng)外部的事件。消息循環(huán)的任務(wù)就是從消息隊(duì)列中檢索消息,然后把消息傳遞給適當(dāng)?shù)拇翱?。如果消息?duì)列中沒有消息,Windows就允許其他應(yīng)用程序處理它們的消息。Windows操作系統(tǒng)最大的特點(diǎn)就是其圖形化的操作界面,其圖形化界面是建立在其消息處理機(jī)制這個基礎(chǔ)之上的大體設(shè)計(jì)方案綜上所述,在本程序中。首先使用相關(guān)的WIND

29、OWSAPI創(chuàng)建窗口,其次實(shí)現(xiàn)程序的相應(yīng)功能:.使用OPENGL相應(yīng)庫函數(shù)畫出正方體。.使之旋轉(zhuǎn)起來。.在窗體中響應(yīng)鼠標(biāo)事件,控制正方體的旋轉(zhuǎn)。程序流程圖如圖2-3所示:圖2-3程序流程圖程序的大體內(nèi)容以及機(jī)構(gòu)已經(jīng)構(gòu)造成型,功能部分還需要進(jìn)一步的細(xì)化。顯然在消息循環(huán)中的內(nèi)容還遠(yuǎn)不止這些,還需加入響應(yīng)以下事件:.當(dāng)窗口大小發(fā)生變化時,重置窗口。.響應(yīng)鼠標(biāo)事件,并改變相對應(yīng)的參數(shù)值,來改變旋轉(zhuǎn)速度。.響應(yīng)窗口中斷事件,如關(guān)閉事件、屏保事件。第三章詳細(xì)設(shè)計(jì)OPENGL的繪制工作上一章我們提到完成OPENGL的繪制工作主有兩個主要方面的工作需要完成:.OPENGL的初始化。.OPENGL的繪制工作,其

30、中包括了是正方體旋轉(zhuǎn)。以下我們分別來完成。.1.1OPENGL的初始化工作通過查找資料OPENG的初始化工作由如下庫函數(shù)過程來完成glShadeModel(GL_SMOOTH);/啟用陰影平滑啟用smoothshading(陰影平滑)。陰影平滑通過多邊形精細(xì)的混合色彩,并對外部先進(jìn)行平滑。glClearC010r(0.0f,0.0f,0.0f,0.5f);/黑色背景色彩值的范圍從0.0f到1.0f。0.0f代表最黑的情況,1.0f就是最亮的情況。glClearC010r后的第一個參數(shù)是RedIntensity(紅色分量),第二個是綠色,第三個是藍(lán)色。最大值也是1.0f,代表特定顏色分量的最亮情

31、況。接下來的三個函數(shù)必須做的是關(guān)于depthbuffer(深度緩存)的。將深度緩存設(shè)想為屏幕后面的層。深度緩存不斷的對物體進(jìn)入屏幕內(nèi)部有多深進(jìn)行跟蹤。我們本節(jié)的程序其實(shí)沒有真正使用深度緩存,但幾乎所有在屏幕上顯示3D場景OpenGL程序都使用深度緩存。它的排序決定那個物體先畫。這樣您就不會將一個圓形后面的正方形畫到圓形上來。深度緩存是OpenGLf分重要的部分。glClearDepth(1.0f);/設(shè)置深度緩存glEnable(GL_DEPTH_TEST);/啟用深度測試glDepthFunc(GL_LEQUAL);/所作深度測試的類型接下來是透視圖修飾使透視圖好看些:glHint(GL_P

32、ERSPECTIVE_CORRECTION_HINT,GL_NICEST);/真正精細(xì)的透視修正.1.2OPENGL的主體繪制工作首先使用glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT1除屏幕和深度緩存然后使用glLoadIdentity();重置當(dāng)前的模型觀察矩陣,確定繪制好圖形的位置glTranslatef(0.0f,0.0f,z);移入屏幕z個單位。函數(shù)glTranslatef(x,y,z)作用為沿著X,Y和Z軸移動;現(xiàn)在是本程序中最重要的語句:glRotatef(angle,0.0f,0.0f,0.0f),其中angle為每次旋轉(zhuǎn)的角度,

33、之后分別是XYZ三個軸的旋轉(zhuǎn)分量,這三個旋轉(zhuǎn)分量構(gòu)成了三維坐標(biāo)軸中的旋轉(zhuǎn)法向量。glBegin(GL_QUADS);開始繪制四邊形(使用每4個連續(xù)的頂點(diǎn)定義一個四邊形的填充圖元-GL_QUANS)開始繪制頂點(diǎn):前面glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);/紋理和四邊形的左下glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);/紋理和四邊形的glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);/紋理和四邊形的右上glTexCoor

34、d2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);/紋理和四邊形的左上紋理的相關(guān)的內(nèi)容在后面再介紹,先在正方體的前面已經(jīng)繪制好了,接下來依次繪制:后面,頂面,底面,右面,左面并以glEnd();結(jié)束鼠標(biāo)控制正方體的旋轉(zhuǎn)上面我們介紹到旋轉(zhuǎn)函數(shù)的作用,來解決程序是要使正方體旋轉(zhuǎn)起來的問題,程序還有一個要求就是,當(dāng)鼠標(biāo)離屏幕中心越來越遠(yuǎn)時,正方體旋轉(zhuǎn)速度加快。我們可以在WINDOWS消息響應(yīng)中加入鼠標(biāo)事件,獲取當(dāng)前鼠標(biāo)位置。caseWM_MOUSEMOVE:(intmousex=LOWORD(lParam);得到鼠標(biāo)的x方向分量intmousey=HIWORD(l

35、Param);得到鼠標(biāo)的y方向分量m_mousex=mousey-m_height/2;控制增加正方體繞y軸的旋轉(zhuǎn)分量m_mousey=mousex-m_width/2;控制增加正方體繞x軸的旋轉(zhuǎn)分量return0;)m_mousex,m_mousey為控制旋轉(zhuǎn)的全局變量。重置OPENGL窗口下面的代碼的作用是重新設(shè)置OpenGLg景的大小,而不管窗口的大小是否已經(jīng)改變(假定您沒有使用全屏模式)。甚至您無法改變窗口的大小時(例如您在全屏模式下),它至少仍將運(yùn)行一次-在程序開始時設(shè)置我們的透視圖。OpenG場景的尺寸將被設(shè)置成它顯示時所在窗口的大小。GLvoidReSizeGLScene(GLs

36、izeiwidth,GLsizeiheight)/重置OpenG向口大小if(height=0)/防止被零除height=1;/將Height設(shè)為1glViewport(0,0,width,height);/重置當(dāng)前的視I下面幾行為透視圖設(shè)置屏幕。意味著越遠(yuǎn)的東西看起來越小。這么做創(chuàng)建了一個現(xiàn)實(shí)外觀的場景。此處透視按照基于窗口寬度和高度的45度視角來計(jì)算。0.1f,100.0f是我們在場景中所能繪制深度的起點(diǎn)和終點(diǎn)。glMatrixMode(GL_PROJECTION指明接下來的兩行代碼將影響projectionmatrix(投影矩陣)。投影矩陣負(fù)責(zé)為我們的場景增加透視。glLoadIdent

37、ity()近似于重置。它將所選的矩陣狀態(tài)恢復(fù)成其原始狀態(tài)。調(diào)用glLoadIdentity()之后我們?yōu)閳鼍霸O(shè)置透視圖。glMatrixMode(GL_MODELVIEW旨明任何新的變換將會影響modelviewmatrix(模型觀察如陣)。模型觀察矩陣中存放了我們的物體訊息。最后我們重置模型觀察矩陣glMatrixMode(GL_PROJECTION);/選擇投影矩陣glLoadIdentity();/重置投影矩陣/設(shè)置視口的大小gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);/選擇模型觀察矩陣/重置模型觀察矩

38、陣glMatrixMode(GL_MODELVIEW);glLoadIdentity();WINDOWS中OPENGL窗體設(shè)置及倉I建WINDOWSOPENG的窗體的設(shè)置及創(chuàng)建主要有以下幾個大的方面,其中具體細(xì)節(jié)不再闡述:.相關(guān)變量的設(shè)置/窗口著色描述表句/OpenGL渲染描述表/保存我們的窗口句/保存程序的實(shí)例HGLRChRC=NULL;柄HDChDC=NULL;句柄HWNDhWnd=NULL;柄HINSTANCEhInstance;第一行設(shè)置的變量是RenderingContext(著色描述表)。每一個OpenGL都被連接到一個著色描述表上。著色描述表將所看的OpenGL調(diào)用命令連點(diǎn)到De

39、viceContext(設(shè)備描述表)上。我將OpenGL勺著色描述表定義為hRC。要讓您的程序能夠繪制窗口的話,還需要創(chuàng)建一個設(shè)備描述表,也就是第二行的內(nèi)容。Windows的設(shè)備描述表被定義為hDC。DC將窗口連接到GDI(GraphicsDeviceInterface圖形設(shè)備接口)。而RC將OpenGL!接到DC第三行的變量hWnd將保存由Windows給我們的窗口指派的句柄。最后,第四行為我們的程序創(chuàng)建了一個Instance(實(shí)例)。.取得窗口實(shí)例,定義窗口類并注冊.創(chuàng)建窗口并檢查窗口是否成功創(chuàng)建。我們將傳遞CreateWindowEx()所需的所有參數(shù)。如擴(kuò)展風(fēng)格、類名字(與您在注冊窗口

40、類時所用的名字相同)、窗口標(biāo)題、窗體風(fēng)格、窗體的左上角坐標(biāo)(0,0是個安全的選擇)、窗體的寬和高。我們沒有父窗口,也不想要菜單,這些參數(shù)被設(shè)為NULL還傳遞了窗口的實(shí)例,最后一個參數(shù)被設(shè)為NULL.OPENGL供了有限數(shù)量的像素模式,它包括的屬性有顏色模式,深度緩沖區(qū),等等內(nèi)容。像素模式與渲染窗口、設(shè)備環(huán)境、以及所支持的數(shù)據(jù)類型相關(guān)聯(lián)。在創(chuàng)建一個渲染環(huán)境之前,必須使用一種適當(dāng)?shù)南袼馗袷?,既PIXELFORMATDESCRIPT進(jìn)行設(shè)置.創(chuàng)建窗口成功并響應(yīng)相應(yīng)的事件。如重置窗口大小和推出。之后將它設(shè)為前端窗口(給它更高的優(yōu)先級),并將焦點(diǎn)移至此窗口。然后調(diào)用ReSizeGLScene將屏幕的寬度

41、和高度設(shè)置給透視OpenGLW幕。.5完成WINDOWS主程序創(chuàng)建WINDOWS主程序,首先創(chuàng)建OPENGL窗口,并等待消息。其次響應(yīng)一系列的鼠標(biāo)事件,和鍵盤事件。最后銷毀窗口,結(jié)束程序。其中的細(xì)節(jié)問題不再闡述,見附錄中的完整代碼。第四章設(shè)計(jì)結(jié)果及分析設(shè)計(jì)結(jié)果分析程序解決了老師提出的問題及相關(guān)的要求,能夠用鼠標(biāo)控制正方體的旋轉(zhuǎn)速度,以及旋轉(zhuǎn)方向。大致取得了滿意的結(jié)果。體現(xiàn)出了OPENGL圖形庫的易用性與強(qiáng)大的圖形設(shè)計(jì)功能,而且十分容易上手學(xué)習(xí)使用。通過這次設(shè)計(jì),掌握了以下幾大方面的內(nèi)容:WINDOWS消息消息機(jī)制。OPENGL庫的調(diào)用方法,以及使用OPENG創(chuàng)建窗口與WINDOWS的交互過OP

42、ENGL繪制圖形的基本過程。進(jìn)一步美化程序?yàn)榱艘徊棵阑绦蚪缑?,在OPENGL的學(xué)習(xí)過程中發(fā)現(xiàn),可以使用紋理映射來更加真實(shí)的表現(xiàn)三維場景。于是見3.1.1OPENGL的主題繪制中的紋理映射的相關(guān)代碼。用一句話來說,紋理映射就是將圖像貼到多邊形的表面,從而表現(xiàn)出真實(shí)效果的一種技術(shù)。本程序中的具體實(shí)現(xiàn)只是比較簡單的紋理映射。大家比較熟悉的CS游戲中的紋理映射就制造出了相當(dāng)逼真的槍戰(zhàn)效果。這里限于篇幅不再闡述,本程序相關(guān)內(nèi)容詳見附錄中代碼??偨Y(jié)軟件工程專業(yè)經(jīng)過兩年的課程學(xué)習(xí),已經(jīng)積累了相關(guān)高級語言程序設(shè)計(jì)的基本知識。在學(xué)習(xí)了這么多的專業(yè)課程之后,如何體現(xiàn)本專業(yè)的實(shí)用性(在以后的學(xué)習(xí)和生活中,如何能夠

43、更好的應(yīng)用所學(xué)的內(nèi)容)成為我一直在思考的問題。通過本次課程設(shè)計(jì):畫出正方體并使之旋轉(zhuǎn)這一題目,這一題目考察了程序設(shè)計(jì)自頂而下、逐步細(xì)化的相關(guān)基本思想。開始題目要求使用C/C+或者VB語言來設(shè)計(jì),為了克服并解決C/C+編寫圖新界面困難的問題,我查閱了相關(guān)資料。開始決定使用WINDOWS相關(guān)API來編寫,但是看到復(fù)雜難以上手的API及MFC時,于是決定使用時下流行的OPENGL圖形庫來解決程序的核心問題。這就很好的體現(xiàn)了知識的實(shí)用性原則。在以后的日子中可能很長一段時間里,OPENGL還不會從歷史舞臺退去。微軟依舊會在主流編程平臺上提供對OPENGL的支持。OPENGL結(jié)合WINDOWS并使用C/C

44、+語言來渲染可視化平面或立體程序的辦法,依舊不失為一個好的途徑。致謝首先特別感謝孫少波老師,在一開始就為我們提供的使用OPENGL圖形庫的思路,其次感謝雷偉軍老師的悉心指導(dǎo)以及張紅祥老師對于WINDOWS坐標(biāo)系的講解。最后感謝本小組成員之間的通力合作,程序相關(guān)的代碼是與鄧楠軼同學(xué)共同探討完成的,在此也特別感謝。參考文獻(xiàn).譚浩強(qiáng)C程序設(shè)計(jì)(M)(第三版)清華大學(xué)出版社2010.嚴(yán)蔚敏.吳偉民數(shù)據(jù)Z勾M高等教育2004.錢能C+程序設(shè)計(jì)教程(M)(第二版)清華大學(xué)出版社20092005.EdwardAngelOPENEL程序設(shè)計(jì)指南(M)(第二版)清華大學(xué)出版社/Windows的頭文件包含Open

45、Ga用庫輔助庫/窗口著色描述表句/OpenGL渲染描述表/保存我們的窗口句/保存程序的實(shí)例boolkeys256;boolactive=TRUE;為TRUEfloatm_mousex;軸距離floatm_mousey;的y軸距離floatm_width;floatm_height;/保存鍵盤按鍵的數(shù)組/窗口的活動標(biāo)志,缺省/距離屏幕中心的x/距離屏幕中心GLfloatxrot;GLfloatyrot;GLfloatz=-5.0f;GLuintfilter;GLuinttexture1;AUX_RGBImageRec*LoadBMP(char*Filename)象/X軸旋轉(zhuǎn)量/Y軸旋轉(zhuǎn)量/深入屏

46、幕的距離/濾波類型/紋理的儲存/載入位圖圖(FILE*File=NULL;/文件句柄if(Filename)(/確保文件名已提供returnNULL;/如果沒提供,返回NULL附錄主要程序代碼:#include#include/#include#include/OpenGL#pragmacomment(lib,glaux.lib)HGLRChRC=NULL;柄HDChDC=NULL;句柄HWNDhWnd=NULL;柄HINSTANCEhInstance;)File=fopen(Filename,r);if(File)/(fclose(File);returnauxDIBImageLoad(Fi

47、lename);I)returnNULL;)intLoadGLTextures()(intStatus=FALSE;AUX_RGBImageRec*TextureImage1;儲空間memset(TextureImage,0,sizeof(void*)*1);NULL/嘗試打開文件文件存在么?/關(guān)閉句柄/載入位圖并返/如果載入失敗,返回NULL/載入位圖并轉(zhuǎn)換成紋理/狀態(tài)指示器/創(chuàng)建紋理的存/將指針設(shè)為/載入位圖,檢查有錯,或位圖不存在的話退出if(TextureImage0=LoadBMP(pic1.bmp)(Status=TRUE;/狀態(tài)設(shè)為TRUEglGenTextures(1,&tex

48、ture0);/創(chuàng)建紋理/使用來自位圖數(shù)據(jù)生成的典型紋理glBindTexture(GL_TEXTURE_2D,texture0);/生成紋理glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/線形濾波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG

49、_FILTER,GL_LINEAR);/線形濾波)if(TextureImage0)(if(TextureImage0-data)(/紋理是否存在/紋理圖像是否存在/釋放紋理圖像free(TextureImage0-data);占用的內(nèi)存)/釋放圖像結(jié)構(gòu)/返回Status變量free(TextureImage0);)returnStatus;)LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/WndProc的定義GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)/重置OpenG向口大小if(height

50、=0)height=1;)glViewport(0,0,width,height);口m_width=width;m_height=height;glMatrixMode(GL_PROJECTION);glLoadIdentity();/防止被零除/將Height設(shè)為1/重置當(dāng)前的視/選擇投影矩陣/重置投影矩陣/設(shè)置視口的大小gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();)intInitGL(GLvoid)所有設(shè)置if(!L

51、oadGLTextures()程returnFALSE;)glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glClearColor(0.0f,0.0f,0.0f,0.5f);glClearDepth(1.0f);/選擇模型觀察矩陣/重置模型觀察矩陣/此處開始對OpenGLS行/調(diào)用紋理載入子例/如果未能載入,返回FALSE/啟用紋理映射/啟用陰影平滑/黑色背景/設(shè)置深度緩存glEnable(GL_DEPTH_TEST);/啟用深度測試glDepthFunc(GL_LEQUAL);/所作深度測試的類型glHint(GL_PERSPECTIVE_CO

52、RRECTION_HINT,GL_NICEST);/真正精細(xì)的透視修正returnTRUE;/初始化OKintDrawGLScene(GLvoid)/從這里開始進(jìn)行所有的繪制glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/清除屏幕和深度緩%glLoadIdentity();/重置當(dāng)前的模型觀察矩陣glTranslatef(0.0f,0.0f,z);/移入屏幕z個單位glRotatef(xrot,1.0f,0.0f,0.0f);/繞X軸旋轉(zhuǎn)glRotatef(yrot,0.0f,1.0f,0.0f);/繞Y軸旋轉(zhuǎn)glBindTexture(GL

53、_TEXTURE_2D,texture0);/選擇紋理glBegin(GL_QUADS);/開始繪制四邊形(使用每4個連續(xù)的頂點(diǎn)定義一個四邊形的填充圖元-GL_QUANS)/前面glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);/紋理和四邊形的左下glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);/紋理和四邊形的右下glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);/紋理和四邊形的右上glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);/紋理和四邊形的左上/后面glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);/紋理和四邊形的右下glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);/紋理和四邊形的右上glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);/紋理和四邊形的

溫馨提示

  • 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

提交評論