版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上海市寶山區(qū)揚(yáng)波中學(xué)高三開年第一考生物試題含解析
- 2025年山東省新高三5月校際聯(lián)合期中考試生物試題試卷含解析
- 初二下冊物理(北京版) 7.1 溫度 溫度計教案
- Unit2 My school things period1-3 教學(xué)設(shè)計-2024-2025學(xué)年外研版(三起)(2024)英語三年級上冊
- 酊劑行業(yè)相關(guān)項(xiàng)目創(chuàng)業(yè)計劃書
- 七年級生物上冊 第一單元 第一章 第一節(jié)生物的特征教案 (新版)新人教版
- 高中化學(xué) 第2章 化學(xué)反應(yīng)的方向、限度與速率 第1節(jié) 化學(xué)反應(yīng)的方向原理教案 魯科版選修4
- 中小學(xué)預(yù)防溺水專項(xiàng)安全教育活動實(shí)施方案
- 元旦假期安全教育講話稿
- 2025年遼寧省撫順市高三階段性測試(五)生物試題含解析
- 嘉興市產(chǎn)業(yè)發(fā)展集團(tuán)有限公司招聘筆試題庫2024
- 2024年河南省新安縣事業(yè)單位招聘80人歷年高頻500題難、易錯點(diǎn)模擬試題附帶答案詳解
- 《長征勝利萬歲》課件(33張)2024-2025學(xué)年高中語文統(tǒng)編版選擇性必修上冊第一單元
- 初中數(shù)學(xué)人教版八年級上冊 第十二章 全等三角形大單元教學(xué)設(shè)計
- 吉林省吉林市2024高三物理上學(xué)期10月第一次調(diào)研試題
- 【當(dāng)代中學(xué)地理教學(xué)課堂思政融入方式探究(后附問卷)8900字(論文)】
- 10.1 愛護(hù)身體 課件 -2024-2025學(xué)年統(tǒng)編版道德與法治七年級上冊
- 邵東縣文藝志愿者協(xié)會章程
- 第5課 推動高質(zhì)量發(fā)展
- 第3課 追求人生理想-【中職專用】2024年中職思想政治《哲學(xué)與人生》金牌課件(高教版2023·基礎(chǔ)模塊)
- 廣東省2024年高考物理試題(附答案解析)
評論
0/150
提交評論