計(jì)算機(jī)圖形學(xué)第3章變換2007._第1頁
計(jì)算機(jī)圖形學(xué)第3章變換2007._第2頁
計(jì)算機(jī)圖形學(xué)第3章變換2007._第3頁
計(jì)算機(jī)圖形學(xué)第3章變換2007._第4頁
計(jì)算機(jī)圖形學(xué)第3章變換2007._第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第三章第三章 變換變換圖形是如何通過變換顯示在屏幕上的?圖形是如何通過變換顯示在屏幕上的?如何在場(chǎng)景中設(shè)定相機(jī)位置如何在場(chǎng)景中設(shè)定相機(jī)位置如何在場(chǎng)景中定位對(duì)象如何在場(chǎng)景中定位對(duì)象如何建立投影變換如何建立投影變換如何建立透視變換如何建立透視變換如何進(jìn)行視區(qū)變換如何進(jìn)行視區(qū)變換執(zhí)行自己的矩陣變換執(zhí)行自己的矩陣變換照相機(jī)與計(jì)算機(jī)類比照相機(jī)與計(jì)算機(jī)類比相機(jī)和物體的相對(duì)位置相機(jī)和物體的相對(duì)位置照相機(jī)與計(jì)算機(jī)類比照相機(jī)與計(jì)算機(jī)類比1.1.視圖變換(相當(dāng)于將相機(jī)放在合適的地方對(duì)視圖變換(相當(dāng)于將相機(jī)放在合適的地方對(duì)準(zhǔn)準(zhǔn)3D3D景物)景物)2.2.模型變換(相當(dāng)于將模型變換(相當(dāng)于將3D3D物體放在合適的地方

2、)物體放在合適的地方)3.3.投影變換(相當(dāng)于將相機(jī)鏡頭調(diào)整,使投影變換(相當(dāng)于將相機(jī)鏡頭調(diào)整,使3D3D景景物投影在物投影在2D2D膠片上,裁剪、改變大?。┠z片上,裁剪、改變大?。?.4.視區(qū)變換(決定膠片大小)視區(qū)變換(決定膠片大?。?一個(gè)一個(gè)3D3D圖形的顯示包括下面步驟:圖形的顯示包括下面步驟: 眼坐標(biāo):想象成眼坐標(biāo):想象成“ “絕對(duì)絕對(duì)” ”屏幕坐標(biāo)。默認(rèn)為屏幕原點(diǎn),屏幕坐標(biāo)。默認(rèn)為屏幕原點(diǎn),z z軸指軸指向用戶。可以理解為一個(gè)虛擬坐標(biāo)系。眼坐標(biāo)不是真正的坐向用戶??梢岳斫鉃橐粋€(gè)虛擬坐標(biāo)系。眼坐標(biāo)不是真正的坐標(biāo),而是虛擬的固定坐標(biāo)系。標(biāo),而是虛擬的固定坐標(biāo)系。 用用3D OpenGL

3、3D OpenGL繪圖,笛卡兒坐標(biāo)系,未變換時(shí),二者相同。繪圖,笛卡兒坐標(biāo)系,未變換時(shí),二者相同。 所有變換是將當(dāng)前坐標(biāo)系相對(duì)于眼坐標(biāo)系進(jìn)行修改。所有變換是將當(dāng)前坐標(biāo)系相對(duì)于眼坐標(biāo)系進(jìn)行修改。基本概念基本概念 xyxyz 變換本質(zhì):移動(dòng)或旋轉(zhuǎn)對(duì)象就是相對(duì)于眼坐標(biāo)系移變換本質(zhì):移動(dòng)或旋轉(zhuǎn)對(duì)象就是相對(duì)于眼坐標(biāo)系移動(dòng)和旋轉(zhuǎn)。下圖動(dòng)和旋轉(zhuǎn)。下圖 變換的問題,就是修改當(dāng)前坐標(biāo)系,在坐標(biāo)系下的變換的問題,就是修改當(dāng)前坐標(biāo)系,在坐標(biāo)系下的圖形自然就變換了。圖形自然就變換了。基本概念基本概念 xyyxOpenglOpengl變換變換 變換變換用途用途視圖視圖指定觀察者的位置指定觀察者的位置模型模型在場(chǎng)景中移動(dòng)

4、對(duì)象在場(chǎng)景中移動(dòng)對(duì)象模型視圖模型視圖描述視圖對(duì)象和模型變描述視圖對(duì)象和模型變換的對(duì)偶性換的對(duì)偶性投影投影對(duì)視見空間進(jìn)行裁剪或?qū)σ曇娍臻g進(jìn)行裁剪或改變大小改變大小視區(qū)視區(qū)對(duì)到窗口的最終輸出進(jìn)對(duì)到窗口的最終輸出進(jìn)行縮放行縮放 視圖變換:場(chǎng)景中的第一個(gè)變換,解決視圖變換:場(chǎng)景中的第一個(gè)變換,解決把視點(diǎn)放在把視點(diǎn)放在什么地方的問題什么地方的問題。作為一個(gè)參考坐標(biāo)系。作為一個(gè)參考坐標(biāo)系。 一般先指定視圖變換,再指定其他變換。一般先指定視圖變換,再指定其他變換。 視圖變換的視點(diǎn)應(yīng)當(dāng)有利于看物體和場(chǎng)景。如下圖視圖變換的視點(diǎn)應(yīng)當(dāng)有利于看物體和場(chǎng)景。如下圖視圖變換視圖變換視點(diǎn)視點(diǎn)眼坐標(biāo)系眼坐標(biāo)系視點(diǎn)視點(diǎn) 目的:

5、把對(duì)象移動(dòng)到合適的位置目的:把對(duì)象移動(dòng)到合適的位置 在方向、尺寸和形狀等方面的變化可以通過改變對(duì)在方向、尺寸和形狀等方面的變化可以通過改變對(duì)象坐標(biāo)描述的幾何變換來實(shí)現(xiàn)。即象坐標(biāo)描述的幾何變換來實(shí)現(xiàn)。即模型變換,針對(duì)模型變換,針對(duì)模型本身,如平移、旋轉(zhuǎn)、比例等。模型本身,如平移、旋轉(zhuǎn)、比例等。 模型視圖的對(duì)偶性:模型變換或視圖變換二者是相模型視圖的對(duì)偶性:模型變換或視圖變換二者是相同的,例如,定義了視點(diǎn),就改變了對(duì)象的位置。同的,例如,定義了視點(diǎn),就改變了對(duì)象的位置。 向前移動(dòng)坐標(biāo)系和向后移動(dòng)對(duì)象是等效的。這里稱向前移動(dòng)坐標(biāo)系和向后移動(dòng)對(duì)象是等效的。這里稱為模型視圖變換。而這取一即可。為模型視圖

6、變換。而這取一即可。模型變換模型變換 先繞先繞z z旋轉(zhuǎn),再沿旋轉(zhuǎn),再沿x x軸平移軸平移 先沿先沿x x軸平移,再繞軸平移,再繞z z軸旋轉(zhuǎn)軸旋轉(zhuǎn)模型變換的順序及作用模型變換的順序及作用xyyxxyy xxyyxyxyyyyx每次變換都是相對(duì)于剛執(zhí)行完每次變換都是相對(duì)于剛執(zhí)行完的變換來進(jìn)行的。的變換來進(jìn)行的。投影變換投影變換 目的:定義視見空間(裁剪體)目的:定義視見空間(裁剪體) 投影類型:正交投影投影類型:正交投影/透視投影透視投影 正交投影:用于工程視圖,表達(dá)真實(shí)尺寸正交投影:用于工程視圖,表達(dá)真實(shí)尺寸 透視投影:具有縱深感效果透視投影:具有縱深感效果cccceeeewzyxwzyx矩

7、陣投影Orthographic ProjectionDOPsame for all pointsOrthographic ProjectionsDOP is perpendicular to the view plane透視投影透視投影 目的:把投影后的物體映射到屏幕上某個(gè)位目的:把投影后的物體映射到屏幕上某個(gè)位置置 視區(qū)變換可以在屏幕上指定任意位置放顯示視區(qū)變換可以在屏幕上指定任意位置放顯示的圖像的圖像 上述所有的變換都可以用矩陣變換實(shí)現(xiàn)上述所有的變換都可以用矩陣變換實(shí)現(xiàn)視區(qū)變換視區(qū)變換頂點(diǎn)變換各階段頂點(diǎn)變換各階段XYZwModelviewMatrixProjectionMatrixPers

8、pectivedivisionViewportTransformationTransformed eye coordinatesnormalized device coordinatesclipcoordinateswindow coordinates3D3D顯示流程圖顯示流程圖CTMverticesverticesCURRENT TRANSFORMATION MATRIX?CTMMODEL VIEWPROJECTIONCURRENT TRANSFORMATION MATRIXverticesvertices模型視圖變換矩陣模型視圖變換矩陣 首先必須設(shè)定矩陣模式為:首先必須設(shè)定矩陣模式為: 模

9、型視圖變換模型視圖變換glMatrixMode(GL_MODELVIEWglMatrixMode(GL_MODELVIEW);); 4 44 4矩陣矩陣: : 物體的頂點(diǎn)是一個(gè)頂點(diǎn)陣矢量物體的頂點(diǎn)是一個(gè)頂點(diǎn)陣矢量V.V. 每個(gè)繪制過程之前,都要進(jìn)行變換每個(gè)繪制過程之前,都要進(jìn)行變換V V M = V M = V eeeewzyxwzyx圖矩陣模型視0000模型視圖變換矩陣模型視圖變換矩陣 模型變換矩陣和視圖變換的矩陣區(qū)別:模型變換矩陣和視圖變換的矩陣區(qū)別:如果按照模型變換理解,則是按照變換函數(shù)的順序如果按照模型變換理解,則是按照變換函數(shù)的順序執(zhí)行,而且坐標(biāo)系隨之變換;相當(dāng)于相對(duì)坐標(biāo)系,執(zhí)行,而

10、且坐標(biāo)系隨之變換;相當(dāng)于相對(duì)坐標(biāo)系,后面的坐標(biāo)系是針對(duì)這個(gè)相對(duì)坐標(biāo)系的后面的坐標(biāo)系是針對(duì)這個(gè)相對(duì)坐標(biāo)系的執(zhí)行順序:先執(zhí)行平移變換(執(zhí)行順序:先執(zhí)行平移變換(M1M1),再執(zhí)行旋轉(zhuǎn)變換),再執(zhí)行旋轉(zhuǎn)變換(M2M2)。效果:作用于對(duì)象。)。效果:作用于對(duì)象。M1M2M1M2xyxyyyyx模型視圖變換矩陣模型視圖變換矩陣如果按照視圖坐標(biāo)系理解,則是按照變換函數(shù)的逆如果按照視圖坐標(biāo)系理解,則是按照變換函數(shù)的逆序執(zhí)行,坐標(biāo)系不變;相當(dāng)于絕對(duì)坐標(biāo)系變換序執(zhí)行,坐標(biāo)系不變;相當(dāng)于絕對(duì)坐標(biāo)系變換. .執(zhí)行順序:相對(duì)于先執(zhí)行相對(duì)絕對(duì)坐標(biāo)系旋轉(zhuǎn),再相執(zhí)行順序:相對(duì)于先執(zhí)行相對(duì)絕對(duì)坐標(biāo)系旋轉(zhuǎn),再相對(duì)絕對(duì)坐標(biāo)系平移

11、對(duì)絕對(duì)坐標(biāo)系平移 M1M2M1M2xyyyxxxyxyyyyx模型視圖變換矩陣應(yīng)用舉例模型視圖變換矩陣應(yīng)用舉例 例如:畫一個(gè)邊長為例如:畫一個(gè)邊長為1010的正方形:的正方形:glutWireCube(10.0f)glutWireCube(10.0f);(默認(rèn)坐標(biāo)在原點(diǎn));(默認(rèn)坐標(biāo)在原點(diǎn)) 如果在如果在y y1010的地方畫這個(gè)塊呢?的地方畫這個(gè)塊呢?考慮把模型放在哪里?(或者照相機(jī)在哪考慮把模型放在哪里?(或者照相機(jī)在哪里?):指定矩陣模式里?):指定矩陣模式確定確定矩陣矩陣參數(shù):參數(shù): glTranslatef(0.0,10.0,0.0);畫畫glutWireCube(10.0f)glu

12、tWireCube(10.0f);此時(shí)會(huì)在新地方畫此時(shí)會(huì)在新地方畫出圖形出圖形glMatrixMode(GL_MODELVIEW);1010000100001lllzyx如果是旋轉(zhuǎn)呢?如果是旋轉(zhuǎn)呢?如果是比例呢?如果是比例呢?模型視圖變換矩陣應(yīng)用舉例模型視圖變換矩陣應(yīng)用舉例10模型視圖變換矩陣應(yīng)用舉例模型視圖變換矩陣應(yīng)用舉例 注意的問題:注意的問題:模型放在什么地方模型放在什么地方裁剪窗口的設(shè)定,如果不當(dāng),易造成看不到圖裁剪窗口的設(shè)定,如果不當(dāng),易造成看不到圖形形 例子:幾何變換例子:幾何變換/trans/trans,說明如下問題:,說明如下問題:變換矩陣的影響(比例、平移、旋轉(zhuǎn))變換矩陣的影

13、響(比例、平移、旋轉(zhuǎn))裁剪窗口的影響裁剪窗口的影響平移、旋轉(zhuǎn)變換函數(shù)平移、旋轉(zhuǎn)變換函數(shù)平移:平移:void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glTranslatef(GLfloat x, GLfloat y, GLfloat z );旋轉(zhuǎn):繞矢量逆時(shí)針旋轉(zhuǎn)角度旋轉(zhuǎn):繞矢量逆時(shí)針旋轉(zhuǎn)角度void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z );void glRotatef(GLfloat angle, GLfloat x, GLfloat

14、y, GLfloat z );比例變換比例變換 比例:在比例:在XYZ XYZ 方向縮放方向縮放, ,縮放因子縮放因子為為 x y zx y zvoid glScaled(GLdouble x, GLdouble y, GLdouble z );void glScalef(GLfloat x, GLfloat y, GLfloat z); 1000000000000zyx變換變換/trans變換變換/trans-trs把單位矩陣加載到模型視圖矩陣把單位矩陣加載到模型視圖矩陣 glMatrixMode(GL_MODELVIEW); glLoadIdentity();當(dāng)前矩陣指定為當(dāng)前矩陣指定為模

