v804-第四章opengl的2d圖形渲染課程4二維變換_第1頁
v804-第四章opengl的2d圖形渲染課程4二維變換_第2頁
v804-第四章opengl的2d圖形渲染課程4二維變換_第3頁
v804-第四章opengl的2d圖形渲染課程4二維變換_第4頁
v804-第四章opengl的2d圖形渲染課程4二維變換_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、二維變換學(xué)習(xí)如何使圖形運(yùn)動平移變換、旋轉(zhuǎn)變換和放縮學(xué)會復(fù)雜變換的分解與合成學(xué)會使用OpenGL的幾何變換函數(shù)本章目標(biāo)數(shù)學(xué)基礎(chǔ)二維幾何變換齊次坐標(biāo)復(fù)合變換其它變換三維幾何變換圖形對象的幾何變換OpenGL的幾何變換函數(shù)主要內(nèi)容矢量(vector)連接兩個點(diǎn)的有向線段。又稱向量行向量和列向量兩種表示矢量和數(shù)學(xué)基礎(chǔ)矢量的數(shù)乘矢量的點(diǎn)積運(yùn)算性質(zhì)數(shù)學(xué)基礎(chǔ)矢量的長度單位矢量 矢量間的夾角矢量的叉積右手法則數(shù)學(xué)基礎(chǔ)矩陣(Matrix)mn 階矩陣n階方陣(mn)單位矩陣 n階方陣,對角線元素為1, 其它元素為0數(shù)學(xué)基礎(chǔ)矩陣(續(xù))行向量與列向量當(dāng)m1時,A退化為行向量a11, a12, , a1n當(dāng)n1時,

2、A退化為列向量a11, a21, , am1T矩陣的加法 A=(aij)mn,B(bij) mnA與B的和記為AB性質(zhì):結(jié)合律和交換律數(shù)學(xué)基礎(chǔ)矩陣(續(xù))矩陣的數(shù)乘 矩陣的乘法 性質(zhì):結(jié)合律和分配律(不滿足交換律)數(shù)學(xué)基礎(chǔ)矩陣(續(xù))矩陣的轉(zhuǎn)置 矩陣的逆n階方陣A是可逆的,若存在另一個n階方陣B,使得 ABBAIn,稱B是A的逆陣,記為BA1數(shù)學(xué)基礎(chǔ)平移變換 (translation transformation)將點(diǎn)P(x, y)在x軸方向、y軸方向分別平移距離tx,ty,得到點(diǎn)P(x, y),則記為:T(tx , ty)矩陣表示:二維幾何變換旋轉(zhuǎn)變換(rotation transformati

3、on)如點(diǎn)P(x, y)的極坐標(biāo)表示(r為P 到原點(diǎn)的距離)繞坐標(biāo)原點(diǎn)(稱為參照點(diǎn),基準(zhǔn)點(diǎn))旋轉(zhuǎn)角度 (逆時針為正,順時針為負(fù))二維幾何變換旋轉(zhuǎn)變換(續(xù))記為:R()矩陣表示為:二維幾何變換放縮變換(scaling transformation)將點(diǎn)P(x, y)在x方向, y方向分別放縮 sx 和 sy 倍,得到點(diǎn)P(x, y)以坐標(biāo)原點(diǎn)為放縮參照(基準(zhǔn))點(diǎn)不僅改變了物體的大小和形狀,也改變了它離原點(diǎn)的距離記為:S(sx, sy)二維幾何變換利用矩陣計算變換后的坐標(biāo)時,平移、旋轉(zhuǎn)和放縮變換分別為:運(yùn)算不統(tǒng)一,如何統(tǒng)一運(yùn)算?二維幾何變換為什么需要齊次坐標(biāo)?齊次坐標(biāo)就是將一個原本是n維的向量用一

