指導(dǎo)書之2-3D旋轉(zhuǎn)魔方_第1頁
指導(dǎo)書之2-3D旋轉(zhuǎn)魔方_第2頁
指導(dǎo)書之2-3D旋轉(zhuǎn)魔方_第3頁
指導(dǎo)書之2-3D旋轉(zhuǎn)魔方_第4頁
指導(dǎo)書之2-3D旋轉(zhuǎn)魔方_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、軟件課程設(shè)計指導(dǎo)書系列之二課程設(shè)計指導(dǎo)書基于OpenGL的3D旋轉(zhuǎn)魔方實現(xiàn)指導(dǎo)老師:楊 文 濤 Mail:unxioracle2000Mobile中科技大學(xué)電子科學(xué)與技術(shù)系2011年2月20日14一、課程設(shè)計的目的和意義本課程目的和意義 通過本課程單元的學(xué)習,使學(xué)生對軟件工程項目從整體上有一個較清晰的了解和認識;可以提高學(xué)生的軟件編程能力,培養(yǎng)學(xué)生的計算機編程興趣,培養(yǎng)良好的編程習慣。這對當前推進大學(xué)計算機技術(shù)普及教育,提高大學(xué)生計算機使用水平具有積極的意義。二、課程設(shè)計的要求1. 掌握軟件開發(fā)模式,結(jié)構(gòu)模塊化分析,程序設(shè)計流程;2. 學(xué)會使用當前流行的開發(fā)工具軟件V

2、isual C+6.0,能獨立編制中低難度的應(yīng)用程序軟件;3. 掌握有關(guān)程序設(shè)計思想、數(shù)據(jù)結(jié)構(gòu)定義、常用C語言算法,掌握OpenGL開發(fā);.4. 初步培養(yǎng)需求分析,軟件測試、調(diào)試的能力;.三、 本單元課程設(shè)計描述 基于OpenGL的3D魔方實現(xiàn):在3D空間中實現(xiàn)2X2魔方,各個魔方單元格顯示不同的貼圖,魔方體能在3D空間自由旋轉(zhuǎn)、每層也能旋轉(zhuǎn)。 通過軟件程序來模擬這個實際日常生活中魔方玩具。對于學(xué)有余力的學(xué)生可以嘗試3X3魔方,其成績可適當提高。編程開發(fā)環(huán)境操作系統(tǒng)為Win2000 WinXP;Visual C+ 6.0軟件開發(fā)平臺。 課程設(shè)計所需準備工作l 熟悉Win32應(yīng)用程序開發(fā)框架與實

3、現(xiàn)流程;l 掌握三維立體繪圖基本原理和過程;l 熟悉掌握OpenGL開發(fā)包知識與開發(fā)流程;l 學(xué)習使用OpenGL相關(guān)函數(shù);四、課程設(shè)計內(nèi)容 1.程序設(shè)計與實現(xiàn)1.1 需求分析首先在OpenGL 3D空間中繪制一個Cube,可以直接調(diào)用畫平面的指令,重復(fù)6次,就可以繪制出一個立方體對象。再對對象實現(xiàn)模式變換,既可實現(xiàn)物體的旋轉(zhuǎn)。采用貼圖技術(shù),可以將一幅畫貼在某個平面上,因而可以得到包含圖片的立方體。1、一個包含貼圖立方體的旋轉(zhuǎn)在繪制單個立方體的基礎(chǔ)上,可以繪制多個立方體(2X2),將著8個小立方體按照一定的相對位置組合,形成一個2X2的立體魔方。2、2X2 三維魔方旋轉(zhuǎn)1.2 功能模塊分析根據(jù)

