



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Computer Graphics第六章 三維空間的觀察Computer Graphics 第六章 三維空間的觀察v 主要討論 投影的數(shù)學(xué)表示 三維觀察中的投影 視見體到規(guī)范視見體的變換 用三維規(guī)范體裁剪在三維視見體內(nèi)裁剪三維物體投影變換至視口二維圖形圖6.1 三維觀察的概念模型Computer Graphics 6.1 投 影 v 什么是投影變換什么是投影變換( (或投影變換的作用或投影變換的作用):): 由于顯示器和繪圖機(jī)只能用二維空間來表示圖形,要顯示三維圖形就要把三維坐標(biāo)表示的幾何形體變換成二維坐標(biāo)表示的圖形,這就是圖形的投影變換投影變換。v 投影變換的要素投影變換的要素 視點(diǎn)(投影中
2、心),投影平面 投影線,投影v 投影變換的類型投影變換的類型 透視投影透視投影:投影中心和投影面之間的距離是有限的 平行投影平行投影:投影中心和投影平面之間的距離是無限的 根據(jù)投影方向與投影平面之間的關(guān)系,平行投影分為正投影正投影與斜投影斜投影視點(diǎn)投影平面投影線Computer Graphics 6.1.1 透視投影 圖6.3 為 的投影PQCoPQCxyzPQ圖6.4 在 平面上的正投影oxzPQCzxo pxxcxzcz 在坐標(biāo)系 中來討論投影,假定投影平面是 。設(shè)視點(diǎn) ,空間中任一點(diǎn) 在 平面上的投影為 zyxo0z) , ,(ccczyxC) , ,(zyxQ0z)0 , ,(ppyx
3、P,如圖6.3所示,則下式成立: ccccpccpzzzyyyyxxxx(6.1) Computer Graphics平面上的正投影分別為 透視投影的計(jì)算公式,Q,PC,Q,PCzxo設(shè) 在則式(6.1)的幾何意義如圖6.4所示。zzzyyyyzzzxxxxccccpccccp)()((6.2) 寫成齊次坐標(biāo)表達(dá)式為:11000000zyxzyzxzqyxcccccqq(6.3) qyyqxxqpqp ,(6.4) 由式(6.1)得:圖6.3 為 的投影PQCoPQCxyzPQ圖6.4 在 平面上的正投影oxzPQCzxo pxxcxzczComputer Graphics 6.1.2 平行投
4、影 v 平行投影分為正投影與斜投影 正投影正投影:投影方向與投影平面法向相同。常見的正投影類型有: 正視圖投影: 俯視圖投影: 側(cè)視圖投影: 等軸測(cè)投影:投影平面的法向與每個(gè)坐標(biāo)軸的夾角相等; 斜投影斜投影,常見的斜投影類型有: 斜等測(cè)投影:投影方向與投影平面成45度角; 斜二測(cè)投影:投影方向和投影平面的夾角為arctan(2)。圖6.5 三視圖正 視圖側(cè) 視圖原 物體俯視圖(a)斜等測(cè)投影(b)斜二測(cè)投影圖6.6 斜投影Computer Graphics軸測(cè)投影 axonometric projectionv軸測(cè)投影是平行投影的一種,可以使三個(gè)坐標(biāo)面在一個(gè)投影上都能看到,從而具有立體感。v定
5、義:將物體連同其參考直角坐標(biāo)系,沿不平行于任一坐標(biāo)面的方向,用平行投影法將其投射在一個(gè)投影面上所得到的圖形。 Computer Graphics軸測(cè)投影v通過軸測(cè)投影繪出的圖形,稱為“軸測(cè)圖”。軸測(cè)圖在工程技術(shù)及其他科學(xué)中常有應(yīng)用。v在軸側(cè)圖中,物體上與任一坐標(biāo)軸平行的長(zhǎng)度均可按一定的比率來量度。三軸向的比率都相同時(shí)稱為“等測(cè)投影”,其中兩軸向比率相同時(shí)稱為“二測(cè)投影”,三軸向比率均不相同時(shí)稱為“三測(cè)投影”。軸測(cè)投影中投射線與投影面垂直的稱為“正軸測(cè)投影”,傾斜的稱為“斜軸測(cè)投影”。Computer Graphics 平行投影變換公式 設(shè)投影方向?yàn)?,空間點(diǎn) 在投影平面上的投影為 ,由于是沿
6、方向投影,所以下式成立: ) , ,(dddzyx) , ,(zyx)0 , ,(ppyx) , ,(dddzyxddpdpzzyyyxxx(6.5) 所以zzyyyzzxxxddpddp(6.6) 式(6.6)是平行投影的計(jì)算公式,寫成齊次坐標(biāo)表達(dá)式為: 10001010001ddqqddxxzxyyyzzq (6.7) 投影中心在無窮遠(yuǎn)處平行投影) , ,(zyxComputer Graphics 6.1.3 任意坐標(biāo)系到觀察坐標(biāo)系中的變換 v 滅點(diǎn)滅點(diǎn):一組不平行于投影平面的平行線,經(jīng)過透視投影后相交于一點(diǎn),稱為滅點(diǎn)。v 主滅點(diǎn)主滅點(diǎn):如果這組平行線平行于坐標(biāo)軸,這時(shí)的滅點(diǎn)稱為主滅點(diǎn),至
7、多存在三個(gè)主滅點(diǎn),分別對(duì)應(yīng)于投影平面切割的坐標(biāo)軸的數(shù)目。v 透視投影按主滅點(diǎn)的個(gè)數(shù)分為一點(diǎn)透視一點(diǎn)透視、二點(diǎn)透二點(diǎn)透視視和三點(diǎn)透視三點(diǎn)透視。圖6.7 一點(diǎn)透視圖6.9 三點(diǎn)透視圖6.8 兩點(diǎn)透視Computer Graphics在坐標(biāo)系oxyz中來討論投影問題。確定一個(gè)投影面:一個(gè)參考點(diǎn) 和投影平面的法線方向 。還要指定 的方向,為此要給定一個(gè)向量 ,U在投影平面上的垂直投影所指的方向便是 軸的方向。取過 點(diǎn)沿N方向作的射線定為 軸 觀察坐標(biāo)系 的建立 o ox xy yz z圖6.10 投影平面的指定NyOxzUoxyz) nnnzyxN,(, , )uuuxyzUyoozoyo)(000,
8、z,yxo Computer Graphics設(shè) 是點(diǎn) 在坐標(biāo)系oxyz中的坐標(biāo), , 和 軸的單位方向向量為 、 和 ,那么從坐標(biāo)系oxyz到的變換是 坐標(biāo)變換公式oxoyozo000(, , )xyz),(131211aaa),(232221aaa),(333231aaazyxo(6.8)011121321222303132330 xxxaaayaaayyzaaazz 設(shè) 、 和 軸的單位方向向量分別為i,j,k。 軸和N方向一致,故有zo 軸和向量UN方向一致,設(shè)xo其中x, y和z分別為ox, oy, oz軸的單位方向向量,則 軸的單位方向向量應(yīng)是 和 軸的單位向量的向量積,因此yox
9、ozoxoyozo313233222(,)(,)nnnnnnaaaxyzxyzkzyxzyxNU321bbbzyxzyxnnnuuu232221321131211),(),(bbbbbbaaai212223133212331133133112311132(,)(,) aaaa aa aa aa aa aa ajComputer Graphics 齊次坐標(biāo)形式在坐標(biāo)系oxyz中給定的投影方向和視點(diǎn)的坐標(biāo)都可用式(6.8)變換到坐標(biāo)系 中的量 和 。zyxo),(dddzyx ),(ccczyx 式(6.8)寫成齊次坐標(biāo)表達(dá)式為 111213142122232431323334100011xaaa
10、axyaaaayzaaaaz (6.9) 其中 4102030(), 1,2,3iiiiaa xa ya zi (6.8)011121321222303132330 xxxaaayaaayyzaaazz Computer Graphics 坐標(biāo)系oxyz中任一點(diǎn)(x, y, z) 在投影平面上的投影把式(6.9)代入式(6.3)得110001000000343332312423222114131211zyxaaaaaaaaaaaazyzxzqyxcccccqq13433323134243323322231213414331332123111zyxazaaaayazayazayazayazaxa
11、zaxazaxazaxazccccccccccccccccc(6.10) 坐標(biāo)系oxyz中任一點(diǎn)(x, y, z),由(6.10)和(6.4)便可求得它在投影平面上的投影點(diǎn) 。 (, ,0)ppxy (6.4), pqpqxxqyyq平行投影時(shí),由式(6.7)和(6.9),得 111213142122232431323334100010000110001ddqqddxaaaaxzxaaaayyyaaaazzq 1131123213331434213122322333243410001ddddddddddddddddxxxxaaaaaaaaxzzzzyyyyyaaaaaaaazzzzz (6.1
12、1) Computer Graphics 6.1.4射影變換 做三維裁剪或消除隱藏線時(shí),可把一個(gè)對(duì)象的透視圖看成另一個(gè)對(duì)象的在同一投影平面上的正視圖,并要求兩個(gè)對(duì)象對(duì)應(yīng)點(diǎn)坐標(biāo)分量 的排序一致。后一個(gè)對(duì)象可以通過前一個(gè)對(duì)象做下述射影變換得到,zzzBzAzcpBzAzzzBzAzzzbbbcfffc)()(zzzxxxxccccp)(zzzyyyyccccp)(BzAzzBzAzzbbcffc)()(,cfbfbAzzz Bz z所以(6.12)(6.13)對(duì)于三維裁剪來說,希望變換 不改變?nèi)S窗口前后平面 = 和 = 的位置,這時(shí)式(4.16)中的A和B應(yīng)取成zfzzbz代入投影平面透視投影平
13、行投影圖6.12 由透視投影變換到平行投影Computer Graphics變換為單調(diào)遞增函數(shù)由上式求導(dǎo)得 為單調(diào)遞增函數(shù),只要 便是 的單調(diào)遞增函數(shù),可保證兩個(gè)對(duì)象對(duì)應(yīng)點(diǎn)按坐標(biāo)分量的排序是一致的。 zzBzAzcp2)(zzBzAzdzdccpcczzBzA, 0zpzpzbfbfczzBzzzA ,由得, ,bcfczzzz只要 則 )(bcfcczzzzBzAcczzBzA, 0Computer Graphics 射影變換的齊次坐標(biāo)表示 聯(lián)立式(6.2)和(6.12),則得到射影變換的齊次坐標(biāo)表示 1100000000zyxzBAyzxzqzyxcccccqqq平行投影時(shí),可直接取 zz
14、p(6.14) 式(6.6)和(6.14)就是在平行投影時(shí)所建立的一個(gè)仿射變換,變換的齊次坐標(biāo)表示為: 100010001010001ddppddpxzxxyyyzzzq (6.2) (6.12)zzzyyyyzzzxxxxccccpccccp)()(zzBzAzcp (6.6) zzyyyzzxxxddpddpComputer Graphics 世界坐標(biāo)至規(guī)范化坐標(biāo)空間的變換,就是要把世界坐標(biāo)系中的圖形變到規(guī)范化坐標(biāo)系 中。這個(gè)變換把圖6.13中的平行六面體P1P2P3P4Q1Q2Q3Q4變成圖6.15中的單位立方體,把圖6.14中的棱臺(tái)P1P2P3P4Q1Q2Q3Q4變成圖6.16的棱臺(tái)。
15、 6.2 視見體到規(guī)范視見體的變換在規(guī)范化坐標(biāo)系中定義了兩種視見體: 平行投影的視域由下列方程定義對(duì)透視來說,視見體是下列六個(gè)方程代表的平面圍成的棱臺(tái)vvvvzyxomin, , y, y, 1, vvvvvvvvvvxzxzzzzzz 1 , 0 , 1 , 0 , 1 , 0vvvvvvzzyyxx圖6.13 平行投影時(shí)定義的窗口P1P4P3P2Q2Q3Q4Q1A4A3A2A1圖6.14 透視時(shí)定義的窗口CP1P2P3P4Q1Q2Q3Q4A4A3A2A1xvzvyv111ov圖6.15 平行投影時(shí)的規(guī)范化空間yvxvzv圖6.16 透視時(shí)的規(guī)范化空間ovComputer Graphics
16、6.2.1平行投影視見體的規(guī)范化設(shè)圖Pi和Qi在世界坐標(biāo)中的坐標(biāo)為 。第一步要把點(diǎn)P1移到坐標(biāo)原點(diǎn),這個(gè)變換的矩陣為 經(jīng)變換TR后,平行六面體在 和 平面上的投影為圖6.17所示4 , 3 , 2 , 1 ), ,( ), ,( iyxQyxPiiiiii1111 ,yybxxbyx 1111000100010001RxyzT T圖6.17 平行六面體在兩個(gè)坐標(biāo)平面上的投影zxozyo(a)bxby(b)xzzyComputer Graphics第二、三、四步變換第三步是長(zhǎng)方體變?yōu)閱挝婚L(zhǎng)的立方體。這個(gè)變換矩陣為111110001000100001xyHbzzbzzS S 10000)(0000
17、)(0000)(1111121231zzyyxxS S第二步對(duì)平行六面體做切變,使它成為一個(gè)長(zhǎng)方體。這個(gè)切變的矩陣為第四步為把 z 軸反向,變換矩陣為10000100001000012S S由坐標(biāo)系 到規(guī)范化坐標(biāo)系的變換為TRHTvvvzyxzyx) 1 ,() 1 ,(12TSSSzyxo(a)bxby(b)xzzyComputer Graphics 6.2.2透視投影視見體的規(guī)范化 變換后,棱臺(tái)在 和 平面上的投影如上圖所示。2) 把經(jīng)過 變換后的棱臺(tái)變成正棱臺(tái),其變換為zxozyoTR1) 把視點(diǎn)移至坐標(biāo)原點(diǎn),變換為3)進(jìn)行單位化,變換矩陣為 10000)(0000)(0000)(111
18、121231czzyyxxS S4) 變換為把z軸反向,變換也是S2。 從坐標(biāo) 變到坐標(biāo) 的變換為zyxovvvvzyxo1000100010001cccRzyxT41121121002()20102()00100001cccHcxxxzzyyyzzSTRHTvvvzyxzyx) 1 ,() 1 ,(12TSSS4Computer Graphics 6.3 用三維規(guī)范體裁剪 在規(guī)范化坐標(biāo)系中平行投影時(shí),視見體是由方程x=0, x=1, y=0, y=1, z=0和z=1代表的六個(gè)平面圍成的立方體。透視時(shí)的視見體是棱臺(tái),由方程x=z, x=z, y=z, y=z, z=zmin和z=1代表的六個(gè)
19、平面圍成圖6.19 兩種視見體Computer Graphics SutherlandCohen 算法推廣到三維判斷顯然不可見的線段的編碼應(yīng)為六位,這六位的安排是點(diǎn)在視見體左面,第1位為1,x0,(x1,(xz) 點(diǎn)在視見體下面,第3位為1,y0,(y1,(yz)點(diǎn)在視見體后面,第5位為1,z1,(z1) 點(diǎn)在視見體前面,第6位為1,z0,(zzmin) 括號(hào)中的條件適用于透視的情況。Computer Graphics 直線和視見體的邊界面的交點(diǎn)設(shè)線段的起點(diǎn)和終點(diǎn): P1(x1, y1, z1)和P2(x2, y2, z2) ,直線方程為 x=x1+(x2x1)t, y=y1+(y2y1)t,
20、 z=z1+(z2z1)t和視見體的邊界面,例如y=1求交時(shí), 把tL代入即可求得交點(diǎn)的坐標(biāo)。求P1P2和平面x= -z的交點(diǎn)時(shí),把直線方程代入x=-z中求得交點(diǎn)處的參數(shù)121 (1)/()Ltyyy)()(121211zzxxxztL121()()iiiiPAtPPNNComputer Graphics梁友棟Barsky 算法推廣到三維當(dāng)視見體為立方體時(shí),其推廣是直接的。當(dāng)視見體為棱臺(tái)時(shí),設(shè)121212,zzzyyyxxx相應(yīng)平面與線段的參數(shù)值為 BAFTBRLkrstkkk, , , , , /則:min1vvvvvvvvvvvxzxzyzyzzzz 111111111min11LRBTF
21、BAszxszxszyszyszzsz ()()LRBTFBArxzrxzryzryzrzrz ,Computer Graphicsbegin t0:=0; t1:=1; deltax:=x1x0; delatz:=z1z0; clipt (deltax, deltaz, x0 + z0, t0, t1); clipt (deltax, deltaz, z0 x0, t0, t1); deltay:=y1y0; clipt (deltay, deltaz, y0 + z0, t0, t1); clipt (deltay, deltaz, z0y0, t0, t1); clipt (deltaz
22、, z0zmin, t0, t1); clipt (deltaz, 1z0, t0, t1); x0:=x0 + t0*deltax; y0:=y0 + t0*deltay; z0:=z0 + t0*deltaz; x1:=x0 + t1*deltax; y1:=y0 + t1*deltay; z1:=z0 + t1*deltaz; showline (x0, y0, z0, x1, y1, z1);1:end clip的主體部分程序Computer Graphics窗口到視口(視區(qū))的變換 窗口到視口(視區(qū))的變換是指把所定義的視見體中的內(nèi)容對(duì)應(yīng)到二維的屏幕之中。相當(dāng)于將相機(jī)拍攝的底片洗印到
23、不同尺寸的相片上。 通常視見體的寬高比和視口的寬高比應(yīng)該相同,這樣當(dāng)視見體中的圖形映射到視口時(shí)物體才不會(huì)發(fā)生變形。 Computer Graphics 6.4 窗口到視口的變換 視口(區(qū))是在屏幕或繪圖紙上指定的一個(gè)矩形,在 坐標(biāo)系中的頂點(diǎn)的坐標(biāo)分別是(VL,VB)和 (VR,VT) 。窗口由點(diǎn)(WL,WB)和(WR,WT)決定。窗口中的圖形應(yīng)該成比例地變到視口。窗口中的任一點(diǎn) 和 視口中的對(duì)應(yīng)點(diǎn)(xv, yv)應(yīng)滿足下列關(guān)系是vvvyxo整理得圖6.20 窗口至視口的變換wRwLwBwTvLvRvBvTxvOvyvywOwxw(,)ppxypLvLRLRLxwxvvvwwpBvBTBTByw
24、yvvvwwvpvpxAxByCyD其中(6.15) LRLRwwvvALLwAvBBTBTwwvvCBBwCvDComputer Graphics6.4 窗口到視口的變換vvqvvvqvqyyqxx ,齊次坐標(biāo)形式為 其中qyxDCBAqyxqqvvqvq10000(6.16) qpxx qqpyy q在OpenGL中可以用如下函數(shù)定義視口: void glViewport (GLint x, GLint y, GLsizei width, GLsizei height);其中:x、y為視口矩形的左下角(像素為單位)坐標(biāo);width、height分別為視口的寬和高。默認(rèn)情況下,初始視口的值為
25、(0,0,winWidth,winHeight),其中winWidth、winHeight為窗口的寬和高。應(yīng)該使視口區(qū)的長(zhǎng)寬比與取景體的長(zhǎng)寬比相等,否則會(huì)使顯示的圖象變形 vpvpxAxByCyDComputer Graphics窗口、視口變換窗口、視口變換v 修改視口: :glViewport()是OpenGL提供的修改視口的函數(shù)。v 將glViewport(0, 0, width, height)改為glViewport(0, 0, width/2, height/2),再執(zhí)行程序,可以看到圖形變小了一半。這是因?yàn)間lViewport()指定了一個(gè)更小的顯示區(qū)域(視口)。v 修改窗口(視見
26、體):將gluOrtho2D(0, width, 0, height) 改為gluOrtho2D(0, 2*width, 0, 2*height),再執(zhí)行程序,可以看到圖形同樣減小了一半。雖然視區(qū)未變,但由于窗口(視見體)變大了,圖形也就顯得小了。 Computer Graphics 投影平面上窗口的定義可以有兩種方法。一種是OpenGL中采用的用glFrustum()、glPerspective()和glOrtho()定義四棱臺(tái)或四棱柱的視見體,他們?cè)谕队捌矫嫔系耐队白匀恍纬闪舜翱凇?這種方法雖然直觀,但難以保證所觀察的圖形在窗口內(nèi),另一種自動(dòng)定義窗口的方法。 窗口的定義Computer G
27、raphics 自動(dòng)定義窗口 在對(duì)象的中心位置附近給定一點(diǎn)(xc, yc, zc)和一個(gè)常數(shù)r,要求以該點(diǎn)為球心,r為半徑的球能把對(duì)象包含在內(nèi)。定義立方體設(shè)點(diǎn)(xc, yc, zc)的投影為 ,令八個(gè)點(diǎn)投影到投影平面,設(shè)其投影點(diǎn)的坐標(biāo)分別為 以 為左下角點(diǎn), 為右上角定義的窗口,常常不和預(yù)先由參數(shù)VL,VB,VR,VT定義的視口視口相似,須作調(diào)整,保證所觀察的圖形在窗口內(nèi),) , ,(rzryrxccc8 , , 2 , 1 ), ,(iyxii) ,(ccyxmax ()max ()micmicxxxyyy) ,(mcmcyyxx) ,(mcmcyyxx: ()/() / / TBRLmmm
28、mmmmmAVVVVif yAxthen xyAelse if yA xthen yxAComputer Graphics 6.5 連續(xù)變換的處理 (6.17) (,1)( , , ,1)TTx y zx y zT T1其中T1是一個(gè)44的矩陣。設(shè)投影變換是2(, )( ,1)TTqqxy qx y zT T(6.18)其中T2是34矩陣,窗口至視區(qū)的變換是3(,)(, )TTvqvqvqqxyqxy qT T設(shè)在世界坐標(biāo)系中的變換合并成一個(gè)矩陣T T1,變換為(6.19) 其中T3是33矩陣。為了適合不同物理設(shè)備尺度的要求,在x和y方向還要分別乘以一常數(shù),可由33的變換矩陣T4來實(shí)現(xiàn),即4(
29、,)(,)TTsqsqsvqvqvxyqxyqT T把變換(6.17)式至(6.20)式合并起來得4 3 2 1(,)( , , ,1)( , , ,1)TTTsqsqsxyqx y zx y zT TT TTT TT TT其中T=T4T3T2T1是一個(gè)34矩陣。(6.21) (6.20) Computer Graphics 屏幕坐標(biāo)的計(jì)算 在對(duì)圖形變換以前,先要算出T,輸出每一個(gè)圖形元素時(shí),只要作一次矩陣向量乘法(6.21)式,然后求得屏幕坐標(biāo)中點(diǎn)的坐標(biāo) 如果不要作投影變換,例如顯示對(duì)象本身是二維的,或是平行投影,那么式(6.22)也可不作投影變換,這時(shí)可直接令(6.22) ssqsssqs
30、qyyqxx,ssqssqxxyy(6.21) TTTssqsqzyxzyxqyx) 1 ,() 1 ,(),(1234TTTTTComputer Graphics 提高效率的技術(shù)圖6.21 圖形的顯示流程對(duì)窗口剪 裁窗口至視口的變換顯示或繪 圖世界坐標(biāo)系的三維變換投影從圖6.21來看,在投影變換之后,窗口到視區(qū)變換之前還要對(duì)窗口作裁剪,裁剪工作無法用矩陣來表示,不能把裁剪工作合并到T中去。為減少工作量,可把幾個(gè)矩陣合并起來GKS3D 圖形顯示流程Computer Graphics提高效率的技術(shù) 對(duì)三維窗口,窗口在深度方面有兩個(gè)平行于投影面的平面作為裁剪的邊界,這時(shí)可把深度裁剪放在最前面做,最
31、后作二維裁剪。簡(jiǎn)單的圖形處理流程 T=T4T3T2T1Computer Graphics 6.6.1 OpenGL中的圖形變換 v 模型變換 構(gòu)造一個(gè)復(fù)雜的場(chǎng)景需要許多物體,這些物體都定義于其模型坐標(biāo)系中,由于模型坐標(biāo)系是依物體而建立的,物體在其中的表示相對(duì)簡(jiǎn)單。一個(gè)物體或者獨(dú)立地出現(xiàn)在世界坐標(biāo)系中,或者是更復(fù)雜物體的組成部分,無論哪種情況,都需要一個(gè)幾何變換將其變換到新的坐標(biāo)系中,這個(gè)變換稱模型變換。 if (c_mode=1) glTranslatef(2,0,-2); /平移 if (c_mode=2) glScalef(0.5,0.6,1.2); /放縮 if (c_mode=3) g
32、lRotatef(30,0,1,0); /旋轉(zhuǎn) v 觀察變換 在實(shí)際生活中,為了在不同的距離和角度上拍攝物體,我們可以移動(dòng)物體,進(jìn)行模型變換,也可以保持物體不動(dòng)而移動(dòng)照相機(jī),這個(gè)變換就稱為觀察變換。 gluLookAt(0,0,12,0,0,0,0,1,0); /設(shè)定觀察點(diǎn)的位置 Computer Graphics gluLookAtv它共接受三組坐標(biāo),分別為eye,center,upeye表示我們眼睛在“世界坐標(biāo)系”中的位置,center表示眼睛“看”的那個(gè)物體中心點(diǎn)的坐標(biāo),up表示觀察者本身的方向,如果將觀察點(diǎn)比喻成我們的眼睛,那么這個(gè)up則表示我們是正立還是倒立異或某一個(gè)角度在看,所看的
33、影像大不相同,故此時(shí)需要指明我們現(xiàn)在正立,那么X,Z軸為0,Y軸為正即可,通常將其設(shè)置為1,只要表示一個(gè)向上的向量(方向)即可Computer Graphics OpenGL中的圖形變換v投影變換 投影變換定義了一個(gè)視見體,即限定場(chǎng)景在屏幕上顯示的范圍。 glFrustum(-0.5,1,-0.5,1,1,20); /定義透視投影矩陣 glOrtho(-7,7,-7,7,2,12); /定義正交投影矩陣 Computer Graphicsv視口變換 視口變換是指把所定義的視見體中的內(nèi)容對(duì)應(yīng)到二維的屏幕之中。相當(dāng)于將相機(jī)拍攝的照片洗印到不同尺寸的相片上。 通常視見體的寬高比和視口的寬高比應(yīng)該相同
34、,這樣當(dāng)視見體中的圖形映射到視口時(shí)物體才不會(huì)發(fā)生變形。 glViewport(0,0,cx,cy); /定義視口大小, cy為窗口的高度 Computer Graphics 6.6.2 OpenGL中的圖形變換應(yīng)用舉例 例例1 以一立方體為例,投影模式采用透視,視點(diǎn)固定,對(duì)其作平移、放縮和旋轉(zhuǎn)等模型變換,結(jié)果如圖6.226.26所示。 圖 6.22 原點(diǎn)在初始位置(1,1,1)圖 6.23 平移圖6.24 放縮圖6.25 繞y軸旋轉(zhuǎn)圖6.26 變換代替平移Computer Graphics 程序主要代碼如下void CExam2View:OnDraw(CDC* pDC) CExam2Doc*
35、pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereglClearColor(1,1,1,1); /用白色清屏glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity(); /變換矩陣初始化gluLookAt(0,0,12,0,0,0,0,1,0); /設(shè)視點(diǎn), (0,0,0)為參考點(diǎn)坐標(biāo), /gluLookAt(-2,0,14,-2,0,0,0,1,0); /觀察變換替代平移變換的視點(diǎn)draw_coord();glPushMatrix(); /把當(dāng)前變
36、換矩陣壓入堆棧glTranslatef(1,1,1); /模型坐標(biāo)系原點(diǎn)變換到世界坐標(biāo)系的(1,1,1)位置/在模型坐標(biāo)系中做變換Computer Graphics if (c_mode=1)glTranslatef(2,0,-2);/平移 if (c_mode=2)glScalef(0.5,0.6,1.2);/縮放 if (c_mode=3)glRotatef(30,0,1,0);/旋轉(zhuǎn) /下面這一函數(shù)可以得到當(dāng)前的模型變換矩陣 /glGetDoublev(GL_MODELVIEW_MATRIX,array); draw_cuboid(4,4,4); glPopMatrix(); /從堆棧中
37、恢復(fù)變換前的變換矩陣void CExam2View:OnSize(UINT nType, int cx, int cy)/窗口變化時(shí)執(zhí)行該程序 CView:OnSize(nType, cx, cy); /窗口大小改變時(shí)的事件處理程序 / TODO: Add your message handler code here glMatrixMode(GL_PROJECTION); /選擇當(dāng)前矩陣為投影矩陣 glLoadIdentity(); glFrustum(-0.5,1,-0.5,1,1,20); /定義窗口 glMatrixMode(GL_MODELVIEW); /選擇當(dāng)前矩陣為模型變換 gl
38、ShadeModel(GL_FLAT); / 設(shè)置明暗效果,GL-FLAT,一個(gè)面片的顏色一致, / GL-SMOOTH,面片的顏色由插值產(chǎn)生 glViewport(0,0,cx,cy); / 定義視口Computer Graphics繪制立方體void CExam2View:draw_cuboid(GLdouble a, GLdouble b, GLdouble c)/繪制立方體 glColor3f(0,0,0); glBegin(GL_LINE_LOOP);/后面 glVertex3f(0,0,0); glVertex3f(a,0,0); glVertex3f(a,b,0); glVert
39、ex3f(0,b,0); glEnd();glBegin(GL_LINE_LOOP);/前面 glVertex3f(0,0,c); glVertex3f(a,0,c); glVertex3f(a,b,c); glVertex3f(0,b,c);glEnd();glBegin(GL_LINES); /點(diǎn)按照線段連接glVertex3f(0,0,0);glVertex3f(0,0,c);glVertex3f(a,0,0);glVertex3f(a,0,c);glVertex3f(a,b,0);glVertex3f(a,b,c);glVertex3f(0,b,0); glVertex3f(0,b,c
40、);glEnd();Computer Graphics 繪制坐標(biāo)系void CExam2View:draw_coord()/繪制坐標(biāo)系glColor3f(1,0,0);glEnable(GL_LINE_STIPPLE);/線型設(shè)置glLineStipple(1,0 xF0F0);/虛線glBegin(GL_LINES); glVertex3f(0,0,0); glVertex3f(7,0,0); glVertex3f(0,0,0); glVertex3f(0,7,0); glVertex3f(0,0,0); glVertex3f(0,0,7); glEnd();glDisable(GL_LIN
41、E_STIPPLE);Computer Graphicsvoid CExam2View:OnRotate() / TODO: Add your command handler code herec_mode=3;Invalidate(); /激活OnDrawvoid CExam2View:OnTranslate() / TODO: Add your command handler code herec_mode=1;Invalidate();void CExam2View:OnScale() / TODO: Add your command handler code herec_mode=2;Invalidate();void CExam2View:OnInicube() / TODO: Add your command handler code herec_mode=0;Invalidate();Computer Graphics 如果保持物體不動(dòng),移動(dòng)視點(diǎn)可以得到同樣的視覺效果。例如,對(duì)于平移變換glTranslatef(2,0,-2)的效果圖6.23,也可以通過觀察變換來實(shí)現(xiàn),只需把gluLookAt(0, 0, 12, 0, 0, 0, 0, 1, 0)改為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧結(jié)業(yè)考試試題及答案
- 駕照三力考試試題及答案
- 安徽省安全員c證考試試題及答案
- 4.1轉(zhuǎn)基因產(chǎn)品的安全性課件-高二下學(xué)期生物人教版選擇性必修3
- 2025簡(jiǎn)化版公路貨物運(yùn)輸合同樣本
- 農(nóng)廠租賃合同范例
- 基金專場(chǎng)考試試題及答案
- 肝膽胰科入科考試試題及答案
- 高三生物一輪復(fù)習(xí)課件第5講 細(xì)胞膜結(jié)構(gòu)和功能
- 錦江區(qū)小學(xué)考試試題及答案
- 陶藝店管理制度
- 遺體轉(zhuǎn)運(yùn)協(xié)議書范本
- 挖礦委托協(xié)議書范本
- 2025年標(biāo)準(zhǔn)租房合同范本
- 2025屆安徽省池州市普通高中高三教學(xué)質(zhì)量統(tǒng)一監(jiān)測(cè)政治試卷含、答案
- 高考閱讀七選五10篇 高考真題匯編(答案版)
- 《汽車博覽會(huì)》名師課件2
- 2025年wset二級(jí)試題及答案
- 《ITIL學(xué)習(xí)分享》課件
- 比較文學(xué)形象學(xué)-狄澤林克
- 《東巴常用字典》東巴文-字典
評(píng)論
0/150
提交評(píng)論