4、個n+1維向量來表示。例如,二維點(diǎn)(x,y)的齊次坐標(biāo)表示為(hx,hy,h)。由此可以看出,一個向量的齊次表示是不唯一的,齊次坐標(biāo)的h取不同的值都表示的是同一個點(diǎn),比如齊次坐標(biāo)(8,4,2)、(4,2,1)表示的都是二維點(diǎn)(4,2)齊次坐標(biāo)為什么需要齊次坐標(biāo)?對多個點(diǎn)計算多次不同的變換時,分別利用矩陣計算各變換導(dǎo)致計算量大運(yùn)算表示形式不統(tǒng)一平移為“”旋轉(zhuǎn)和放縮為“”統(tǒng)一運(yùn)算形式后,可以先合成變換運(yùn)算的矩陣,再作用于圖形對象齊次坐標(biāo)定義 Homogeneous Coordinate(x,y)點(diǎn)對應(yīng)的齊次坐標(biāo)定義為(x,y)點(diǎn)對應(yīng)的齊次坐標(biāo)為三維空間的一條直線 標(biāo)準(zhǔn)齊次坐標(biāo)(x,y,1)h0表示

5、無窮遠(yuǎn)點(diǎn)齊次坐標(biāo)二維變換的矩陣表示平移變換旋轉(zhuǎn)變換齊次坐標(biāo)放縮變換變換具有統(tǒng)一表示形式的優(yōu)點(diǎn)便于變換合成連續(xù)變換時,可以先得到變換的矩陣便于硬件實(shí)現(xiàn)齊次坐標(biāo)變換的性質(zhì)平移和旋轉(zhuǎn)變換具有可加性放縮變換具有可乘性齊次坐標(biāo)逆變換逆平移變換:正平移距離tx,ty逆旋轉(zhuǎn)變換:旋轉(zhuǎn)角度為齊次坐標(biāo)逆放縮變換:放縮系數(shù)為sx和sy齊次坐標(biāo)變換合成方法:連續(xù)變換時,先計算變換矩陣,再計算坐標(biāo)優(yōu)點(diǎn):(1)提高了對圖形依次做多次變換的運(yùn)算效率如:圖形上有n個頂點(diǎn)Pi,如果依次施加的變換為T,R,那么頂點(diǎn)Pi 變換后的坐標(biāo)為每個頂點(diǎn)需要2次矩陣相乘只需要1次矩陣相乘復(fù)合變換變換合成(續(xù))(2)提供構(gòu)造復(fù)雜變換的方法

6、對圖形作較復(fù)雜的變換時,不直接去計算這個變換,而是將其先分解成多個基本變換,再合成總的變換復(fù)合變換Composite transformation多個變換的組合可通過單個變換矩陣來計算矩陣乘積復(fù)合變換連續(xù)平移變換平移向量為(t1x,t1y)和(t2x,t2y)點(diǎn)P 經(jīng)變換為P,則有復(fù)合矩陣復(fù)合平移變換連續(xù)旋轉(zhuǎn)P 經(jīng)連續(xù)旋轉(zhuǎn)角度分別為 1 和 2 后連續(xù)旋轉(zhuǎn)具有相加性復(fù)合旋轉(zhuǎn)變換連續(xù)放縮連續(xù)放縮因子分別為:(s1x, s1y) 和 (s2x, s2y)復(fù)合放縮變換關(guān)于任意參照點(diǎn) 的旋轉(zhuǎn)變換步驟:(1)平移對象使參照(基準(zhǔn))點(diǎn)移到原點(diǎn)(2)繞坐標(biāo)原點(diǎn)旋轉(zhuǎn)(3)平移對象使基準(zhǔn)點(diǎn)回到原始位置二維基準(zhǔn)點(diǎn)