15、型視圖矩陣模型視圖矩陣矩陣復(fù)位到原點(diǎn)矩陣復(fù)位到原點(diǎn)為什么?為什么?模型視圖矩陣中的單位矩陣模型視圖矩陣中的單位矩陣 連續(xù)變換:兩個(gè)以上變換的效果連續(xù)變換:兩個(gè)以上變換的效果變換累加的原因:變換相對(duì)于當(dāng)前矩陣。結(jié)果不變換累加的原因:變換相對(duì)于當(dāng)前矩陣。結(jié)果不正確。正確。單位矩陣的作用:單位矩陣的作用:每次變換完,回到初始位置,每次變換完,回到初始位置,指定單位矩陣,新的變換是相對(duì)單位矩陣的。指定單位矩陣,新的變換是相對(duì)單位矩陣的。畫畫2個(gè)圓個(gè)圓Y移動(dòng)移動(dòng)+10X移動(dòng)移動(dòng)10實(shí)際變換結(jié)果:實(shí)際變換結(jié)果:第二個(gè)矩陣是針第二個(gè)矩陣是針對(duì)當(dāng)前矩陣對(duì)當(dāng)前矩陣模型變換舉例模型變換舉例 Example:Exa

16、mple:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0,10.0,0.0);glutSolidSphere(1.0,15,15);/畫第一個(gè)球畫第一個(gè)球 glLoadIdentity(); glTranslatef(10.0,0.0,0.0); glutSolidSphere(1.0,15,15);/);/畫第二個(gè)球畫第二個(gè)球例子:幾何變換例子:幾何變換/ttrans/ttrans畫畫2個(gè)圓個(gè)圓Y移動(dòng)移動(dòng)+10X移動(dòng)移動(dòng)10矩陣堆棧矩陣堆棧 用戶存儲(chǔ)當(dāng)前變換矩陣,壓入堆棧,用用戶存儲(chǔ)當(dāng)前變換矩陣,壓入堆棧,用 glPu

