




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上計(jì)算機(jī)圖形學(xué)基礎(chǔ)實(shí)驗(yàn)報(bào)告院 系: 計(jì)算機(jī)科學(xué)學(xué)院 班 級: 2012級4班 姓 名: 彭曉 學(xué) 號: 實(shí)驗(yàn)二 直線生成算法的實(shí)現(xiàn)1實(shí)驗(yàn)?zāi)康模?理解基本圖形元素光柵化的基本原理,掌握一種基本圖形元素光柵化算法,利用OpenGL實(shí)現(xiàn)直線光柵化的DDA算法。2實(shí)驗(yàn)內(nèi)容:(1) 根據(jù)所給的直線光柵化的示范源程序,在計(jì)算機(jī)上編譯運(yùn)行,輸出正確結(jié)果;(2) 指出示范程序采用的算法,以此為基礎(chǔ)將其改造為中點(diǎn)線算法或Bresenham算法,寫入實(shí)驗(yàn)報(bào)告;(3) 根據(jù)示范代碼,將其改造為圓的光柵化算法,寫入實(shí)驗(yàn)報(bào)告;(4) 了解和使用OpenGL的生成直線的命令,來驗(yàn)證程序運(yùn)行結(jié)果。3
2、實(shí)驗(yàn)原理: 示范代碼原理參見教材直線光柵化一節(jié)中的DDA算法。下面介紹下OpenGL畫線的一些基礎(chǔ)知識和glutReshapeFunc()函數(shù)。 (1)數(shù)學(xué)上的直線沒有寬度,但OpenGL的直線則是有寬度的。同時,OpenGL的直線必須是有限長度,而不是像數(shù)學(xué)概念那樣是無限的??梢哉J(rèn)為,OpenGL的“直線”概念與數(shù)學(xué)上的“線段”接近,它可以由兩個端點(diǎn)來確定。這里的線由一系列頂點(diǎn)順次連結(jié)而成,有閉合和不閉合兩種。 前面的實(shí)驗(yàn)已經(jīng)知道如何繪“點(diǎn)”,那么OpenGL是如何知道拿這些頂點(diǎn)來做什么呢?是一個一個的畫出來,還是連成線?或者構(gòu)成一個多邊形?或是做其它事情呢?為了解決這一問題,OpenGL要
3、求:指定頂點(diǎn)的命令必須包含在glBegin函數(shù)之后,glEnd函數(shù)之前(否則指定的頂點(diǎn)將被忽略),并由glBegin來指明如何使用這些點(diǎn)。例如:glBegin(GL_POINTS);glVertex2f(0.0f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd(); 則這兩個點(diǎn)將分別被畫出來。如果將GL_POINTS替換成GL_LINES,則兩個點(diǎn)將被認(rèn)為是直線的兩個端點(diǎn),OpenGL將會畫出一條直線。還可以指定更多的頂點(diǎn),然后畫出更復(fù)雜的圖形。另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,還有GL_LINE_STRIP,GL_LINE_L
4、OOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN。 (2)首次打開窗口、移動窗口和改變窗口大小時,窗口系統(tǒng)都將發(fā)送一個事件,以通知程序員。如果使用的是GLUT,通知將自動完成,并調(diào)用向glutReshapeFunc()注冊的函數(shù)。該函數(shù)必須完成下列工作: 重新建立用作新渲染畫布的矩形區(qū)域; 定義繪制物體時使用的坐標(biāo)系。 在GLUT內(nèi)部,將給該函數(shù)傳遞兩個參數(shù):窗口被移動或修改大小后的寬度和高度,單位為像素。glViewport()調(diào)整像素矩形,用于繪制整個窗口。接下來三個函數(shù)調(diào)整繪圖坐標(biāo)系,使左下角位置為(0, 0),右上角為(w, h)。4
5、實(shí)驗(yàn)代碼:#include <GL/glut.h>void LineDDA(int x0,int y0,int x1,int y1/*,int color*/)int x, dy, dx, y;float m;dx=x1-x0;dy=y1-y0;m=dy/dx;y=y0; glColor3f (1.0f, 1.0f, 0.0f); glPointSize(1);for(x=x0;x<=x1; x+)glBegin (GL_POINTS);glVertex2i (x, (int)(y+0.5);glEnd ();y+=m; void myDisplay(void)glClear
6、(GL_COLOR_BUFFER_BIT);glColor3f (1.0f, 0.0f, 0.0f); glRectf(25.0, 25.0, 75.0, 75.0); glPointSize(5);glBegin (GL_POINTS);glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 0.0f);glEnd (); LineDDA(0, 0, 200, 300); glBegin (GL_LINES);glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (100.0f, 0.0f);glColor3f (0.0f,
7、 1.0f, 0.0f); glVertex2f (180.0f, 240.0f);glEnd (); glFlush(); void Init()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();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);int mai
8、n(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("Hello World!");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMainLoop();return 0;5實(shí)驗(yàn)小結(jié): 在這次實(shí)驗(yàn)中,學(xué)習(xí)了畫線
9、的方法,一個點(diǎn)一個點(diǎn)的畫出,通過初始結(jié)點(diǎn)和末結(jié)點(diǎn)的坐標(biāo),來決策下一個結(jié)點(diǎn)的坐標(biāo)。對計(jì)算機(jī)中的畫圖方法有了進(jìn)一層理解,對像素點(diǎn)也有了多一些的理解,希望以后可以更多的了解。1實(shí)驗(yàn)?zāi)康模?理解掌握一個OpenGL程序平移、旋轉(zhuǎn)、縮放變換的方法。2實(shí)驗(yàn)內(nèi)容: (1)閱讀實(shí)驗(yàn)原理,運(yùn)行示范實(shí)驗(yàn)代碼,掌握OpenGL程序平移、旋轉(zhuǎn)、縮放變換的方法; (2)根據(jù)示范代碼,嘗試完成實(shí)驗(yàn)作業(yè);3實(shí)驗(yàn)原理:(1)OpenGL下的幾何變換 在OpenGL的核心庫中,每一種幾何變換都有一個獨(dú)立的函數(shù),所有變換都在三維空間中定義。 平移矩陣構(gòu)造函數(shù)為glTranslate<f,d>(tx, ty, tz),
10、作用是把當(dāng)前矩陣和一個表示移動物體的矩陣相乘。tx, ty,tz指定這個移動物體的矩陣,它們可以是任意的實(shí)數(shù)值,后綴為f(單精度浮點(diǎn)float)或d(雙精度浮點(diǎn)double),對于二維應(yīng)用來說,tz=0.0。 旋轉(zhuǎn)矩陣構(gòu)造函數(shù)為glRotate<f,d>(theta, vx, vy, vz),作用是把當(dāng)前矩陣和一個表示旋轉(zhuǎn)物體的矩陣相乘。theta, vx, vy, vz指定這個旋轉(zhuǎn)物體的矩陣,物體將繞著(0,0,0)到(x,y,z)的直線以逆時針旋轉(zhuǎn),參數(shù)theta表示旋轉(zhuǎn)的角度。向量v=(vx, vy,vz)的分量可以是任意的實(shí)數(shù)值,該向量用于定義通過坐標(biāo)原點(diǎn)的旋轉(zhuǎn)軸的方向,后
11、綴為f(單精度浮點(diǎn)float)或d(雙精度浮點(diǎn)double),對于二維旋轉(zhuǎn)來說,vx=0.0,vy=0.0,vz=1.0。 縮放矩陣構(gòu)造函數(shù)為glScale<f,d>(sx, sy, sz),作用是把當(dāng)前矩陣和一個表示縮放物體的矩陣相乘。sx, sy,sz指定這個縮放物體的矩陣,分別表示在x,y,z方向上的縮放比例,它們可以是任意的實(shí)數(shù)值,當(dāng)縮放參數(shù)為負(fù)值時,該函數(shù)為反射矩陣,縮放相對于原點(diǎn)進(jìn)行,后綴為f(單精度浮點(diǎn)float)或d(雙精度浮點(diǎn)double)。 注意這里都是說“把當(dāng)前矩陣和一個表示移動<旋轉(zhuǎn), 縮放>物體的矩陣相乘”,而不是直接說“這個函數(shù)就是旋轉(zhuǎn)”或者
12、“這個函數(shù)就是移動”,這是有原因的,馬上就會講到。 假設(shè)當(dāng)前矩陣為單位矩陣,然后先乘以一個表示旋轉(zhuǎn)的矩陣R,再乘以一個表示移動的矩陣T,最后得到的矩陣再乘上每一個頂點(diǎn)的坐標(biāo)矩陣v。那么,經(jīng)過變換得到的頂點(diǎn)坐標(biāo)就是(RT)v)。由于矩陣乘法滿足結(jié)合率,(RT)v) = R(Tv),換句話說,實(shí)際上是先進(jìn)行移動,然后進(jìn)行旋轉(zhuǎn)。即:實(shí)際變換的順序與代碼中寫的順序是相反的。由于“先移動后旋轉(zhuǎn)”和“先旋轉(zhuǎn)后移動”得到的結(jié)果很可能不同,初學(xué)的時候需要特別注意這一點(diǎn)。(2)OpenGL下的各種變換簡介我們生活在一個三維的世界如果要觀察一個物體,我們可以: 1、從不同的位置去觀察它(人運(yùn)動,選定某個位置去看)
13、。(視圖變換) 2、移動或者旋轉(zhuǎn)它,當(dāng)然了,如果它只是計(jì)算機(jī)里面的物體,我們還可以放大或縮小它(物體運(yùn)動,讓人看它的不同部分)。(模型變換) 3、如果把物體畫下來,我們可以選擇:是否需要一種“近大遠(yuǎn)小”的透視效果。另外,我們可能只希望看到物體的一部分,而不是全部(指定看的范圍)。(投影變換) 4、我們可能希望把整個看到的圖形畫下來,但它只占據(jù)紙張的一部分,而不是全部(指定在顯示器窗口的那個位置顯示)。(視口變換)這些,都可以在OpenGL中實(shí)現(xiàn)。 從“相對移動”的觀點(diǎn)來看,改變觀察點(diǎn)的位置與方向和改變物體本身的位置與方向具有等效性。在OpenGL中,實(shí)現(xiàn)這兩種功能甚至使用的是同樣的函數(shù)。 由于
14、模型和視圖的變換都通過矩陣運(yùn)算來實(shí)現(xiàn),在進(jìn)行變換前,應(yīng)先設(shè)置當(dāng)前操作的矩陣為“模型視圖矩陣”。設(shè)置的方法是以GL_MODELVIEW為參數(shù)調(diào)用glMatrixMode函數(shù),像這樣: glMatrixMode(GL_MODELVIEW); 該語句指定一個4×4的建模矩陣作為當(dāng)前矩陣。 通常,我們需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。把當(dāng)前矩陣設(shè)置為單位矩陣的函數(shù)為: glLoadIdentity(); 我們在進(jìn)行矩陣操作時,有可能需要先保存某個矩陣,過一段時間再恢復(fù)它。當(dāng)我們需要保存時,調(diào)用glPushMatrix()函數(shù),它相當(dāng)于把當(dāng)前矩陣壓入堆棧。當(dāng)需要恢復(fù)最近一次的保存時,調(diào)
15、用glPopMatrix()函數(shù),它相當(dāng)于從堆棧棧頂彈出一個矩陣為當(dāng)前矩陣。OpenGL規(guī)定堆棧的容量至少可以容納32個矩陣,某些OpenGL實(shí)現(xiàn)中,堆棧的容量實(shí)際上超過了32個。因此不必過于擔(dān)心矩陣的容量問題。 通常,用這種先保存后恢復(fù)的措施,比先變換再逆變換要更方便,更快速。 注意:模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。使用glMatrixMode來指定當(dāng)前操作的究竟是模型視圖矩陣還是投影矩陣。4實(shí)驗(yàn)代碼:#include <GL/glut.h>#include <stdlib.h>#include <math.h> /* 初始化顯示窗口大小 */GLs
16、izei winWidth=600,winHeight=600; /* 設(shè)置世界坐標(biāo)系的顯示范圍 */GLfloat xwcMin=-300.0,xwcMax=300.0;GLfloat ywcMin=-300.0,ywcMax=300.0;void init (void) /* 設(shè)置顯示窗口的背景顏色為白色 */glClearColor(1.0,1.0,1.0,0.0);class wcPt3Dpublic:GLfloat x, y, z; /* 三維旋轉(zhuǎn)變換,參數(shù):旋轉(zhuǎn)軸(由點(diǎn)p1和p2定義)和旋轉(zhuǎn)角度(thetaDegrees)*/void rotate3D (wcPt3D p1, wc
17、Pt3D p2, GLfloat thetaDegrees) /* 設(shè)置旋轉(zhuǎn)軸的矢量 */float vx = (p2.x - p1.x);float vy = (p2.y - p1.y);float vz = (p2.z - p1.z);/*通過平移-旋轉(zhuǎn)-平移復(fù)合變換序列完成任意軸的旋轉(zhuǎn)(注意OpenGL中的反序表示)*/glTranslatef (p1.x, p1.y, p1.z); /移動p1到原始位置/*關(guān)于通過坐標(biāo)原點(diǎn)的坐標(biāo)軸旋轉(zhuǎn)*/glRotatef (thetaDegrees, vx, vy, vz);glTranslatef (-p1.x, -p1.y, -p1.z); /移
18、動p1到原點(diǎn)位置/* 三維比例放縮變換,參數(shù):比例系數(shù)sx、sy、sz和固定點(diǎn)fixedPt */void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) /*通過平移-放縮-平移復(fù)合變換序列完成任意點(diǎn)為中心點(diǎn)的比例縮放*/* 反平移到原始位置*/glTranslatef (fixedPt.x, fixedPt.y, fixedPt.z);glScalef (sx, sy, sz); / 基于原點(diǎn)的比例放縮變換/* 移動固定點(diǎn)到坐標(biāo)原點(diǎn)*/glTranslatef (-fixedPt.x, -fixedPt.y, -fi
19、xedPt.z);void displayFcn (void) /* 設(shè)置變換中心點(diǎn)位置 */wcPt3D centroidPt,R_p1, R_p2;centroidPt.x=50;centroidPt.y=100;centroidPt.z=0;R_p1=centroidPt;R_p2.x=50;R_p2.y=100;R_p2.z=1; /* 設(shè)置幾何變換參數(shù)*/wcPt3D p1,p2,fixedPt;p1= R_p1;p2= R_p2;fixedPt=centroidPt;GLfloat tx=0.0,ty=100.0,tz=0;GLfloat sx=0.5,sy=0.5,sz=1;GL
20、double thetaDegrees = 90;glClear(GL_COLOR_BUFFER_BIT); / 清空顯示窗口glMatrixMode (GL_MODELVIEW);glLoadIdentity(); /清空變換矩陣為單位矩陣,恢復(fù)原始坐標(biāo)系環(huán)境/* 顯示變換前幾何對象 */glColor3f(0.0,0.0,1.0); / 設(shè)置前景色為藍(lán)色glRecti(50,100,200,150); /顯示藍(lán)色矩形(變換前)/* 執(zhí)行幾何變換(注意以反序形式寫出)*/glTranslatef (tx, ty, tz); / 平移變換scale3D (sx, sy, sz, fixedPt
21、); / 比例放縮變換rotate3D (p1, p2, thetaDegrees); / 旋轉(zhuǎn)變換/* 顯示變換后幾何對象 */glColor3f(1.0,0.0,0.0); /重新設(shè)置前景色為紅色glRecti(50,100,200,150); /顯示紅色矩形(變換后)glFlush();void winReshapeFcn(GLint newWidth,GLint newHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax);glClear(GL_COLOR_B
22、UFFER_BIT);void main(int argc, char * argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,50);glutInitWindowSize(winWidth,winHeight);glutCreateWindow("三維幾何變換實(shí)例-OpenGL版復(fù)合變換");init();glutDisplayFunc(displayFcn);glutReshapeFunc(winReshapeFcn);glut
23、MainLoop();5實(shí)驗(yàn)小結(jié): 通過本次實(shí)驗(yàn),我對OpenGL進(jìn)行圖形生成的操作有了更加深入的了解,學(xué)習(xí)了平移、旋轉(zhuǎn)、縮放變換的方法,同時也熟悉了模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。發(fā)現(xiàn)編程其實(shí)挺有趣的,希望以后能繼續(xù)在編程中的樂趣和培養(yǎng)、保持自己的興趣。1實(shí)驗(yàn)?zāi)康模?理解掌握OpenGL程序的模型視圖變換。2實(shí)驗(yàn)內(nèi)容:(1)閱讀實(shí)驗(yàn)原理,運(yùn)行示范實(shí)驗(yàn)代碼,理解掌握OpenGL程序的模型視圖變換;(2)根據(jù)示范代碼,嘗試完成實(shí)驗(yàn)作業(yè);3實(shí)驗(yàn)原理:我們生活在一個三維的世界如果要觀察一個物體,我們可以: 1、從不同的位置去觀察它(人運(yùn)動,選定某個位置去看)。(視圖變換) 2、移動或者旋轉(zhuǎn)它,
24、當(dāng)然了,如果它只是計(jì)算機(jī)里面的物體,我們還可以放大或縮小它(物體運(yùn)動,讓人看它的不同部分)。(模型變換) 3、如果把物體畫下來,我們可以選擇:是否需要一種“近大遠(yuǎn)小”的透視效果。另外,我們可能只希望看到物體的一部分,而不是全部(指定看的范圍)。(投影變換) 4、我們可能希望把整個看到的圖形畫下來,但它只占據(jù)紙張的一部分,而不是全部(指定在顯示器窗口的那個位置顯示)。(視口變換) 從“相對移動”的觀點(diǎn)來看,改變觀察點(diǎn)的位置與方向和改變物體本身的位置與方向具有等效性。在OpenGL中,實(shí)現(xiàn)這兩種功能甚至使用的是同樣的函數(shù)。 由于模型和視圖的變換都通過矩陣運(yùn)算來實(shí)現(xiàn),在進(jìn)行變換前,應(yīng)先設(shè)置當(dāng)前操作的
25、矩陣為“模型視圖矩陣”。設(shè)置的方法是以GL_MODELVIEW為參數(shù)調(diào)用glMatrixMode函數(shù),像這樣: glMatrixMode(GL_MODELVIEW); 該語句指定一個4×4的建模矩陣作為當(dāng)前矩陣。 通常,我們需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。把當(dāng)前矩陣設(shè)置為單位矩陣的函數(shù)為: glLoadIdentity(); 我們在進(jìn)行矩陣操作時,有可能需要先保存某個矩陣,過一段時間再恢復(fù)它。當(dāng)我們需要保存時,調(diào)用glPushMatrix()函數(shù),它相當(dāng)于把當(dāng)前矩陣壓入堆棧。當(dāng)需要恢復(fù)最近一次的保存時,調(diào)用glPopMatrix()函數(shù),它相當(dāng)于從堆棧棧頂彈出一個矩陣為當(dāng)前
26、矩陣。OpenGL規(guī)定堆棧的容量至少可以容納32個矩陣,某些OpenGL實(shí)現(xiàn)中,堆棧的容量實(shí)際上超過了32個。因此不必過于擔(dān)心矩陣的容量問題。 通常,用這種先保存后恢復(fù)的措施,比先變換再逆變換要更方便,更快速。 注意:模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。使用glMatrixMode來指定當(dāng)前操作的究竟是模型視圖矩陣還是投影矩陣。 在代碼中,視圖變換必須出現(xiàn)在模型變換之前,但可以在繪圖之前的任何時候執(zhí)行投影變換和視口變換。 1.display()程序中繪圖函數(shù)潛在的重復(fù)性強(qiáng)調(diào)了:在指定的視圖變換之前,應(yīng)該使用glLoadIdentity()函數(shù)把當(dāng)前矩陣設(shè)置為單位矩陣。 2.在載入單位矩陣之后
27、,使用gluLookAt()函數(shù)指定視圖變換。如果程序沒有調(diào)用gluLookAt(),那么照相機(jī)會設(shè)定為一個默認(rèn)的位置和方向。在默認(rèn)的情況下,照相機(jī)位于原點(diǎn),指向Z軸負(fù)方向,朝上向量為(0,1,0)。 3.一般而言,display()函數(shù)包括:視圖變換 + 模型變換 + 繪制圖形的函數(shù)(如glutWireCube()。display()會在窗口被移動或者原來先遮住這個窗口的東西被一開時,被重復(fù)調(diào)用,并經(jīng)過適當(dāng)變換,保證繪制的圖形是按照希望的方式進(jìn)行繪制。 4.在調(diào)用glFrustum()設(shè)置投影變換之前,在reshape()函數(shù)中有一些準(zhǔn)備工作:視口變換 + 投影變換 + 模型視圖變換。由于投
28、影變換,視口變換共同決定了場景是如何映射到計(jì)算機(jī)的屏幕上的,而且它們都與屏幕的寬度,高度密切相關(guān),因此應(yīng)該放在reshape()中。reshape()會在窗口初次創(chuàng)建,移動或改變時被調(diào)用。OpenGL中矩陣坐標(biāo)之間的關(guān)系: 物理坐標(biāo)*模型視圖矩陣*投影矩陣*透視除法*規(guī)范化設(shè)備坐標(biāo)窗口坐標(biāo) (1)視圖變換函數(shù)gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)設(shè)置照相機(jī)的位置 把照相機(jī)放在(0,0,5),鏡頭瞄準(zhǔn)(0,0,0),朝上向量定為(0,1,0)朝上向量為照相機(jī)指定了一個唯一的方向。如果沒有調(diào)用gluLookAt,照相機(jī)就設(shè)定一個默認(rèn)的位置和方
29、向,在默認(rèn)情況下,照相機(jī)位于原點(diǎn),指向Z軸的負(fù)方向,朝上向量為(0,1,0) glLoadIdentity()函數(shù)把當(dāng)前矩陣設(shè)置為單位矩陣。 (2)使用模型變換的目的是設(shè)置模型的位置和方向 (3)投影變換,指定投影變換類似于為照相機(jī)選擇鏡頭,可以認(rèn)為這種變換的目的是確定視野,并因此確定哪些物體位于視野之內(nèi)以及他們能夠被看到的程度。 除了考慮視野之外,投影變換確定物體如何投影到屏幕上,OpenGL提供了兩種基本類型的投影,1、透視投影:遠(yuǎn)大近??;2、正投影:不影響相對大小,一般用于建筑和CAD應(yīng)用程序中。 (4)視口變換 視口變換指定一個圖象在屏幕上所占的區(qū)域。 (5)繪制場景4實(shí)驗(yàn)代碼: #i
30、nclude <GL/glut.h>#include <stdlib.h>static int year = 0, day = 0;void init(void)glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_FLAT);void display(void)glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glPushMatrix();glutWireSphere(1.0, 20, 16); /* draw sun */glRotatef (GLfloat
31、) year, 0.0, 1.0, 0.0);glTranslatef (2.0, 0.0, 0.0);glRotatef (GLfloat) day, 0.0, 1.0, 0.0);glutWireSphere(0.2, 10, 8); /* draw smaller planet */glPopMatrix();glutSwapBuffers();void reshape (int w, int h)glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluPe
32、rspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);void keyboard (unsigned char key, int x, int y)switch (key) case 'd':day = (day + 10) % 360;glutPostRedisplay();break;case 'D':day =
33、 (day - 10) % 360;glutPostRedisplay();break;case 'y':year = (year + 5) % 360;glutPostRedisplay();break;case 'Y':year = (year - 5) % 360;glutPostRedisplay();break;case 27:exit(0);break;default:break; int main(int argc, char* argv) glutInit(&argc, argv);glutInitDisplayMode (GLUT_DO
34、UBLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;5.實(shí)驗(yàn)小結(jié): 通過本次實(shí)驗(yàn),我掌握了OpenGL程序的模型視圖變換。除了考慮視野之外,投影變換確定物體如何投影到屏幕上, 實(shí)際變換的順序與代碼中寫的順序是相反的。由于“
35、先移動后旋轉(zhuǎn)”和“先旋轉(zhuǎn)后移動”得到的結(jié)果很可能不同,初學(xué)的時候需要特別注意這一點(diǎn)。 1實(shí)驗(yàn)?zāi)康模?了解曲線的生成原理,掌握幾種常見的曲線生成算法,利用VC+OpenGL實(shí)現(xiàn)Bezier曲線生成算法。2實(shí)驗(yàn)內(nèi)容:(1) 結(jié)合示范代碼了解曲線生成原理與算法實(shí)現(xiàn),尤其是Bezier曲線;(2) 調(diào)試、編譯、修改示范程序。(3) 嘗試實(shí)現(xiàn)B樣條曲線算法。3實(shí)驗(yàn)原理: Bezier曲線是通過一組多邊形折線的頂點(diǎn)來定義的。如果折線的頂點(diǎn)固定不變,則由其定義的Bezier曲線是唯一的。在折線的各頂點(diǎn)中,只有第一點(diǎn)和最后一點(diǎn)在曲線上且作為曲線的起始處和終止處,其他的點(diǎn)用于控制曲線的形狀及階次。曲線的形狀趨向
36、于多邊形折線的形狀,要修改曲線,只要修改折線的各頂點(diǎn)就可以了。因此,多邊形折線又稱Bezier曲線的控制多邊形,其頂點(diǎn)稱為控制點(diǎn)。三次多項(xiàng)式,有四個控制點(diǎn),其數(shù)學(xué)表示如下:4實(shí)驗(yàn)代碼:#include <GL/glut.h>#include <stdio.h>#include <stdlib.h>#include <vector>using namespace std;struct Point int x, y;Point pt4, bz11;vector<Point> vpt;bool bDraw;int nInput;void C
37、alcBZPoints()float a0,a1,a2,a3,b0,b1,b2,b3;a0=pt0.x;a1=-3*pt0.x+3*pt1.x;a2=3*pt0.x-6*pt1.x+3*pt2.x;a3=-pt0.x+3*pt1.x-3*pt2.x+pt3.x;b0=pt0.y;b1=-3*pt0.y+3*pt1.y;b2=3*pt0.y-6*pt1.y+3*pt2.y;b3=-pt0.y+3*pt1.y-3*pt2.y+pt3.y;float t = 0;float dt = 0.01;for(int i = 0; t<1.1; t+=0.1, i+) bzi.x = a0+a1*t+
38、a2*t*t+a3*t*t*t;bzi.y = b0+b1*t+b2*t*t+b3*t*t*t; void ControlPoint(vector<Point> vpt)glPointSize(2);for(int i=0; i<vpt.size(); i+) glBegin (GL_POINTS);glColor3f (1.0f, 0.0f, 0.0f); glVertex2i (vpti.x,vpti.y);glEnd ();void PolylineGL(Point *pt, int num) glBegin (GL_LINE_STRIP);for(int i=0;i&
39、lt;num;i+)glColor3f (1.0f, 1.0f, 1.0f); glVertex2i (pti.x,pti.y); glEnd ();void myDisplay() glClear(GL_COLOR_BUFFER_BIT);glColor3f (1.0f, 1.0f, 1.0f); if (vpt.size() > 0) ControlPoint(vpt);if(bDraw) PolylineGL(pt, 4);CalcBZPoints();PolylineGL(bz, 11);glFlush();void Init() glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);printf("Please Click left button of mouse to input control point of Bezier Curve!
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供應(yīng)合同范本寫
- 240鉆機(jī)租賃合同范本
- epc工程合同使用合同范本
- 人工加材料合同范本
- 全新貨車購車合同范例
- 保險(xiǎn)公司擔(dān)保貸款合同范本
- it 顧問合同范本
- 分公司發(fā)票合同范本
- 代招合同范本
- 出租摩托協(xié)議合同范本
- 巴厘島旅游流程介紹
- 【物理】牛頓第一定律 2024-2025學(xué)年人教版物理八年級下冊
- 2025網(wǎng)格員考試題庫及參考答案
- 2025年湖南有色金屬職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年江蘇商貿(mào)職業(yè)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 科技與教育的融合小學(xué)科學(xué)探究式學(xué)習(xí)的實(shí)踐案例
- 2025年浙江紹興杭紹臨空示范區(qū)開發(fā)集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 煤礦隱蔽致災(zāi)因素普查
- 2025年春季1530安全教育記錄主題
- DBJ33T 1271-2022 建筑施工高處作業(yè)吊籃安全技術(shù)規(guī)程
評論
0/150
提交評論