7、旋轉(zhuǎn)關(guān)于任意參照點(diǎn) 的放縮變換 步驟:(1)平移對象使基準(zhǔn)點(diǎn)與坐標(biāo)原點(diǎn)重合(2)放縮變換(3)反向平移使得基準(zhǔn)點(diǎn)回到初始位置二維基準(zhǔn)點(diǎn)放縮變換合成時,矩陣相乘的順序單次變換:列向量表示點(diǎn)復(fù)合變換:先作用的放在連乘的右端,后作用的放在連乘的左端點(diǎn)表示成行向量呢?小結(jié)對稱變換(反射變換、鏡像變換:reflection)(1)關(guān)于 x 軸的對稱變換(2)關(guān)于 y 軸的對稱變換 其它變換(3)關(guān)于任意軸的對稱變換平移(tx, ty)使l 過坐標(biāo)原點(diǎn),記為T1旋轉(zhuǎn),記R1對稱, 記SYx旋轉(zhuǎn)-,記 R2平移(-tx, -ty), 記T2總變換:T2R2 SYxR1 T1其它變換錯切變換(shear)依賴

8、軸:坐標(biāo)保持不變的坐標(biāo)軸,又稱參考軸方向軸:余下的坐標(biāo)軸1、以y 軸為依賴軸的錯切變換 (1)以 y = 0為參考軸(坐標(biāo)保持不變)Shx是對y=1上的點(diǎn)沿x軸移動的距離其它變換(2)以 y = yref 為參考軸x = x + shx ( y yref)y = y其它變換2、以x軸為依賴軸的錯切變換其它變換仿射變換affine transformation二維線性變換的一般形式平移,旋轉(zhuǎn),放縮,對稱和錯切是特例特點(diǎn):保持平行線間的平行關(guān)系其它變換例:證明二維復(fù)合變換的矩陣總能表示為: 證明:其它變換圖形對象點(diǎn),線段,多邊形,圓,字符方法先生成點(diǎn)集,再對其中的點(diǎn)進(jìn)行變換運(yùn)算量大對參數(shù)變換線段:

9、兩個端點(diǎn)多邊形:各頂點(diǎn)圓:圓心和半徑前提圖形對象的幾何表示不發(fā)生變化圖形對象的幾何變換說明在核心庫中,每種幾何變換是一個獨(dú)立的函數(shù)所有變換都是在三維坐標(biāo)系中定義基本幾何變換函數(shù)平移函數(shù):glTranslatefd(tx, ty, tz)對二維變換而言,取tz0旋轉(zhuǎn)函數(shù):glRotatefd(theta, vx, vy, vz)向量(vx, vy, vz)為通過坐標(biāo)原點(diǎn)旋轉(zhuǎn)軸theta為旋轉(zhuǎn)角的度數(shù)放縮函數(shù):glScalefd(sx, sy, sz)相對坐標(biāo)原點(diǎn)的縮放當(dāng)參數(shù)為負(fù)時,相對于平面進(jìn)行對稱變換OpenGL 幾何變換函數(shù)例程序 6-1void display (void) glColor

10、3f (0.0, 0.0, 1.0); glRecti (20, 50, 100, 80); glColor3f (1.0, 0.0, 0.0); glTranslatef (-120.0, -40.0, 0.0); glRecti (20, 50, 100, 80); glLoadIdentity ( ); glColor3f (1.0, 0.0, 1.0); glRotatef (135.0, 0.0, 0.0, 1.0);glRecti (20, 50, 100, 80); glLoadIdentity ( ); glColor3f ( 0.0, 1.0,0.0); glScalef (

11、0.5, -1.0, 1.0); glRecti (20, 50, 100, 80); glColor3f(0,0,0); glLoadIdentity ( ); glBegin(GL_LINES); glVertex2i(0,-Y/2+5); glVertex2i(0,Y/2-5); glVertex2i(X/2-5,0); glVertex2i(-X/2+5,0); glEnd(); glutSwapBuffers();注意:幾何變換矩陣只有1個OpenGL幾何變換函數(shù)例6-1(續(xù))#include #include #include int X=0,Y=0;void Reshape(in

