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

下載本文檔

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

文檔簡介

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

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

3、enGL定點數(shù)組的位置和存放格式; 第三步:繪制對象。 前兩步可以看做是初始化過程的一部分,第三步則是顯示回調(diào)函數(shù)的一部分。 OpenGL可以使用6種不同類型的數(shù)組:頂點、顏色、顏色索引、法向、貼圖坐標(biāo)和邊標(biāo)志位。 這6類數(shù)組對應(yīng)于glBegin()和glEnd()之間可以設(shè)置的6類不同數(shù)據(jù)項,而旋轉(zhuǎn)立方體只需要顏色和頂點數(shù)組,并把它們設(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;/頂點數(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ù)調(diào)用激活顏色數(shù)組和頂點數(shù)組:通過函數(shù)調(diào)用激活顏色數(shù)組和頂點數(shù)組: glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);接著說明數(shù)組變量存放格式:接著說明數(shù)組變量存放格式: glVertexPointer(3,GL_FLOAT,0,ve

5、rtices); glColorPointer(3,GL_FLOAT,0,colors); 參數(shù)意義:三維對象的顏色,頂點浮點數(shù)據(jù)參數(shù)意義:三維對象的顏色,頂點浮點數(shù)據(jù)類型,數(shù)據(jù)元素間隔為類型,數(shù)據(jù)元素間隔為0連續(xù)存放,數(shù)組指針連續(xù)存放,數(shù)組指針 必須用自己定義的數(shù)據(jù)類型向openGL提供立方體的頂點與表面之間的關(guān)系,則需要定義一個數(shù)組,保存6個面的24個頂點在定點數(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,4; 即第一個面由索引號為(0,3,2,1)的4 個頂點構(gòu)

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

7、QUADS而不是而不是GL_POLYGON,可以提,可以提高繪制速度,只需要一次函數(shù)調(diào)用:高繪制速度,只需要一次函數(shù)調(diào)用: glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE,cubeIndices); 因為因為GL_QUADS每四個頂點畫一個四邊形每四個頂點畫一個四邊形利用頂點數(shù)組旋轉(zhuǎ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;/立方體的頂點數(shù)組并設(shè)為全局變量立方體的頂點數(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個面的個面的24個頂點在定點數(shù)組里的索引個頂點在定點數(shù)組里的索引號到一個數(shù)組里,或?qū)⒁褂玫捻旤c的序號保存到一個數(shù)組號到一個數(shù)組里,或?qū)⒁褂玫捻旤c的序號保存到一個數(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個角度個角度 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);/觀視點觀視點 glTranslatef(0.0,3.0,0.0);/將立方體平移到(將立方體平移到(0,3,0) glRotatef(theta0,1.0,0.0,0.0);/將物體繞經(jīng)過將物體繞經(jīng)過(1,0,0)的矢量逆的矢量逆時針旋轉(zhuǎn)時針旋轉(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每四個頂點畫一個四邊形每四個頂點畫一個四邊形 glutSwapBuffers();/交換緩存交換緩存 void spinCube()/旋轉(zhuǎn)旋轉(zhuǎn) thetaaxis+=0.01;/空閑回調(diào)函數(shù)每次執(zhí)行時,相應(yīng)旋轉(zhuǎn)軸的空閑回調(diào)函數(shù)每次執(zhí)行時,相應(yīng)旋轉(zhuǎn)軸的旋轉(zhuǎn)角度增加旋轉(zhuǎn)角度增加0.01度度 if(thetaaxis360.0) thetaaxis-=360.0; glutPostRedisplay();/重畫重畫 void mouse

12、(int btn, int state, int x, int y) /鼠標(biāo)回調(diào)函數(shù)用來選擇旋轉(zhuǎn)軸鼠標(biāo)回調(diào)函數(shù)用來選擇旋轉(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)重畫回調(diào)重畫 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);/注冊重畫回調(diào)注冊重畫回調(diào) glutDisplayFunc(display);/三個回調(diào)函數(shù)(顯示回調(diào))三個回調(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)用頂點數(shù)組調(diào)用頂點數(shù)組 glVertexPointer(3,GL_FLOAT,0

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論