




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、幾何變換詳解在三維圖形學(xué)中,幾何變換大致分為三種,平移變換(Translation),縮放變換(Scaling),旋轉(zhuǎn)變換(Rotation)。以下討論皆針對(duì)DirectX,所以使用左手坐標(biāo)系。將三維空間中的一個(gè)點(diǎn)x, y, z, 1移動(dòng)到另外一個(gè)點(diǎn)x, y, z, 1,三個(gè)坐標(biāo)軸的移動(dòng)分量分別為dx=Tx, dy=Ty, dz=Tz, 即x = x + Txy = y + Tyz = z + Tz平移變換的矩陣如下。將模型放大或者縮小,本質(zhì)也是對(duì)模型上每個(gè)頂點(diǎn)進(jìn)行放大和縮?。旤c(diǎn)坐標(biāo)值變大或變小),假設(shè)變換前的點(diǎn)是x, y, z, 1,變換后的點(diǎn)是x, y, z, 1,那么x = x * S
2、xy = y * Syz = z * Sz縮放變換的矩陣如下。這是三種變換中最復(fù)雜的變換,這里只討論最簡單的情況,繞坐標(biāo)軸旋轉(zhuǎn),關(guān)于繞任意軸旋轉(zhuǎn),在后續(xù)的隨筆中介紹。繞X軸旋轉(zhuǎn)繞X軸旋轉(zhuǎn)時(shí),頂點(diǎn)的x坐標(biāo)不發(fā)生變化,y坐標(biāo)和z坐標(biāo)繞X軸旋轉(zhuǎn)度,旋轉(zhuǎn)的正方向?yàn)轫槙r(shí)針方向(沿著旋轉(zhuǎn)軸負(fù)方向向原點(diǎn)看)。x, y, z, 1表示變換前的點(diǎn),x, y, z, 1表示變換后的點(diǎn)。變換矩陣如下。關(guān)于旋轉(zhuǎn)的正方向,OpenGL與多數(shù)圖形學(xué)書籍規(guī)定旋轉(zhuǎn)正方向?yàn)槟鏁r(shí)針方向(沿著坐標(biāo)軸負(fù)方向向原點(diǎn)看),比如Computer Graphics C Version,p409。繞Y軸旋轉(zhuǎn)繞Y軸旋轉(zhuǎn)時(shí),頂點(diǎn)的y坐標(biāo)不發(fā)生變化
3、,x坐標(biāo)和z坐標(biāo)繞Y軸旋轉(zhuǎn)度。x, y, z, 1表示變換前的點(diǎn),x, y, z, 1表示變換后的點(diǎn)。變換矩陣如下。繞Z軸旋轉(zhuǎn)繞Z軸旋轉(zhuǎn)時(shí),頂點(diǎn)的z坐標(biāo)不發(fā)生變化,x坐標(biāo)和y坐標(biāo)繞Z軸旋轉(zhuǎn)度。x, y, z, 1表示變換前的點(diǎn),x, y, z, 1表示變換后的點(diǎn)。變換矩陣如下。繞坐標(biāo)軸旋轉(zhuǎn)的矩陣推導(dǎo)上面三個(gè)旋轉(zhuǎn)矩陣是如何得來的呢?我們推導(dǎo)一下,首先看一下二維的情況,再擴(kuò)展到三維即可。實(shí)際上上面三種繞坐標(biāo)軸旋轉(zhuǎn)的情況屬于特殊的二維旋轉(zhuǎn),比如繞Z軸旋轉(zhuǎn),相當(dāng)于在與XOY平面上繞原點(diǎn)做二維旋轉(zhuǎn)。假設(shè)點(diǎn)P(x, y)是平面直角坐標(biāo)系內(nèi)一點(diǎn),其到原點(diǎn)的距離為r,其與X軸的夾角為A,現(xiàn)將點(diǎn)P繞原點(diǎn)旋轉(zhuǎn)度,
4、得到點(diǎn)P(x, y),P與X軸的夾角為B,則A = B - 。(注意,在二維坐標(biāo)中,逆時(shí)針旋轉(zhuǎn)時(shí)角度為正,順時(shí)針旋轉(zhuǎn)時(shí)角度為負(fù),下圖中由P旋轉(zhuǎn)到P,角度為,若是由P轉(zhuǎn)到P,則角度為-)。 于是可得下面的轉(zhuǎn)換方程(式一)寫成矩陣的形式就是求得旋轉(zhuǎn)矩陣為由于這里使用齊次坐標(biāo),所以還需加上一維,最終變成如下形式繞Z軸旋轉(zhuǎn)矩陣和前面給出的繞Z軸旋轉(zhuǎn)矩陣完全吻合。對(duì)于繞X軸旋轉(zhuǎn)的情況,我們只需將式一中的x用y替換,y用z替換,z用x替換即可。替換后得到(式二)對(duì)應(yīng)的旋轉(zhuǎn)矩陣為繞X軸旋轉(zhuǎn)矩陣對(duì)于繞Y軸旋轉(zhuǎn)的情況,只需對(duì)式二做一次同樣的替換即可,的到的變換方程為對(duì)應(yīng)的變換矩陣為繞Y軸旋轉(zhuǎn)矩陣平移變換矩陣的逆
5、矩陣與原來的平移量相同,但是方向相反。旋轉(zhuǎn)變換矩陣的逆矩陣與原來的旋轉(zhuǎn)軸相同但是角度相反??s放變換的逆矩陣正好和原來的效果相反,如果原來是放大,則逆矩陣是縮小,如果原來是縮小,則逆矩陣是放大。= Happy Coding =作者:zdd出處:/graphics/繞任意軸旋轉(zhuǎn)的情況比較復(fù)雜,主要分為兩種情況,一種是平行于坐標(biāo)軸的,一種是不平行于坐標(biāo)軸的,對(duì)于平行于坐標(biāo)軸的,我們首先將旋轉(zhuǎn)軸平移至與坐標(biāo)軸重合,然后進(jìn)行旋轉(zhuǎn),最后再平移回去。 將旋轉(zhuǎn)軸平移至與坐標(biāo)軸重合,對(duì)應(yīng)平移操作 旋轉(zhuǎn),對(duì)應(yīng)操作 步驟1的逆過程,對(duì)應(yīng)操作 整個(gè)過程就是對(duì)于不平行于坐標(biāo)軸的
6、,可按如下方法處理。(該方法實(shí)際上涵蓋了上面的情況)1 將旋轉(zhuǎn)軸平移至原點(diǎn)2 將旋轉(zhuǎn)軸旋轉(zhuǎn)至YOZ平面3 將旋轉(zhuǎn)軸旋轉(zhuǎn)至于Z軸重合4 繞Z軸旋轉(zhuǎn)度5 執(zhí)行步驟3的逆過程6 執(zhí)行步驟2的逆過程7 執(zhí)行步驟1的逆過程假設(shè)用v1(a1, b2, c2)和v2(a2, b2, c2)來表示旋轉(zhuǎn)軸,表示旋轉(zhuǎn)角度。為了方便推導(dǎo),暫時(shí)使用右手系并使用列向量,待得出矩陣后轉(zhuǎn)置一下即可,上面步驟對(duì)應(yīng)的流程圖如下。步驟1是一個(gè)平移操作,將v1v2平移至原點(diǎn),對(duì)應(yīng)的矩陣為步驟2是一個(gè)旋轉(zhuǎn)操作,將p(p = v2 -v1)旋轉(zhuǎn)至XOZ平面,步驟3也是一個(gè)旋轉(zhuǎn)操作,將p旋轉(zhuǎn)至與Z軸重合,這兩個(gè)操作對(duì)應(yīng)的圖如下。做點(diǎn)p在
7、平面YOZ上的投影點(diǎn)q。再過q做Z軸垂線,則r是p繞X軸旋轉(zhuǎn)所得,且旋轉(zhuǎn)角度為,且, 于是旋轉(zhuǎn)矩陣為現(xiàn)在將r繞Y軸旋轉(zhuǎn)至與Z軸重合,旋轉(zhuǎn)的角度為-beta(方向?yàn)轫槙r(shí)針),且, 于是得到旋轉(zhuǎn)矩陣為最后是繞Z軸旋轉(zhuǎn),對(duì)應(yīng)的矩陣如下如果旋轉(zhuǎn)軸是過原點(diǎn)的,那么第一步和最后一步的平移操作可以省略,也就是把中間五個(gè)矩陣連乘起來,再轉(zhuǎn)置一下,得到下面的繞任意軸旋轉(zhuǎn)的矩陣即對(duì)應(yīng)的函數(shù)代碼如下。void RotateArbitraryAxis(D3DXMATRIX* pOut, D3DXVECTOR3* axis, float theta) D3DXVec3Normalize(axis, axis); flo
8、at u = axis-x; float v = axis-y; float w = axis-z; pOut-m00 = cosf(theta) + (u * u) * (1 - cosf(theta); pOut-m01 = u * v * (1 - cosf(theta) + w * sinf(theta); pOut-m02 = u * w * (1 - cosf(theta) - v * sinf(theta); pOut-m03 = 0; pOut-m10 = u * v * (1 - cosf(theta) - w * sinf(theta); pOut-m11 = cosf(t
9、heta) + v * v * (1 - cosf(theta); pOut-m12 = w * v * (1 - cosf(theta) + u * sinf(theta); pOut-m13 = 0; pOut-m20 = u * w * (1 - cosf(theta) + v * sinf(theta); pOut-m21 = v * w * (1 - cosf(theta) - u * sinf(theta); pOut-m22 = cosf(theta) + w * w * (1 - cosf(theta); pOut-m23 = 0; pOut-m30 = 0; pOut-m31
10、 = 0; pOut-m32 = 0; pOut-m33 = 1;如果旋轉(zhuǎn)軸是不過原點(diǎn)的,那么第一步和最后一步就不能省略,將所有七個(gè)矩陣連乘起來,得到如下變換矩陣對(duì)應(yīng)如下這個(gè)超長的矩陣,在這里(u, v, w) = (a2, b2, c2) - (a1, b1, c1),且是單位向量,a, b, c分別表示(a1, b1, c1)將上面的過程寫成函數(shù),該函數(shù)接受四個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)輸出參數(shù),用來保存得到的旋轉(zhuǎn)矩陣,第二個(gè)和第三個(gè)參數(shù)是旋轉(zhuǎn)軸的兩個(gè)端點(diǎn),最后一個(gè)參數(shù)是旋轉(zhuǎn)角度,注意,在函數(shù)中我們已經(jīng)將上面的矩陣轉(zhuǎn)置了,因?yàn)樯厦媸前凑樟邢蛄坑?jì)算的。void RotateArbitraryLi
11、ne(D3DXMATRIX* pOut, D3DXVECTOR3* v1, D3DXVECTOR3* v2, float theta) float a = v1-x; float b = v1-y; float c = v1-z; D3DXVECTOR3 p = *v2 - *v1; D3DXVec3Normalize(&p, &p); float u = p.x; float v = p.y; float w = p.z; float uu = u * u; float uv = u * v; float uw = u * w; float vv = v * v; float vw = v
12、* w; float ww = w * w; float au = a * u; float av = a * v; float aw = a * w; float bu = b * u; float bv = b * v; float bw = b * w; float cu = c * u; float cv = c * v; float cw = c * w; float costheta = cosf(theta); float sintheta = sinf(theta); pOut-m00 = uu + (vv + ww) * costheta; pOut-m01 = uv * (
13、1 - costheta) + w * sintheta; pOut-m02 = uw * (1 - costheta) - v * sintheta; pOut-m03 = 0; pOut-m10 = uv * (1 - costheta) - w * sintheta; pOut-m11 = vv + (uu + ww) * costheta; pOut-m12 = vw * (1 - costheta) + u * sintheta; pOut-m13 = 0; pOut-m20 = uw * (1 - costheta) + v * sintheta; pOut-m21 = vw * (1 - costheta) - u * sintheta; pOut-m22 = ww + (uu + vv) * costheta; pOut-m23 = 0; pOut-m30 = (a * (vv + ww) - u * (bv + cw) * (1 - c
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 葡萄酒常規(guī)發(fā)酵管理辦法
- 虹口區(qū)辦公用品管理辦法
- 融資擔(dān)保金管理辦法規(guī)定
- 衢江區(qū)臨時(shí)宿舍管理辦法
- 衡水市生產(chǎn)資料管理辦法
- 裕安區(qū)臨時(shí)攤位管理辦法
- 西海岸區(qū)宅基地管理辦法
- 計(jì)劃管理與合同管理辦法
- 證監(jiān)會(huì)修訂首發(fā)管理辦法
- 財(cái)產(chǎn)損失稅前扣除管理辦法
- 數(shù)據(jù)結(jié)構(gòu)C語言版(第2版)嚴(yán)蔚敏人民郵電出版社課后習(xí)題答案
- 消費(fèi)者需求導(dǎo)向的改裝車品牌建設(shè)-洞察分析
- 依諾肝素鈉課件
- 教育培訓(xùn)機(jī)構(gòu)傭金分配方法
- 《建設(shè)工程監(jiān)理規(guī)范表式》及上海市行業(yè)協(xié)會(huì)在用表
- 《起重機(jī)械安全技術(shù)規(guī)程》(TSG51-2023)知識(shí)培訓(xùn)
- 工業(yè)地產(chǎn)租房合同模板
- 文章之美(2022年遼寧盤錦中考語文試卷議論文閱讀題及答案)
- 湖南省邵陽市海誼中學(xué)2024-2025學(xué)年高一上學(xué)期分班考試數(shù)學(xué)試題(原卷版)
- 2024-2030年中國DevOps工具行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 青少年心理發(fā)展與教育(碩士)
評(píng)論
0/150
提交評(píng)論