17、shMatrixglPushMatrix()() 使用堆棧,彈出使用堆棧,彈出用用 glPopMatrixglPopMatrix()() 這個(gè)命令只在使用這個(gè)命令只在使用 GL_MODELVIEWGL_MODELVIEW 矩陣矩陣模式下。模式下。 目的:處理復(fù)雜的多個(gè)相對(duì)中心的變換,目的:處理復(fù)雜的多個(gè)相對(duì)中心的變換,例如太陽地球月亮運(yùn)轉(zhuǎn)變換例如太陽地球月亮運(yùn)轉(zhuǎn)變換矩陣堆棧矩陣堆棧 用途:如果后面的變換經(jīng)常用到某個(gè)變用途:如果后面的變換經(jīng)常用到某個(gè)變換,而又不希望矩陣復(fù)位,則放入堆棧,換,而又不希望矩陣復(fù)位,則放入堆棧,需要時(shí)彈出使用需要時(shí)彈出使用 OpenGLOpenGL有有3 3個(gè)堆棧:個(gè)

18、堆棧:模型視圖矩陣堆棧,模型視圖矩陣堆棧,投影矩陣堆棧,投影矩陣堆棧,紋理堆棧。紋理堆棧。模式模式設(shè)定設(shè)定StackCurrentStackCurrentLoad MatrixVertices3DModelVertices3D2DModelviewProjectionMatrix Mode模式指定后面模式指定后面的矩陣屬于哪的矩陣屬于哪個(gè)堆棧的變換個(gè)堆棧的變換glMatrixMode(?);指定是什么變換指定是什么變換變換變換矩陣堆棧舉例矩陣堆棧舉例 程序程序5.1 atom-5.1 atom-原子核運(yùn)動(dòng)原子核運(yùn)動(dòng) 原子核中心(原子核中心(0,0,-1000,0,-100) 3 3個(gè)電子圍繞原

19、子核在不同的軌跡上運(yùn)動(dòng)個(gè)電子圍繞原子核在不同的軌跡上運(yùn)動(dòng)第一個(gè):在第一個(gè):在x-zx-z平面繞平面繞y y軸運(yùn)動(dòng)軸運(yùn)動(dòng)第二個(gè):在一個(gè)法矢第二個(gè):在一個(gè)法矢4545度的平面上過原子核的度的平面上過原子核的空間空間4545度的軸運(yùn)動(dòng)度的軸運(yùn)動(dòng)第三個(gè):在一個(gè)法矢第三個(gè):在一個(gè)法矢4545度的平面上過原子核度的平面上過原子核的空間的空間4545度的軸運(yùn)動(dòng)度的軸運(yùn)動(dòng)矩陣堆棧舉例矩陣堆棧舉例 和動(dòng)畫有關(guān)的一些函數(shù)和動(dòng)畫有關(guān)的一些函數(shù) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);/雙緩存雙緩存 glutTimerFunc(500, Tim

20、erFunc, 1);/一次激發(fā)一次激發(fā)定時(shí)器定時(shí)器 glutPostRedisplayglutPostRedisplay();/();/重新刷新當(dāng)前窗口重新刷新當(dāng)前窗口 glutSwapBuffersglutSwapBuffers();/();/光滑實(shí)現(xiàn)雙緩沖變換光滑實(shí)現(xiàn)雙緩沖變換矩陣堆棧舉例矩陣堆棧舉例 分析:分析: 運(yùn)動(dòng):定時(shí)發(fā)消息,注冊(cè)函數(shù)有時(shí)間事件運(yùn)動(dòng):定時(shí)發(fā)消息,注冊(cè)函數(shù)有時(shí)間事件glutTimerFunc(500, TimerFunc, 1);/時(shí)間事時(shí)間事件函數(shù)件函數(shù)注冊(cè)函數(shù)注冊(cè)函數(shù)調(diào)用注冊(cè)函數(shù)前調(diào)用注冊(cè)函數(shù)前等待的時(shí)間等待的時(shí)間傳送給回調(diào)函數(shù)傳送給回調(diào)函數(shù)的值的值功能:只激發(fā)