4、以上需求分析,可將本程序劃分為以下幾個子功能模塊:l Win32應(yīng)用框架WinMain函數(shù)入口,各個參數(shù)含義。如何構(gòu)建Windows窗體,Windows消息循環(huán)機制和消息處理。l 魔方體的空間建模定義數(shù)據(jù)結(jié)構(gòu),確定一個立方體和魔方的幾何模型:立方體頂點空間坐標、每個立方體的相對位置、旋轉(zhuǎn)平面。 l 魔方體旋轉(zhuǎn)在定時器控制下,實現(xiàn)魔方體整體旋轉(zhuǎn)、單元立方體旋轉(zhuǎn),模擬實際中魔方體各種變換。 l OpenGL繪圖OpenGL繪圖原理和過程,掌握計算機3D繪圖、OpenGL基礎(chǔ)知識。1.3 程序分析與實現(xiàn) 依照上面劃分功能模塊,分析各模塊是如何實現(xiàn)的。1.3.1 Windows窗口顯示 (1) Win

5、Main主函數(shù) WinMain主函數(shù)是所有Win32程序的入口點。在WinMain函數(shù)里實現(xiàn)Window是窗體的建立和消息循環(huán),在消息循環(huán)中實現(xiàn)鍵盤、鼠標輸入事件處理響應(yīng),具體內(nèi)容可參考VC程序參考手冊。在本課程程序中,不僅要創(chuàng)建Window窗體,而且構(gòu)建OpenGL設(shè)備繪圖環(huán)境。Window窗體創(chuàng)建步驟:l 窗體類注冊:RegisterClassl 設(shè)置顯示分辨率:ChangeDisplaySettingsl 設(shè)置窗體大?。篈djustWindowRectExl 創(chuàng)建窗體:CreateWindowExOpenGL繪圖環(huán)境搭建:l 獲取設(shè)備繪圖環(huán)境(DC,DeviceContext):hDC=

6、GetDC(hWnd)l 選擇繪圖環(huán)境像素格式:ChoosePixelFormat(hDC,&pfd),其中pfd為像素格式描述符,如果設(shè)置不對,OpenGL繪圖失敗,看不到正確的顯示結(jié)果。l 設(shè)置繪圖環(huán)境像素格式:SetPixelFormat(hDC,PixelFormat,&pfd)l 獲取OpenGL繪圖環(huán)境:hRC =wglCreateContext(hDC)l 設(shè)置OpenGL繪圖環(huán)境:wglMakeCurrent(hDC,hRC)1.3.2 三維建模首先確定一個立方體A各個頂點空間坐標,并對8個頂點編號,四個頂點確定一個平面。目的是便于按照OpenGL規(guī)則繪制面片和

7、貼圖處理。對應(yīng)的數(shù)據(jù)結(jié)構(gòu)定義如下。typedef struct GLfloat p3;stPoint; /一個頂點的定義其它立方體Ci的空間坐標可以通過對A復(fù)制并且平移某個單元整數(shù)Nx,y,zstatic stPoint CubePoint8= -1.0f, -1.0f, 1.0f, /0 - 1.0f, -1.0f, 1.0f , /1 1.0f, 1.0f, 1.0f , /2 -1.0f, 1.0f, 1.0f, /3-1.0f, -1.0f, -1.0f,/4 -1.0f, 1.0f, -1.0f,/51.0f, 1.0f, -1.0f,/6 -1.0f, -1.0f, -1.0f,/

