圖形學(xué)實驗3.doc_第1頁
圖形學(xué)實驗3.doc_第2頁
圖形學(xué)實驗3.doc_第3頁
圖形學(xué)實驗3.doc_第4頁
圖形學(xué)實驗3.doc_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)字圖像處理實驗指導(dǎo)書3D游戲圖形學(xué)實驗報告書(實驗三)姓名: 學(xué)號:班級:浙江理工大學(xué)二一二 年 十一 月2實驗三 幾何圖形變換實驗一、實驗?zāi)康暮鸵?. 進一步掌握二維、三維變換的數(shù)學(xué)知識、變換原理、變換種類、變換方法;2. 利用OpenGL實現(xiàn)二維、三維圖形變換,在屏幕上顯示變換過程或變換結(jié)果;3. 掌握OpenGL常用的變換函數(shù)。2、 實驗原理OpenGL的三個基本幾何變換函數(shù)介紹如下:1. 平移變換平移變換函數(shù)如下:void glTranslate fd (TYPE x, TYPE y, TYPE z);三個函數(shù)參數(shù)就是目標分別沿三個軸向平移的偏移量。這個函數(shù)表示用這三個偏移量生成的矩陣乘以當前矩陣。2. 旋轉(zhuǎn)變換旋轉(zhuǎn)變換函數(shù)如下: void glRotate fd (TYPE angle, TYPE x, TYPE y, TYPE z);函數(shù)中第一個參數(shù)是表示目標沿從點(x, y, z)到原點的方向逆時針旋轉(zhuǎn)的角度,后三個參數(shù)是旋轉(zhuǎn)的方向點坐標。這個函數(shù)表示用這四個參數(shù)生成的矩陣乘以當前矩陣。3. 比例變換比例變換函數(shù)如下: void glScale fd (TYPE x, TYPE y, TYPE z);三個函數(shù)參數(shù)值就是目標分別沿三個軸向縮放的比例因子。這個函數(shù)表示用這三個比例因子生成的矩形乘以當前矩陣。這個函數(shù)能完成沿相應(yīng)的軸對目標進行拉伸、壓縮和反射三項功能。以參數(shù)x為例,若當x大于1.0時,表示沿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);遠裁剪平面也是一個矩形,左下角點空間坐標是(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.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,-near);最后一個參數(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分別是遠近裁剪面沿Z負軸到視點的距離,它們總為正值。3、 實驗內(nèi)容1、下面的代碼采用GLUT庫,使用了雙緩存,在按下鼠標左鍵后,程序在空閑時一直不停地調(diào)用spinDisplay函數(shù),實現(xiàn)了一個矩形在窗口中勻速轉(zhuǎn)動(單擊鼠標右鍵停止轉(zhuǎn)動)。請修改代碼,實現(xiàn)矩形在窗口內(nèi)沿著水平線移動。 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)該三角形進行下列的幾何變化:首先使三角形沿著其中心的x軸,y軸方向縮小50%;然后沿著初始中心旋轉(zhuǎn)90度;最后沿著y軸平移100個單位。 3、繪制一個三棱椎的透視投影圖,要求:實現(xiàn)勻速旋轉(zhuǎn)(提示:參考題目1,使用雙緩存模式);改變變換方式,達到不同的效果。選做:實現(xiàn)直線的編碼裁剪算法(Cohen-Surtherland算法)。程序中存在小錯誤,請調(diào)試改正;分別給出直線的三種不同位置情況,測試實驗代碼是否存在其它問題,有的話請改正。4、 實驗代碼1、修改代碼,實現(xiàn)矩形在窗口內(nèi)沿著水平線移動(紅色部分為修改部分)/* * double.c * This is a simple double buffered program. * Pressing the left mouse button rotates the rectangle* Pressing the right mouse button stops the rotation. */#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); / glRotatef(spin, 0.0, 0.0, 1.0); glTranslatef(0.0,spin,0.0); glColor3f(1.0, 1.0, 1.0); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers(); /交換雙緩存 void spinDisplay(void) spin = spin + 0.01; if (spin 20.0) spin = spin - 20.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_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è)備空閑時調(diào)用的函數(shù) break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; /* * 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 (); glutDisplayFunc(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ù),使得繪制的三角形盡可能居中顯示)#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void)/繪制三角形 glBegin(GL_TRIANGLES);/開始畫三角形 /glColor3f (1.0, 0.0, 0.0); glVertex2f(25.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, 0.0, 0.0); glColor3f (0.0, 0.0, 1.0); draw_triangle (); glLineStipple (1, 0xF00F); glLoadIdentity (); glScalef (1.0, 0.5, 1.0); glColor3f (0.0, 1.0, 1.0); draw_triangle (); glLineStipple (1, 0x8888); glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); glColor3f (1.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); glLoadIdentity (); if (w = h) gluOrtho2D (-150.0, 200.0, -50.0*(GLfloat)h/(GLfloat)w, 200.0*(GLfloat)h/(GLfloat)w);/修改參數(shù),使三角形盡量顯示在窗口中央位置 else gluOrtho2D (-20.0*(GLfloat)w/(GLfloat)h, 200.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_RGB|GLUT_DEPTH);/顯示模式 glutInitWindowSize (600, 600); /創(chuàng)建600*600的窗口 glutInitWindowPosition (100, 100);/左上角位于(100,100)glutCreateWindow (argv0);/創(chuàng)建窗口 init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;(2) 繪制一個由上述頂點所描繪的三角形,實現(xiàn)該三角形進行下列的幾何變化:首先使三角形沿著其中心的x軸,y軸方向縮小50%;然后沿著初始中心旋轉(zhuǎn)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_TRIANGLES); /glColor3f (1.0, 0.0, 0.0); glVertex2f(25.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.0, 0.0);/平移100個單位 glRotatef (90.0, 0.0, 0.0, 1.0);/旋轉(zhuǎn)90度 glScalef (0.5, 0.5, 1.0);/沿著其中心的x軸,y軸方向縮小% 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 = h) gluOrtho2D (0.0, 200.0, 0.0*(GLfloat)h/(GLfloat)w, 200.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (0.0*(GLfloat)w/(GLfloat)h, 200.0*(GLfloat)w/(GLfloat)h, 0.0, 200.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100);glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;3、 繪制一個三棱椎的透視投影圖,要求:實現(xiàn)勻速旋轉(zhuǎn)(提示:參考題目1,使用雙緩存模式);改變變換方式,達到不同的效果。#include#includestatic GLfloat spin=0.0;void init(void)glClearColor(0.0f,0.0f,0.0f,0.0f);glShadeModel(GL_SMOOTH); /設(shè)為smooth處理方式glEnable(GL_DEPTH_TEST); /激活深度測試void draw_trangles() /繪制的三棱錐glBegin(GL_TRIANGLES);/開始繪制三棱錐glColor3f(1.0f,0.0f,0.0f);/顏色設(shè)定glVertex3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,255.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,1.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(255.0f,0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(1.0f,255.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清除顏色緩存和深度緩存glPushMatrix(); /清除顏色緩存和深度緩存glLoadIdentity(); glTranslatef(0.5f,0.0f,-6.0f); /試嘗試修改此函數(shù),掌握其用法與參數(shù)含義 glRotatef(spin,0.0f,5.0f,0.0f); /試嘗試修改此函數(shù),掌握其用法與參數(shù)含義draw_trangles();glPopMatrix();glutSwapBuffers(); /交換雙緩存glFlush();void spinDisplay(void)/控制旋轉(zhuǎn)速度,速度越轉(zhuǎn)越快 spin+=0.25; if(spin360.0) spin=spin-360.0; glutPostRedisplay();void spinDisplay1(void)/不同的方向不同速度,速度越轉(zhuǎn)越快 spin=spin-; if (spin360.0) spin=spin-360.0; glutPostRedisplay();void reshape(int width, int height)glViewport(0,0,(GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glL

溫馨提示

  • 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

提交評論