openGL利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體以及程序_第1頁(yè)
openGL利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體以及程序_第2頁(yè)
openGL利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體以及程序_第3頁(yè)
openGL利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體以及程序_第4頁(yè)
openGL利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體以及程序_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體 1、先利用頂點(diǎn)列表創(chuàng)建一個(gè)立方體模型: 頂點(diǎn)數(shù)組可以把對(duì)象的繪制信息封裝在一個(gè)包含數(shù)據(jù)結(jié)構(gòu)里,只要幾次函數(shù)調(diào)用就可以繪制多面體對(duì)象。因?yàn)閛penGL允許定義包含頂點(diǎn)信息的數(shù)據(jù)結(jié)構(gòu)(數(shù)組),我們只需要向openGL發(fā)出請(qǐng)求,openGL只需通過(guò)幾次函數(shù)調(diào)用就可以遍歷整個(gè)數(shù)據(jù)結(jié)構(gòu)。 為了繪制六個(gè)正方形,需要為每個(gè)正方形為了繪制六個(gè)正方形,需要為每個(gè)正方形指定四個(gè)頂點(diǎn),最終需要指定指定四個(gè)頂點(diǎn),最終需要指定6*4=24個(gè)頂個(gè)頂點(diǎn)。但一個(gè)立方體其實(shí)總共只有八個(gè)頂點(diǎn),點(diǎn)。但一個(gè)立方體其實(shí)總共只有八個(gè)頂點(diǎn),要指定要指定24次,就意味著每個(gè)頂點(diǎn)其實(shí)重復(fù)次,就意味著每個(gè)頂點(diǎn)其實(shí)重復(fù)使用

2、了三次,像這樣重復(fù)煩瑣的代碼,稍使用了三次,像這樣重復(fù)煩瑣的代碼,稍有不慎,即使相同的頂點(diǎn)也可能被指定成有不慎,即使相同的頂點(diǎn)也可能被指定成不同的頂點(diǎn)了。不同的頂點(diǎn)了。 如果我們定義一個(gè)數(shù)組,把八個(gè)頂點(diǎn)都放如果我們定義一個(gè)數(shù)組,把八個(gè)頂點(diǎn)都放到數(shù)組里,然后每次指定頂點(diǎn)都使用指針,到數(shù)組里,然后每次指定頂點(diǎn)都使用指針,而不是使用直接的數(shù)據(jù),這樣就避免了在而不是使用直接的數(shù)據(jù),這樣就避免了在指定頂點(diǎn)時(shí)考慮大量的數(shù)據(jù),于是減少了指定頂點(diǎn)時(shí)考慮大量的數(shù)據(jù),于是減少了代碼出錯(cuò)的可能性。代碼出錯(cuò)的可能性。 2、使用頂點(diǎn)數(shù)組的三個(gè)步驟:、使用頂點(diǎn)數(shù)組的三個(gè)步驟: 第一步:激活頂點(diǎn)數(shù)組功能; 第二步:告訴op

3、enGL定點(diǎn)數(shù)組的位置和存放格式; 第三步:繪制對(duì)象。 前兩步可以看做是初始化過(guò)程的一部分,第三步則是顯示回調(diào)函數(shù)的一部分。 OpenGL可以使用6種不同類(lèi)型的數(shù)組:頂點(diǎn)、顏色、顏色索引、法向、貼圖坐標(biāo)和邊標(biāo)志位。 這6類(lèi)數(shù)組對(duì)應(yīng)于glBegin()和glEnd()之間可以設(shè)置的6類(lèi)不同數(shù)據(jù)項(xiàng),而旋轉(zhuǎn)立方體只需要顏色和頂點(diǎn)數(shù)組,并把它們?cè)O(shè)為全局變量。 GLfloat vertices=-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0