21、一次功能:只激發(fā)一次 定時(shí)的實(shí)現(xiàn):不斷調(diào)用定時(shí)器自身,不斷刷新定時(shí)的實(shí)現(xiàn):不斷調(diào)用定時(shí)器自身,不斷刷新 刷新過程:雙緩沖不斷交換刷新過程:雙緩沖不斷交換矩陣堆棧舉例矩陣堆棧舉例 繞繞y軸:每次時(shí)間事件,讓小球相對(duì)軸:每次時(shí)間事件,讓小球相對(duì)y軸轉(zhuǎn)一個(gè)角度軸轉(zhuǎn)一個(gè)角度(2個(gè)函數(shù)實(shí)現(xiàn))為什么不是一個(gè)旋轉(zhuǎn)函數(shù)?個(gè)函數(shù)實(shí)現(xiàn))為什么不是一個(gè)旋轉(zhuǎn)函數(shù)? 繞空間繞空間45度的軸:讓小球把相對(duì)度的軸:讓小球把相對(duì)y軸轉(zhuǎn)到軸轉(zhuǎn)到45度,度,然后繞這個(gè)新然后繞這個(gè)新y軸旋轉(zhuǎn)(軸旋轉(zhuǎn)(3個(gè)函數(shù)實(shí)現(xiàn))個(gè)函數(shù)實(shí)現(xiàn)) 繞空間繞空間45度的軸:讓小球把相對(duì)度的軸:讓小球把相對(duì)y軸轉(zhuǎn)到軸轉(zhuǎn)到45度,度,然后繞這個(gè)新然后繞這個(gè)

