![v804-第四章opengl的2d圖形渲染課程4二維變換_第1頁](http://file4.renrendoc.com/view/9b5a663346844df5c8eab259026b77bf/9b5a663346844df5c8eab259026b77bf1.gif)
![v804-第四章opengl的2d圖形渲染課程4二維變換_第2頁](http://file4.renrendoc.com/view/9b5a663346844df5c8eab259026b77bf/9b5a663346844df5c8eab259026b77bf2.gif)
![v804-第四章opengl的2d圖形渲染課程4二維變換_第3頁](http://file4.renrendoc.com/view/9b5a663346844df5c8eab259026b77bf/9b5a663346844df5c8eab259026b77bf3.gif)
![v804-第四章opengl的2d圖形渲染課程4二維變換_第4頁](http://file4.renrendoc.com/view/9b5a663346844df5c8eab259026b77bf/9b5a663346844df5c8eab259026b77bf4.gif)
![v804-第四章opengl的2d圖形渲染課程4二維變換_第5頁](http://file4.renrendoc.com/view/9b5a663346844df5c8eab259026b77bf/9b5a663346844df5c8eab259026b77bf5.gif)
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、二維變換學習如何使圖形運動平移變換、旋轉變換和放縮學會復雜變換的分解與合成學會使用OpenGL的幾何變換函數(shù)本章目標數(shù)學基礎二維幾何變換齊次坐標復合變換其它變換三維幾何變換圖形對象的幾何變換OpenGL的幾何變換函數(shù)主要內容矢量(vector)連接兩個點的有向線段。又稱向量行向量和列向量兩種表示矢量和數(shù)學基礎矢量的數(shù)乘矢量的點積運算性質數(shù)學基礎矢量的長度單位矢量 矢量間的夾角矢量的叉積右手法則數(shù)學基礎矩陣(Matrix)mn 階矩陣n階方陣(mn)單位矩陣 n階方陣,對角線元素為1, 其它元素為0數(shù)學基礎矩陣(續(xù))行向量與列向量當m1時,A退化為行向量a11, a12, , a1n當n1時,
2、A退化為列向量a11, a21, , am1T矩陣的加法 A=(aij)mn,B(bij) mnA與B的和記為AB性質:結合律和交換律數(shù)學基礎矩陣(續(xù))矩陣的數(shù)乘 矩陣的乘法 性質:結合律和分配律(不滿足交換律)數(shù)學基礎矩陣(續(xù))矩陣的轉置 矩陣的逆n階方陣A是可逆的,若存在另一個n階方陣B,使得 ABBAIn,稱B是A的逆陣,記為BA1數(shù)學基礎平移變換 (translation transformation)將點P(x, y)在x軸方向、y軸方向分別平移距離tx,ty,得到點P(x, y),則記為:T(tx , ty)矩陣表示:二維幾何變換旋轉變換(rotation transformati
3、on)如點P(x, y)的極坐標表示(r為P 到原點的距離)繞坐標原點(稱為參照點,基準點)旋轉角度 (逆時針為正,順時針為負)二維幾何變換旋轉變換(續(xù))記為:R()矩陣表示為:二維幾何變換放縮變換(scaling transformation)將點P(x, y)在x方向, y方向分別放縮 sx 和 sy 倍,得到點P(x, y)以坐標原點為放縮參照(基準)點不僅改變了物體的大小和形狀,也改變了它離原點的距離記為:S(sx, sy)二維幾何變換利用矩陣計算變換后的坐標時,平移、旋轉和放縮變換分別為:運算不統(tǒng)一,如何統(tǒng)一運算?二維幾何變換為什么需要齊次坐標?齊次坐標就是將一個原本是n維的向量用一
4、個n+1維向量來表示。例如,二維點(x,y)的齊次坐標表示為(hx,hy,h)。由此可以看出,一個向量的齊次表示是不唯一的,齊次坐標的h取不同的值都表示的是同一個點,比如齊次坐標(8,4,2)、(4,2,1)表示的都是二維點(4,2)齊次坐標為什么需要齊次坐標?對多個點計算多次不同的變換時,分別利用矩陣計算各變換導致計算量大運算表示形式不統(tǒng)一平移為“”旋轉和放縮為“”統(tǒng)一運算形式后,可以先合成變換運算的矩陣,再作用于圖形對象齊次坐標定義 Homogeneous Coordinate(x,y)點對應的齊次坐標定義為(x,y)點對應的齊次坐標為三維空間的一條直線 標準齊次坐標(x,y,1)h0表示
5、無窮遠點齊次坐標二維變換的矩陣表示平移變換旋轉變換齊次坐標放縮變換變換具有統(tǒng)一表示形式的優(yōu)點便于變換合成連續(xù)變換時,可以先得到變換的矩陣便于硬件實現(xiàn)齊次坐標變換的性質平移和旋轉變換具有可加性放縮變換具有可乘性齊次坐標逆變換逆平移變換:正平移距離tx,ty逆旋轉變換:旋轉角度為齊次坐標逆放縮變換:放縮系數(shù)為sx和sy齊次坐標變換合成方法:連續(xù)變換時,先計算變換矩陣,再計算坐標優(yōu)點:(1)提高了對圖形依次做多次變換的運算效率如:圖形上有n個頂點Pi,如果依次施加的變換為T,R,那么頂點Pi 變換后的坐標為每個頂點需要2次矩陣相乘只需要1次矩陣相乘復合變換變換合成(續(xù))(2)提供構造復雜變換的方法
6、對圖形作較復雜的變換時,不直接去計算這個變換,而是將其先分解成多個基本變換,再合成總的變換復合變換Composite transformation多個變換的組合可通過單個變換矩陣來計算矩陣乘積復合變換連續(xù)平移變換平移向量為(t1x,t1y)和(t2x,t2y)點P 經變換為P,則有復合矩陣復合平移變換連續(xù)旋轉P 經連續(xù)旋轉角度分別為 1 和 2 后連續(xù)旋轉具有相加性復合旋轉變換連續(xù)放縮連續(xù)放縮因子分別為:(s1x, s1y) 和 (s2x, s2y)復合放縮變換關于任意參照點 的旋轉變換步驟:(1)平移對象使參照(基準)點移到原點(2)繞坐標原點旋轉(3)平移對象使基準點回到原始位置二維基準點
7、旋轉關于任意參照點 的放縮變換 步驟:(1)平移對象使基準點與坐標原點重合(2)放縮變換(3)反向平移使得基準點回到初始位置二維基準點放縮變換合成時,矩陣相乘的順序單次變換:列向量表示點復合變換:先作用的放在連乘的右端,后作用的放在連乘的左端點表示成行向量呢?小結對稱變換(反射變換、鏡像變換:reflection)(1)關于 x 軸的對稱變換(2)關于 y 軸的對稱變換 其它變換(3)關于任意軸的對稱變換平移(tx, ty)使l 過坐標原點,記為T1旋轉,記R1對稱, 記SYx旋轉-,記 R2平移(-tx, -ty), 記T2總變換:T2R2 SYxR1 T1其它變換錯切變換(shear)依賴
8、軸:坐標保持不變的坐標軸,又稱參考軸方向軸:余下的坐標軸1、以y 軸為依賴軸的錯切變換 (1)以 y = 0為參考軸(坐標保持不變)Shx是對y=1上的點沿x軸移動的距離其它變換(2)以 y = yref 為參考軸x = x + shx ( y yref)y = y其它變換2、以x軸為依賴軸的錯切變換其它變換仿射變換affine transformation二維線性變換的一般形式平移,旋轉,放縮,對稱和錯切是特例特點:保持平行線間的平行關系其它變換例:證明二維復合變換的矩陣總能表示為: 證明:其它變換圖形對象點,線段,多邊形,圓,字符方法先生成點集,再對其中的點進行變換運算量大對參數(shù)變換線段:
9、兩個端點多邊形:各頂點圓:圓心和半徑前提圖形對象的幾何表示不發(fā)生變化圖形對象的幾何變換說明在核心庫中,每種幾何變換是一個獨立的函數(shù)所有變換都是在三維坐標系中定義基本幾何變換函數(shù)平移函數(shù):glTranslatefd(tx, ty, tz)對二維變換而言,取tz0旋轉函數(shù):glRotatefd(theta, vx, vy, vz)向量(vx, vy, vz)為通過坐標原點旋轉軸theta為旋轉角的度數(shù)放縮函數(shù):glScalefd(sx, sy, sz)相對坐標原點的縮放當參數(shù)為負時,相對于平面進行對稱變換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)建立當前觀察矩陣還有兩種方式:紋理和顏色模式,默認為觀察模式設置當前矩陣為單位矩陣:glLoadIdentity()矩陣棧4種:觀察、投影、紋理初始狀態(tài)下,每棧僅包含一單位棧壓棧:glPushMatrix()出棧:glPopMatrix()OpenGL幾何變換函數(shù)機器人手臂#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ù)調用glutInitDisplayMode,設置雙緩存的窗口模式在顯示回調函數(shù)的最后調用glutSwapBuffers()函數(shù)空閑函數(shù)(回調函數(shù))定義:如 void spinCube()功能:程序不受用戶干預時執(zhí)行spinCube()函數(shù)注冊:glutIdleFunc(spinCube) (在main函數(shù)中調用)重繪制函數(shù)glutPostRedisplay()OpenGL幾何變換函數(shù)旋轉的立方體8個頂點的顏色不同不停地旋轉鼠標控制改變方向#include #include /定義頂點坐標和顏色
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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級數(shù)學口算題
- 青島版數(shù)學七年級上冊5.2《代數(shù)式》聽評課記錄
- 魯教版地理六年級下冊6.2《自然環(huán)境》聽課評課記錄3
- 蘇教版三年級下冊《兩位數(shù)乘整十數(shù)的口算》教案
- 委托經營管理協(xié)議書范本
- 蘇州蘇教版三年級數(shù)學上冊《周長是多少》聽評課記錄
- 產品銷售合作協(xié)議書范本(代理商版本)
- 書稿專用版權合同范本
- 酒店房屋出租辦公經營協(xié)議書范本
- 部編版道德與法治九年級下冊《1.2復雜多變的關系》聽課評課記錄
- 2024年海南文昌市事業(yè)單位招聘工作人員148人筆試高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 義務教育數(shù)學新課標課程標準2022年版考試真題與答案
- 英語語法基礎知識大全
- 河南省安陽市2024年中考一模語文試卷(含答案)
- TD/T 1044-2014 生產項目土地復墾驗收規(guī)程(正式版)
- 2024年湖南現(xiàn)代物流職業(yè)技術學院單招職業(yè)適應性測試題庫及答案1套
- (正式版)JTT 1499-2024 公路水運工程臨時用電技術規(guī)程
- 2024年職業(yè)技能測試題庫500道【基礎題】
- 垃圾桶創(chuàng)新設計說明書
- 《游戲界面設計專題實踐》課件-知識點1:游戲圖標設計定義、分類與設計原則
- 病案信息技術(中級)考試真題及答案5篇
評論
0/150
提交評論