4、,1.0,1.0;/頂點(diǎn)數(shù)組 GLfloatcolors=0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0, 1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0;/顏色數(shù)組通過(guò)函數(shù)調(diào)用激活顏色數(shù)組和頂點(diǎn)數(shù)組:通過(guò)函數(shù)調(diào)用激活顏色數(shù)組和頂點(diǎn)數(shù)組: glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);接著說(shuō)明數(shù)組變量存放格式:接著說(shuō)明數(shù)組變量存放格式: glVertexPointer(3,GL_FLOAT,0,ve

5、rtices); glColorPointer(3,GL_FLOAT,0,colors); 參數(shù)意義:三維對(duì)象的顏色,頂點(diǎn)浮點(diǎn)數(shù)據(jù)參數(shù)意義:三維對(duì)象的顏色,頂點(diǎn)浮點(diǎn)數(shù)據(jù)類(lèi)型,數(shù)據(jù)元素間隔為類(lèi)型,數(shù)據(jù)元素間隔為0連續(xù)存放,數(shù)組指針連續(xù)存放,數(shù)組指針 必須用自己定義的數(shù)據(jù)類(lèi)型向openGL提供立方體的頂點(diǎn)與表面之間的關(guān)系,則需要定義一個(gè)數(shù)組,保存6個(gè)面的24個(gè)頂點(diǎn)在定點(diǎn)數(shù)組里的索引號(hào),并將這個(gè)數(shù)組定義為全局變量:GLubytecubeIndices=0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4; 即第一個(gè)面由索引號(hào)為(0,3,2,1)的4 個(gè)頂點(diǎn)構(gòu)

6、成,第二個(gè)面由索引號(hào)為(2,3,7,6)4個(gè)頂點(diǎn)構(gòu)成,以此類(lèi)推。 要注意:頂點(diǎn)的次序必須符合多邊形外側(cè)面要求。 在顯示回調(diào)函數(shù)里在顯示回調(diào)函數(shù)里6次調(diào)用次調(diào)用glDraw Elements()函數(shù),每次繪制一個(gè)表面:函數(shù),每次繪制一個(gè)表面: for(i=0;i=6;i+) glDrawElement(GL_POLYGON,4, GL_UNSIGNED_BYTE,&cubeIndices4*i); 當(dāng)定義好數(shù)組并已經(jīng)初始化頂點(diǎn)數(shù)組,每次繪制立當(dāng)定義好數(shù)組并已經(jīng)初始化頂點(diǎn)數(shù)組,每次繪制立方體只需要方體只需要6次函數(shù)調(diào)用。如果每個(gè)面都是四邊形,次函數(shù)調(diào)用。如果每個(gè)面都是四邊形,采用采用GL_

7、QUADS而不是而不是GL_POLYGON,可以提,可以提高繪制速度,只需要一次函數(shù)調(diào)用:高繪制速度,只需要一次函數(shù)調(diào)用: glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE,cubeIndices); 因?yàn)橐驗(yàn)镚L_QUADS每四個(gè)頂點(diǎn)畫(huà)一個(gè)四邊形每四個(gè)頂點(diǎn)畫(huà)一個(gè)四邊形利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體程序:利用頂點(diǎn)數(shù)組旋轉(zhuǎn)立方體程序: #include #include #include #include #include #include GLfloat vertices=-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0,

8、-1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0;/立方體的頂點(diǎn)數(shù)組并設(shè)為全局變量立方體的頂點(diǎn)數(shù)組并設(shè)為全局變量 GLfloatcolors=0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0;/顏色顏色數(shù)組并設(shè)為全局變量數(shù)組并設(shè)為全局變量 GLubytecubeIndices=0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5

9、,4; /保存保存6個(gè)面的個(gè)面的24個(gè)頂點(diǎn)在定點(diǎn)數(shù)組里的索引個(gè)頂點(diǎn)在定點(diǎn)數(shù)組里的索引號(hào)到一個(gè)數(shù)組里,或?qū)⒁褂玫捻旤c(diǎn)的序號(hào)保存到一個(gè)數(shù)組號(hào)到一個(gè)數(shù)組里,或?qū)⒁褂玫捻旤c(diǎn)的序號(hào)保存到一個(gè)數(shù)組里面里面 static GLfloat theta=0.0,0.0,0.0;/繪制立方體繪制立方體 static GLint axis=2; void display(void) /display()函數(shù)利用鼠標(biāo)回調(diào)函數(shù)確定函數(shù)利用鼠標(biāo)回調(diào)函數(shù)確定3個(gè)角度個(gè)角度 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();/初始化,