22、新y軸旋轉(zhuǎn)(軸旋轉(zhuǎn)(3個(gè)函數(shù)實(shí)現(xiàn))個(gè)函數(shù)實(shí)現(xiàn))Atom:改顏色,關(guān)閉其他球,改速度:改顏色,關(guān)閉其他球,改速度Solar:glTranslatef(0.0f, 0.0f, -100.0f);/紅色球放置在紅色球放置在100處處/ Red NucleusglColor3ub(255, 0, 0);glutSolidSphere(30.0f, 15, 15);/在平移后的坐標(biāo)系處畫紅球在平移后的坐標(biāo)系處畫紅球/ Yellow ElectronsglColor3ub(255,255,0);glPushMatrix();/把把z100的矩陣入棧,同時(shí)它還繼續(xù)使用的矩陣入棧,同時(shí)它還繼續(xù)使用glRota

23、tef(fElect1, 0.0f, 1.0f, 0.0f);/繞紅球所在坐標(biāo)系的繞紅球所在坐標(biāo)系的Y軸旋軸旋轉(zhuǎn)轉(zhuǎn)glTranslatef(90.0f, 0.0f, 0.0f);/沿旋轉(zhuǎn)后的坐標(biāo)系平移,定位沿旋轉(zhuǎn)后的坐標(biāo)系平移,定位1號(hào)號(hào)小球的位置小球的位置glutSolidSphere(6.0f, 15, 15);/在在1號(hào)小球位置畫號(hào)小球位置畫1號(hào)球號(hào)球透視投影透視投影透視投影變換方法透視投影變換方法1 1 透視投影(透視投影(“近大遠(yuǎn)小近大遠(yuǎn)小”),有深度感,),有深度感,用這個(gè)矩陣乘以當(dāng)前矩用這個(gè)矩陣乘以當(dāng)前矩陣,以完成變換陣,以完成變換 void glFrustum(GLdouble

24、 left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); 創(chuàng)建一個(gè)平行錐狀視見體矩陣,創(chuàng)建一個(gè)平行錐狀視見體矩陣,將將(left bottom znear )(right, top, zfar) 內(nèi)的圖形內(nèi)的圖形投影到投影到z far平面上平面上用途:把用途:把3D 模型投影到模型投影到2D平面上平面上透視投影變換方法透視投影變換方法2 2 gluPerspective(fovy, Aspect, znear, zfar); 用途:把用途:把3D 模型投影到模型投影到2D平面上,