8、7 ;一個立方體由8個點組成,8個點組成6個面片,對立方體的幾何操作本質(zhì)上就是對這6個平面的操作(繪制、紋理、旋轉(zhuǎn)和平移等)。點的索引號確定后,每個面片也就確定了,如0,1,2,3四個點構(gòu)成Z向正投影面。3、一個立方體幾何建模一個立方體可由如下結(jié)構(gòu)體定義:typedef struct stPoint CubePoint8; /構(gòu)成一個立方體的8個頂點stCube;stCube Cube8;/8個立方體構(gòu)成一個魔方體8個立方體構(gòu)成2X2魔方矩陣,對每個立方體進行編號i。魔方體某層的旋轉(zhuǎn)是基于選中的四個立方體繞魔方體的中心軸變化的。由此定義魔方體每個層面包含的子立方體集合初始索引編號(const

9、目的是在程序運行中不可更改):const BYTE SZM4 = 0,1,2,3; /Z正向的四個子立方體編號const BYTE SZP4 = 4,5,6,7; / Z負向的四個子立方體編號const BYTE SYM4 = 0,1,5,4; / Y負向的四個子立方體編號const BYTE SYP4 = 2,3,6,7; / Y正向的四個子立方體編號const BYTE SXM4 = 1,2,6,5; / X正向的四個子立方體編號const BYTE SXP4 = 0,3,7,4; / X負向的四個子立方體編號為了便于運算,同時定義了一個靜態(tài)魔方立方體,stCube Static_Cube

10、8它相對于運動的stCube Cube8其子立方的頂點位置、索引號都是固定不變的,作為運動魔方體Cube基準參考。預(yù)定義好這些層面目的是確定好旋轉(zhuǎn)前后各個子立方體的相對位置。4、魔方體的構(gòu)成為了記錄魔方體旋轉(zhuǎn)之后各子立方的絕對位置,為此專門定義了同上類似的數(shù)組結(jié)構(gòu)(開始時,與初始值一樣):BYTE ZP 4 = 0,1,2,3; /z-direction plus BYTE ZM 4 = 4,5,6,7; /z-direction minusBYTE YM4 = 0,1,5,4; /y-direction minusBYTE YP4 = 2,3,7,6; /z-direction plusBY

11、TE XM4 = 1,2,6,5; /x-direction minusBYTE XP4 = 0,3,7,4; /x-direction plus同時定義了一個靜態(tài)魔方立方體,它們記錄魔方體旋轉(zhuǎn)更新之后,各層面內(nèi)實際包含小立方體的索引號。如圖4中,繞+Z軸逆時針旋轉(zhuǎn)90°,各層面對應(yīng)的子立方索引更新為:ZP 4 = 0,1,2,3; /+Z directionZM 4 = 4,5,6,7; /-Z direction YM4 = 2,1,6,7; /+Y direction minusYP4 = 3,0,5,4; /-Y direction plusXM4 = 3,4,7,2; /-

12、Xdirection minusXP4 = 0,5,6,1; /+Xdirection plus5、繞+Z軸旋轉(zhuǎn)90°后各層面子立方體變化綜上所述,魔方體幾何位置旋轉(zhuǎn)本質(zhì)上就是就是同步更新各層面內(nèi)的小立方的索引表。1.3.3 模型旋轉(zhuǎn)立方體在空間的旋轉(zhuǎn),歸根到底是其頂點的旋轉(zhuǎn),如空間點(x, y, z)繞Z軸旋轉(zhuǎn)a對應(yīng)的旋轉(zhuǎn)矩陣:cosa sina-sina cosa一個立方體pCube繞Z軸旋轉(zhuǎn)a后對應(yīng)的坐標變化為:for( int i=0;i<8;i+) float x,y; x= pCube->CubePointi.p0; y= pCube->CubePoin