12、t width, int height) glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-width/2, width/2, -height/2, height/2); glMatrixMode(GL_MODELVIEW);/定義模型觀察變換矩陣 glLoadIdentity(); glClear (GL_COLOR_BUFFER_BIT); X=width, Y=height;void init (void) glClearColor (1.0, 1.0,

13、1.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 250.0, 0.0, 250.0);OpenGL幾何變換函數(shù)(續(xù))int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (300, 300); glutCreateWindow (Transformation); init ();

14、glutDisplayFunc(display); glutReshapeFunc(Reshape); glutMainLoop(); return 0;OpenGL幾何變換函數(shù)矩陣操作模型觀察矩陣:glMatrixMode(GL_MODELVIEW)建立當(dāng)前觀察矩陣還有兩種方式:紋理和顏色模式,默認(rèn)為觀察模式設(shè)置當(dāng)前矩陣為單位矩陣:glLoadIdentity()矩陣棧4種:觀察、投影、紋理初始狀態(tài)下,每棧僅包含一單位棧壓棧:glPushMatrix()出棧:glPopMatrix()OpenGL幾何變換函數(shù)機(jī)器人手臂#include #define BASE_HEIGHT 2.0#defi

15、ne BASE_RADIUS 1.0#define LOWER_ARM_HEIGHT 5.0#define LOWER_ARM_WIDTH 0.5#define UPPER_ARM_HEIGHT 5.0#define UPPER_ARM_WIDTH 0.5typedef float point3;GLfloat theta = 0.0,0.0,0.0;GLint axis = 0;GLUquadricObj *p; /* pointer to quadric(二次曲面) object */void myinit() glClearColor(1.0, 1.0, 1.0, 1.0); glCol

16、or3f(1.0, 0.0, 0.0); p=gluNewQuadric(); /* allocate quadric object */ gluQuadricDrawStyle(p, GLU_LINE); /* render it as wireframe */OpenGL幾何變換函數(shù)例62(續(xù))void base() glPushMatrix();/* rotate cylinder to align with y axis */ glRotatef(-90.0, 1.0, 0.0, 0.0);/* cyliner aligned with z axis*/ gluCylinder(p,

17、BASE_RADIUS, BASE_RADIUS, BASE_HEIGHT, 5, 5); glPopMatrix();void upper_arm() glPushMatrix(); glTranslatef(0.0, 0.5*UPPER_ARM_HEIGHT, 0.0); glScalef(UPPER_ARM_WIDTH, UPPER_ARM_HEIGHT, UPPER_ARM_WIDTH); glutWireCube(1.0); glPopMatrix();void lower_arm() glPushMatrix(); glTranslatef(0.0, 0.5*LOWER_ARM_H

18、EIGHT, 0.0); glScalef( LOWER_ARM_WIDTH, LOWER_ARM_HEIGHT, LOWER_ARM_WIDTH); glutWireCube(1.0); glPopMatrix();OpenGL幾何變換函數(shù)void display(void)/* Accumulate ModelView Matrix as we traverse tree */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); glRotatef(theta0, 0.0, 1.0, 0.0);

