![實驗三 幾何圖形變換實驗_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/26/1c1fbb8f-41e3-459a-99fb-9119cb04b802/1c1fbb8f-41e3-459a-99fb-9119cb04b8021.gif)
![實驗三 幾何圖形變換實驗_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/26/1c1fbb8f-41e3-459a-99fb-9119cb04b802/1c1fbb8f-41e3-459a-99fb-9119cb04b8022.gif)
![實驗三 幾何圖形變換實驗_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/26/1c1fbb8f-41e3-459a-99fb-9119cb04b802/1c1fbb8f-41e3-459a-99fb-9119cb04b8023.gif)
![實驗三 幾何圖形變換實驗_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/26/1c1fbb8f-41e3-459a-99fb-9119cb04b802/1c1fbb8f-41e3-459a-99fb-9119cb04b8024.gif)
![實驗三 幾何圖形變換實驗_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/26/1c1fbb8f-41e3-459a-99fb-9119cb04b802/1c1fbb8f-41e3-459a-99fb-9119cb04b8025.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗三 幾何圖形變換實驗實驗項目性質:設計性實驗所屬課程名稱:3D游戲圖形學實驗計劃學時:3學時一、 實驗目的和要求1. 進一步掌握二維、三維變換的數(shù)學知識、變換原理、變換種類、變換方法;2. 利用OpenGL實現(xiàn)二維、三維圖形變換,在屏幕上顯示變換過程或變換結果;3. 掌握OpenGL常用的變換函數(shù)。二、 實驗原理OpenGL的三個基本幾何變換函數(shù)介紹如下:1. 平移變換平移變換函數(shù)如下:void glTranslate fd (TYPE x, TYPE y, TYPE z);三個函數(shù)參數(shù)就是目標分別沿三個軸向平移的偏移量。這個函數(shù)表示用這三個偏移量生成的矩陣乘以當前矩陣。2. 旋轉變換旋轉
2、變換函數(shù)如下: void glRotate fd (TYPE angle, TYPE x, TYPE y, TYPE z);函數(shù)中第一個參數(shù)是表示目標沿從點(x, y, z)到原點的方向逆時針旋轉的角度,后三個參數(shù)是旋轉的方向點坐標。這個函數(shù)表示用這四個參數(shù)生成的矩陣乘以當前矩陣。3. 比例變換比例變換函數(shù)如下: void glScale fd (TYPE x, TYPE y, TYPE z);三個函數(shù)參數(shù)值就是目標分別沿三個軸向縮放的比例因子。這個函數(shù)表示用這三個比例因子生成的矩形乘以當前矩陣。這個函數(shù)能完成沿相應的軸對目標進行拉伸、壓縮和反射三項功能。以參數(shù)x為例,若當x大于1.0時,表示
3、沿x軸方向拉伸目標;若x小于1.0時,表示沿x軸方向收縮目標;若x=-1.0表示沿x軸反射目標。4. 投影變換1)OpenGL平行投影函數(shù)共有兩個:一個函數(shù)是:void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)它創(chuàng)建一個平行視景體。實際上這個函數(shù)的操作是創(chuàng)建一個平行投影矩陣,并且用這個矩陣乘以當前矩陣。其中近裁剪平面是一個矩形,矩形左下角點三維空間坐標是(left,bottom,-near),右上角點是(right,top,-near);遠
4、裁剪平面也是一個矩形,左下角點空間坐標是(left,bottom,-far),右上角點是(right,top,-far)。所有的near和far值同時為正或同時為負。如果沒有其他變換,正射投影的方向平行于Z軸,且視點朝向Z負軸。這意味著物體在視點前面時far和near都為負值,物體在視點后面時far和near都為正值。 另一個函數(shù)是:void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)它是一個特殊的正射投影函數(shù),主要用于二維圖像到二維屏幕上的投影。它的near和far缺省值分別為-1.0和1.
5、0,所有二維物體的Z坐標都為0.0。因此它的裁剪面是一個左下角點為(left,bottom)、右上角點為(right,top)的矩形。2)OpenGL透視投影函數(shù)共有兩個:void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);它創(chuàng)建一個透視視景體。其操作是創(chuàng)建一個透視投影矩陣,并且用這個矩陣乘以當前矩陣。這個函數(shù)的參數(shù)只定義近裁剪平面的左下角點和右上角點的三維空間坐標,即(left,bottom,-near)和(right,top,-ne
6、ar);最后一個參數(shù)far是遠裁剪平面的Z負值,其左下角點和右上角點空間坐標由函數(shù)根據(jù)透視投影原理自動生成。near和far表示離視點的遠近,它們總為正值。另一個函數(shù)是:void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);它也創(chuàng)建一個對稱透視視景體,但它的參數(shù)定義于前面的不同。其操作是創(chuàng)建一個對稱的透視投影矩陣,并且用這個矩陣乘以當前矩陣。參數(shù)fovy定義視野在X-Z平面的角度,范圍是0.0,180.0;參數(shù)aspect是投影平面寬度與高度的比率;參數(shù)zNear和Far分別是遠近裁
7、剪面沿Z負軸到視點的距離,它們總為正值。三、 實驗內容1、下面的代碼采用GLUT庫,使用了雙緩存,在按下鼠標左鍵后,程序在空閑時一直不停地調用spinDisplay函數(shù),實現(xiàn)了一個矩形在窗口中勻速轉動(單擊鼠標右鍵停止轉動)。請修改代碼,實現(xiàn)矩形在窗口內沿著水平線移動。/* * double.c * This is a simple double buffered program. * Pressing the left mouse button rotates the rectangle. * Pressing the right mouse button stops the rotatio
8、n. */#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers(); /交換雙緩存void spinDisplay(void) spin = spin + 2.0; if (spin 36
9、0.0) spin = spin - 360.0; glutPostRedisplay();void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void reshape(int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL
10、_MODELVIEW); glLoadIdentity();void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(spinDisplay); /設備空閑時調用的函數(shù) break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break;
11、 /* * Request double buffer display mode. * Register mouse input callback functions */int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /使用雙緩存模式 glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glut
12、DisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; /* ANSI C requires main to return int. */2. 已知某三角形的三頂點坐標50.0,25.0,150.0,25.0,100.0,100.0。要求:(1)創(chuàng)建一個長寬分別為600、600的窗口,窗口的左上角位于屏幕坐標(100,100)處。(提示:請試著修改gluOrtho2D函數(shù)參數(shù),使得繪制的三角形盡可能居中顯示)(2)繪制一個由上述頂點所描繪的三角形,實現(xiàn)該三角形
13、進行下列的幾何變化:首先使三角形沿著其中心的x軸,y軸方向縮小50%;然后沿著初始中心旋轉90度;最后沿著y軸平移100個單位。參考代碼:#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void) glBegin (GL_LINE_LOOP); glVertex2f(0.0, 25.0); glVertex2f(25.0, -25.0); glVertex2f(-25.0, -25.0); glEnd();void dis
14、play(void) glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); draw_triangle (); glEnable (GL_LINE_STIPPLE); glLineStipple (1, 0xF0F0); glLoadIdentity (); glTranslatef (-20.0, 0.0, 0.0); draw_triangle (); glLineStipple (1, 0xF00F); glLoadIdentity (
15、); glScalef (1.5, 0.5, 1.0); draw_triangle (); glLineStipple (1, 0x8888); glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); draw_triangle (); glDisable (GL_LINE_STIPPLE); glFlush ();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentit
16、y (); if (w = h) gluOrtho2D (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGL
17、E | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;3. 繪制一個三棱椎的透視投影圖,要求:實現(xiàn)勻速旋轉(提示:參考題目1,使用雙緩存模式);改變變換方式,達到不同的效果。參考代碼:#include#includevoid init(void)glClearColo
18、r(0.0f,0.0f,0.0f,0.0f);glShadeModel(GL_SMOOTH); /設為smooth處理方式glEnable(GL_DEPTH_TEST); /激活深度測試(可以去掉,看看效果)void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清除顏色緩存和深度緩存glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); /試嘗試修改此函數(shù),掌握其用法與參數(shù)含義 glRotatef(0.0f,0.0f,1.0f,0.0f); /試嘗試修改此函數(shù),掌握其
19、用法與參數(shù)含義glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);gl
20、Color3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVe
21、rtex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();glFlush();void reshape(int width, int height)glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f, (GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW)
22、;glLoadIdentity();void keyboard(unsigned char key, int x, int y)switch(key)case x:exit(0);break;default:break;int main(int argc, char * *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(640,480);glutInitWindowPosition(100,100);glutCreateWindow(Transf
23、orm2);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;4、 實驗代碼1. 實驗代碼:#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(spin, 0.0, 0.0); glColor3f(1.0, 1.0, 1.0); glRect
24、f(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers(); /交換雙緩存void spinDisplay(void) spin = spin + 0.02; if (spin 50.0) spin = spin - 100.0; glutPostRedisplay();void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void reshape(int w, int h) glViewport (0, 0, (GLsizei) w,
25、(GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(spinDisplay); /設備空閑時調用的函數(shù)
26、 break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /使用雙緩存模式 glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); gl
27、utCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; 運行結果:2. 實驗代碼:#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void) glBegin (GL_LINE_LOOP); glVertex2f(25
28、.0, 25.0); glVertex2f(100.0, 100.0); glVertex2f(150.0, 25.0); glEnd();void display(void) glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3f(0.0,1.0,0.0); draw_triangle(); glEnable(GL_LINE_STIPPLE); glLineStipple(1,0xF0F0); glLoadIdentity(); glTranslatef(100.0,63.0,0.0); glTranslatef(0.0,100.
29、0,0.0); glRotatef(90.0,0.0,0.0,1.0); glScalef(0.5,0.5,1.0); glTranslatef(-100.0,-63.0,0.0); glColor3f(0.0,255.0,1.0); draw_triangle(); glDisable(GL_LINE_STIPPLE); glFlush();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w
30、 = h) gluOrtho2D (-300.0, 500.0, -300.0*(GLfloat)h/(GLfloat)w, 500.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h,-50.0, 50.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT
31、_RGB|GLUT_DEPTH); glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;3. 實驗代碼:#include#includestatic GLfloat spin=0.0;void init(void)glClearColor(0.0f,0.0f,0.0f,0.0f);glShade
32、Model(GL_SMOOTH); /設為smooth處理方式glEnable(GL_DEPTH_TEST); /激活深度測試(可以去掉,看看效果)void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清除顏色緩存和深度緩存glPushMatrix();glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); /試嘗試修改此函數(shù),掌握其用法與參數(shù)含義 glRotatef(spin,0.0f,5.0f,0.0f); /試嘗試修改此函數(shù),掌握其用法與參數(shù)含義glBegin(
33、GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 活動資金申請書
- 2025年度無人駕駛源代碼保密協(xié)議書規(guī)范版
- 2025年度醫(yī)院藥品采購與臨床路徑管理合同
- 2025年度殯葬服務行業(yè)品牌戰(zhàn)略合作合同
- 加入吉他社團申請書
- 2025年度互聯(lián)網(wǎng)大數(shù)據(jù)分析平臺知識產權共享協(xié)議
- 目視化管理在生產現(xiàn)場的優(yōu)化策略
- 二零二五年度生態(tài)植物租擺與維護服務合同
- 教師中級職稱申請書
- 2025年度教育機構財務審計服務合同范本
- 門診診所運行管理制度
- 湖南省懷化市2024-2025學年九年級上學期期末化學試題(含答案)
- “5E”教學模式下高中數(shù)學教學實踐研究
- 《醫(yī)學影像檢查技術學》課件-踝X線攝影
- 急救藥品知識培訓內容
- 電工基礎知識(全套)
- 體育館施工圖設計合同
- 2025年福建省漳州臺商投資區(qū)招聘非占編人員歷年高頻重點提升(共500題)附帶答案詳解
- 四川省成都市成華區(qū)2024年中考語文二模試卷附參考答案
- 《西蘭花全程質量安全控制技術規(guī)范》
- 2025年臨床醫(yī)師定期考核試題中醫(yī)知識復習題庫及答案(200題)
評論
0/150
提交評論