25、用得比較多平面上,用得比較多更直觀更直觀垂直方向上的錐角垂直方向上的錐角縱橫比縱橫比whfovy變換變換/perspect3D3D正交投影前后面可指定正交投影前后面可指定void glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top,Gldouble near, Gldouble far);用途:定義一個(gè)用途:定義一個(gè)3D3D裁剪空間裁剪空間2D正交投影前后面固定正交投影前后面固定glOrtho2D(GLdouble left, Gldouble right, Gldouble bottom, Gldouble

26、 top);用途:定義了一個(gè)窗口,作為裁剪域,即:用途:定義了一個(gè)窗口,作為裁剪域,即:x1 = left, x2 = right, y1 = bottom, y2 = top 把場(chǎng)景投影到屏幕上把場(chǎng)景投影到屏幕上 指定指定2D2D圖形放在屏幕的什么地方圖形放在屏幕的什么地方 每當(dāng)窗口改變時(shí),可得到新的窗口每當(dāng)窗口改變時(shí),可得到新的窗口w w、h h 保證圖形不變形,與保證圖形不變形,與OrthoOrtho配合進(jìn)行修正配合進(jìn)行修正視區(qū)變換視區(qū)變換 w w、h h會(huì)影響圖形變形,要檢測(cè)窗口尺寸,會(huì)影響圖形變形,要檢測(cè)窗口尺寸,進(jìn)行寬度和高度修正,保證圖象不變形進(jìn)行寬度和高度修正,保證圖象不變形