10、清空幀緩存和深度緩存初始化,清空幀緩存和深度緩存 gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);/觀視點(diǎn)觀視點(diǎn) glTranslatef(0.0,3.0,0.0);/將立方體平移到(將立方體平移到(0,3,0) glRotatef(theta0,1.0,0.0,0.0);/將物體繞經(jīng)過(guò)將物體繞經(jīng)過(guò)(1,0,0)的矢量逆的矢量逆時(shí)針旋轉(zhuǎn)時(shí)針旋轉(zhuǎn)theta的角度的角度 glRotatef(theta1,0.0,1.0,0.0); glRotatef(theta2,0.0,0.0,1.0); glColorPointer(3,GL_FLOAT,0,co

11、lors); glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,cubeIndices);/函數(shù)調(diào)用,函數(shù)調(diào)用,GL_QUADS每四個(gè)頂點(diǎn)畫(huà)一個(gè)四邊形每四個(gè)頂點(diǎn)畫(huà)一個(gè)四邊形 glutSwapBuffers();/交換緩存交換緩存 void spinCube()/旋轉(zhuǎn)旋轉(zhuǎn) thetaaxis+=0.01;/空閑回調(diào)函數(shù)每次執(zhí)行時(shí),相應(yīng)旋轉(zhuǎn)軸的空閑回調(diào)函數(shù)每次執(zhí)行時(shí),相應(yīng)旋轉(zhuǎn)軸的旋轉(zhuǎn)角度增加旋轉(zhuǎn)角度增加0.01度度 if(thetaaxis360.0) thetaaxis-=360.0; glutPostRedisplay();/重畫(huà)重畫(huà) void mouse

12、(int btn, int state, int x, int y) /鼠標(biāo)回調(diào)函數(shù)用來(lái)選擇旋轉(zhuǎn)軸鼠標(biāo)回調(diào)函數(shù)用來(lái)選擇旋轉(zhuǎn)軸if(btn=GLUT_LEFT_BUTTON & state=GLUT_DOWN)axis=0;if(btn=GLUT_MIDDLE_BUTTON & state=GLUT_DOWN)axis=1;if(btn=GLUT_RIGHT_BUTTON & state=GLUT_DOWN)axis=2; /回調(diào)重畫(huà)回調(diào)重畫(huà) void myReshape(int w, int h) void myReshape(int w, int h) glViewp

13、ort(0, 0, w, h);/定義三維觀視體定義三維觀視體 glMatrixMode(GL_PROJECTION);/投影模式投影模式 glLoadIdentity();/初始化初始化 if (w = h) glOrtho(-4.0, 4.0, -3.0 * (GLfloat) h / (GLfloat) w, 5.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-4.0 * (GLfloat) w / (GLfloat) h, 4.0 * (GLfloat) w / (GLfloat) h, -3.0, 5.0, -10

14、.0, 10.0); glMatrixMode(GL_MODELVIEW);/模型觀視矩陣模型觀視矩陣 void key(unsigned char k,int x,int y) if(k=1)glutIdleFunc(spinCube);if(k=2)glutIdleFunc(NULL);if(k=q)exit(0); void main(int argc, char *argv)/主函數(shù)主函數(shù) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);/設(shè)置模式設(shè)置模式 glutI

15、nitWindowSize(500, 500);/窗口大小窗口大小 glutCreateWindow(colorcube); glutReshapeFunc(myReshape);/注冊(cè)重畫(huà)回調(diào)注冊(cè)重畫(huà)回調(diào) glutDisplayFunc(display);/三個(gè)回調(diào)函數(shù)(顯示回調(diào))三個(gè)回調(diào)函數(shù)(顯示回調(diào)) glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST);/啟用隱藏啟用隱藏-面面-消去消去 glEnableClientState(GL_COLOR_ARRAY);/調(diào)調(diào)用顏色數(shù)組用顏色數(shù)組 glEnableClientState(GL_VERTEX_ARRAY);/調(diào)用頂點(diǎn)數(shù)組調(diào)用頂點(diǎn)數(shù)組 glVertexPointer(3,GL_FLOAT,0

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論