19、 base(); glTranslatef(0.0, BASE_HEIGHT, 0.0); glRotatef(theta1, 0.0, 0.0, 1.0); lower_arm(); glTranslatef(0.0, LOWER_ARM_HEIGHT, 0.0); glRotatef(theta2, 0.0, 0.0, 1.0); upper_arm(); glutSwapBuffers();void mouse(int btn, int state, int x, int y)/* left button increase joint angle, right button decrea

20、ses it */if(btn=GLUT_LEFT_BUTTON & state = GLUT_DOWN)thetaaxis += 5.0; if( thetaaxis 360.0 ) thetaaxis -= 360.0;if(btn=GLUT_RIGHT_BUTTON & state = GLUT_DOWN) thetaaxis -= 5.0; if( thetaaxis 360.0 ) thetaaxis += 360.0; display();OpenGL幾何變換函數(shù)void menu(int id)/* menu selects which angle to change or wh

21、ether to quit */ if(id = 1 ) axis=0; if(id = 2) axis=1; if(id = 3 ) axis=2; if(id =4 ) exit(0);void myReshape(int w, int h) glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w = h) glOrtho(-10.0, 10.0, -5.0 * (GLfloat) h / (GLfloat) w, 15.0 * (GLfloat) h / (GLfloat) w, -10.0

22、, 10.0); else glOrtho(-10.0 * (GLfloat) w / (GLfloat) h, 10.0 * (GLfloat) w / (GLfloat) h, -5.0, 15.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();OpenGL幾何變換函數(shù)void main(int argc, char *argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindo

23、wSize(500, 500); glutCreateWindow(robot); myinit(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutCreateMenu(menu); glutAddMenuEntry(base, 1); glutAddMenuEntry(lower arm, 2); glutAddMenuEntry(upper arm, 3); glutAddMenuEntry(quit, 4); glutAttachMenu(GLUT_MIDDLE_BUTTO

24、N); glutMainLoop();OpenGL幾何變換函數(shù)使用雙緩沖以GLUT_DOUBLE為參數(shù)調(diào)用glutInitDisplayMode,設(shè)置雙緩存的窗口模式在顯示回調(diào)函數(shù)的最后調(diào)用glutSwapBuffers()函數(shù)空閑函數(shù)(回調(diào)函數(shù))定義:如 void spinCube()功能:程序不受用戶干預(yù)時執(zhí)行spinCube()函數(shù)注冊:glutIdleFunc(spinCube) (在main函數(shù)中調(diào)用)重繪制函數(shù)glutPostRedisplay()OpenGL幾何變換函數(shù)旋轉(zhuǎn)的立方體8個頂點(diǎn)的顏色不同不停地旋轉(zhuǎn)鼠標(biāo)控制改變方向#include #include /定義頂點(diǎn)坐標(biāo)和顏色

25、GLfloat vertices3 = -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,1.0,1.0;GLfloat colors3 = 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; OpenGL幾何變換函數(shù)void polygon(int a, int b, int c

26、, int d)/* draw a polygon via list of vertices */ glBegin(GL_POLYGON); glColor3fv(colorsa); glVertex3fv(verticesa); glColor3fv(colorsb); glVertex3fv(verticesb); glColor3fv(colorsc); glVertex3fv(verticesc); glColor3fv(colorsd); glVertex3fv(verticesd); glEnd();void colorcube(void)/* map vertices to fa

27、ces */polygon(0,3,2,1);polygon(2,3,7,6);polygon(0,4,7,3);polygon(1,2,6,5);polygon(4,5,6,7);polygon(0,1,5,4);OpenGL幾何變換函數(shù)static GLfloat theta = 0.0,0.0,0.0;static GLint axis = 2;void display(void) /* display callback, clear frame buffer and z buffer, rotate cube and draw, swap buffers */ glClear(GL_C

28、OLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(theta0, 1.0, 0.0, 0.0); glRotatef(theta1, 0.0, 1.0, 0.0); glRotatef(theta2, 0.0, 0.0, 1.0); colorcube(); glutSwapBuffers();void spinCube()/* Idle callback, spin cube 2 degrees about selected axis */ thetaaxis += 2.0; if( thetaaxis 3

29、60.0 ) thetaaxis -= 360.0;/* display(); */ glutPostRedisplay();OpenGL幾何變換函數(shù)void mouse(int btn, int state, int x, int y)/* mouse callback, selects an axis about which to rotate */ if(btn=GLUT_LEFT_BUTTON & state = GLUT_DOWN) axis = 0; if(btn=GLUT_MIDDLE_BUTTON & state = GLUT_DOWN) axis = 1; if(btn=GL

30、UT_RIGHT_BUTTON & state = GLUT_DOWN) axis = 2;void myReshape(int w, int h) glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w = h) glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfl

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論