27、視區(qū)變換視區(qū)變換 函數(shù)函數(shù)glViewportglViewport ( (int x, intint x, int y y, sizei w, sizei, sizei w, sizei h); h);其中:其中:前前2 2項(xiàng)表示屏幕窗口中的視區(qū)的左下角坐標(biāo),項(xiàng)表示屏幕窗口中的視區(qū)的左下角坐標(biāo),后后2 2項(xiàng)表示視區(qū)的寬度和高度。(以像素為單位)項(xiàng)表示視區(qū)的寬度和高度。(以像素為單位)默認(rèn)視區(qū)為整個(gè)窗口默認(rèn)視區(qū)為整個(gè)窗口.wh例子:變換例子:變換/viewport幾個(gè)概念之間的關(guān)系幾個(gè)概念之間的關(guān)系 窗口:窗口:windows生成的一個(gè)矩形區(qū)域生成的一個(gè)矩形區(qū)域ww,hw 視區(qū):在窗口上的一個(gè)矩

28、形區(qū)域,由用戶指定新的視區(qū):在窗口上的一個(gè)矩形區(qū)域,由用戶指定新的wv,hv 視見空間:用戶定義的一個(gè)有界裁剪空間視見空間:用戶定義的一個(gè)有界裁剪空間 當(dāng)窗口改變,得到新的當(dāng)窗口改變,得到新的ww,hw ,必須:,必須: 視見空間映射到視區(qū)上視見空間映射到視區(qū)上 視區(qū)放到窗口上視區(qū)放到窗口上wvhvwwhw視區(qū)與正交投影的配合使用視區(qū)與正交投影的配合使用縱橫比:垂直方向上一個(gè)單位長度的像素?cái)?shù)縱橫比:垂直方向上一個(gè)單位長度的像素?cái)?shù)與水平方向上相同長度單位的像素?cái)?shù)之比與水平方向上相同長度單位的像素?cái)?shù)之比縱橫比縱橫比1,正方形,正方形縱橫比縱橫比0.5,水平方向每兩個(gè)像素為一個(gè)單位水平方向每兩個(gè)像素

29、為一個(gè)單位長度,垂直方向一個(gè)像素為單位長度長度,垂直方向一個(gè)像素為單位長度修改視見空間的目的:保證視見空間的縱橫修改視見空間的目的:保證視見空間的縱橫比與視區(qū)縱橫比相同比與視區(qū)縱橫比相同視區(qū)與正交投影的配合使用視區(qū)與正交投影的配合使用 glViewport(x, y, w, h);OpenGL修改裁剪空間配合到視區(qū)的映射。修改裁剪空間配合到視區(qū)的映射。為保證圖形不變形,修改裁剪空間為保證圖形不變形,修改裁剪空間左下角點(diǎn)左下角點(diǎn)視區(qū)大小視區(qū)大小視區(qū)與正交投影的配合使用視區(qū)與正交投影的配合使用if(w1, (250*h/w -0)/ (250-0)=h/w當(dāng)當(dāng)w/h1, (250-0)/(250*

30、w/h-0)=h/w程序用例正交投影(物體不位于中心)程序用例正交投影(物體不位于中心)void ChangeSize(GLsizei w, GLsizei h)GLfloat nRange = 120.0f;/ Prevent a divide by zeroif(h = 0)h = 1;/ Set Viewport to window dimensions glViewport(0, 0, w, h);/ Reset coordinate systemglMatrixMode(GL_PROJECTION);glLoadIdentity();例子:變換例子:變換/viewport程序用例正交

31、投影(續(xù))程序用例正交投影(續(xù)) if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();程序用例正交投影(物體位于中心)程序用例正交投影(物體位于中心)void ChangeSize(GLsizei w, GLsizei h)GLfloat nRange = 120.0f;/ Prevent a divide by zeroif(h = 0)h = 1;/ Set Viewport to window dimensions glViewport(0, 0, w, h);/ Reset coordinate systemglMatrixMode(GL_PROJECTION);glLoadIdentity();例子:變換例子:變換/viewport-center程序用例正交投影(續(xù)程序用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論