13、ti.p1; pCube->CubePointi.p0 = x*cosa - y*sina; pCube->CubePointi.p1 = x*sina + y*cosa;其它軸的旋轉(zhuǎn)類似。由于魔方體層面的旋轉(zhuǎn)是90°,在某個層面內(nèi)一個子立方體Ci會被另外一個Cj完全替換,因此旋轉(zhuǎn)后必須同步更新魔方體Cube各層面內(nèi)包含的子立方的索引號。為了簡化算法,只需查找旋轉(zhuǎn)后Cubei在Static_Cube中對應(yīng)的小立方編號j與i的位置匹配。for( i=0;i<8;i+) /旋轉(zhuǎn)后ZM層面的子立方搜索實現(xiàn)成員更新 for( j=0;j<4;j+) if( is_eq

14、ual( &Cubei, &Static_Cube SZMj ) ) ZMk+ = i; 上述代碼is_equal是判斷旋轉(zhuǎn)后的魔方體Cube的那些子立方Cubei與靜態(tài)的魔方體Static_Cube的SZM層面內(nèi)的子立方重合,找出之后作為ZM的新成員。最終能找到4個子立方作為新成員。其它層面的如ZP、XP、XM、YP、YM處理與之類似。1.3.4 OpenGL圖形繪制在OpenGL中有畫點、線、面的指令函數(shù)。在本應(yīng)用課程程序中,需要繪制立方體體的每個面片,使用GL_QUADS繪圖指令,同時設(shè)置紋理坐標,完成表面的貼圖。繪制一個立方體的函數(shù)如下。void DrawObject(

15、int ID)stPoint *CubePoint = CubeID.CubePoint;glBegin(GL_QUADS);/ Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint1.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint3.p);/ Back Facegl

16、TexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint7.p);/ Top FaceglTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 0.0f); g

17、lVertex3fv( CubePoint3.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);/ Bottom FaceglTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1

18、.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);/ Right faceglTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1.p);/ Left FaceglTexCoo

19、rd2f(0.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint3.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glEnd();其中g(shù)lBegin(GL_QUADS)發(fā)布四邊形繪圖指令,glTexCoord2f指定平面紋理坐標,glVertex3fv是四邊形的頂點坐標。glEnd()結(jié)束當前幾何體繪圖。

20、每個函數(shù)使用可查看MSDN手冊。 1.5 OpenGL開發(fā)進階OpenGL是為Open Graphics Library的簡稱,它是3D繪圖工業(yè)標準,廣泛地應(yīng)用于計算機3D繪圖領(lǐng)域,它是個專業(yè)的開放的3D程序接口,是一個功能強大,調(diào)用方便的底層3D圖形庫;它獨立于視窗操作系統(tǒng)或其它操作系統(tǒng)的,亦是網(wǎng)絡(luò)透明的。在包含CAD、內(nèi)容創(chuàng)作、能源、娛樂、游戲開發(fā)、制造業(yè)、制藥業(yè)及虛擬現(xiàn)實等行業(yè)領(lǐng)域中,OpenGL幫助程序員實現(xiàn)在 PC、工作站、超級計算機等硬件設(shè)備上的高性能、極具沖擊力的高視覺表現(xiàn)力圖形處理軟件的開發(fā)。OpenGL是一個開放的三維圖形軟件包,它獨立于窗口系統(tǒng)和操作系統(tǒng),以它為基礎(chǔ)開發(fā)的應(yīng)

21、用程序可以十分方便地在各種平臺間移植;OpenGL可以與Visual C+緊密接口,Windows下3D程序開發(fā);OpenGL使用簡便,效率高。它具有七大功能: 1.建模:OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數(shù)外,還提供了復(fù)雜的三維物體(球、錐、多面體、茶壺等)以及復(fù)雜曲線和曲面繪制函數(shù)。 2.變換:OpenGL圖形庫的變換包括基本變換和投影變換?;咀儞Q有平移、旋轉(zhuǎn)、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投 影兩種變換。其變換方法有利于減少算法的運行時間,提高三維圖形的顯示速度。 3.顏色模式設(shè)置:OpenGL顏色模式有兩種,即RGBA模式和顏色索引(C

22、olor Index)。 4.光照和材質(zhì)設(shè)置:OpenGL光有輻射光(Emitted Light)、環(huán)境光(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質(zhì)是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質(zhì)紅綠藍分量的反射率相乘后形成的顏色。 5:紋理映射(Texture Mapping)。利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節(jié)。 6:位圖顯示和圖象增強圖象功能除了基本的拷貝和像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊

23、圖象效果處理。以上三條可使被仿真物更具真實感,增強圖形顯示的效果。 7:雙緩存動畫(Double Buffering)雙緩存即前臺緩存和后臺緩存,簡言之,后臺緩存計算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。要掌握OpenGL程序開發(fā)不是一個簡單過程,需要由淺入深逐步進行?;赩isual C+6.0開發(fā)過程:l 建立基于OpenGL的應(yīng)用程序框架Win32 ;l 創(chuàng)建項目:在file -> New->Projects中建立項目,基于Win32 Application ,輸入工程名;l 添加庫:在project->Setting中添加庫: opengl32.lib g

24、lu32.lib glaux.lib;具體實現(xiàn)可參考例子Magic2D.dsw。1.6 本單元課程設(shè)計作業(yè)要求(1)在窗體顯示“學(xué)生姓名、班級、學(xué)號”的消息框,程序標題顯示學(xué)生姓名。(2)立方體貼圖顯示本人圖片(256X256 BMP圖片格式,否則不能正常顯示)。(3)讀Magic2D例子代碼,在此基礎(chǔ)上可適當改進(也可重新編寫新的算法),優(yōu)化算法流程結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),關(guān)鍵函數(shù)重新改寫,要求函數(shù)名、數(shù)據(jù)、實現(xiàn)過程不得與范例子源碼程序Magic2D相同。(4) 學(xué)生提供的代碼與報告嚴禁與示范例子源碼抄襲和本文檔,如果發(fā)現(xiàn)雷同,成績考核為0;(5) 學(xué)生提供的源碼需要有注釋說明:介紹函數(shù)功能、參數(shù)和

25、返回值;2、階段性考核辦法2.1 前期工作(30%)學(xué)習Visual C+ 6.0開發(fā)環(huán)境,熟悉掌握Win32 Application開發(fā)流程,熟悉OpenGL基本知識,掌握OpenGL開發(fā)包的原理、規(guī)范、重要函數(shù)使用和程序開發(fā)流程。在讀懂例子程序Magic2D基礎(chǔ)上能編寫最簡單OpenGL程序。掌握 glViewport(0,0,width,height);/ Reset The Current ViewportglMatrixMode(GL_PROJECTION);/ Select The Projection MatrixglLoadIdentity();/ Reset The Proj

26、ection Matrix/ Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);/ Select The Modelview MatrixglLoadIdentity();等函數(shù)的使用、目的等。最后提交階段性工作報告。報告內(nèi)容規(guī)范: 本軟件課程設(shè)計的目的、意義,背景知識介紹; 總結(jié)VC、OpenGL程序開發(fā)方法、流程,心得體會,解決了什么問題、未確定的問題;提交報告要求:l 每個人一

27、份紙質(zhì)報告,每人報告各不相同,嚴禁抄襲,如審核發(fā)現(xiàn),兩人的成績都記為0。l 第五周星期三,過期不予受理,沒有任何理由, 總成績的30%被扣除。l 報告里面不能粘貼復(fù)制本指導(dǎo)l 書的相關(guān)文字或圖片,也不能從網(wǎng)上拷貝,必須是用自己話語編寫而成的。l 報告可以寫偽代碼描述算法流程,但不能粘貼源碼濫竽充數(shù),如發(fā)現(xiàn)將嚴厲扣分。 2.2中期工作(30%) 編寫調(diào)試一個立方體旋轉(zhuǎn)的程序,要求掌握如下開發(fā)技巧: 1、OpenGL貼圖技術(shù)原理與函數(shù)實現(xiàn): 掌握glTexCoord2f、glGenTextures、glBindTexture、glTexImage2D、glTexParameteri等函數(shù)用法; 2、掌握Win32程序消息循環(huán)機制,消息函數(shù)、鍵盤鼠標輸入處理; 了解函數(shù)的PeekMessage、TranslateMessage、DispatchMessage使用和鍵盤虛碼值;WndProc函數(shù)工作; 3、掌握Win32程序中定時器函數(shù)處理及如何實現(xiàn)旋轉(zhuǎn)動畫; Set

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論