是時候整理一波3d變換相關的知識了。模型的變換可以認爲是空間中一堆點的變換,三維空間中,(x,y,z)可以認爲是點,也可以認爲是一個向量,因此,人們引入的第4個維度來標識是點還是向量,這個4維空間就叫
仿射空間,具體可以參考
CV及CG數學基礎:空間,在仿射空間中,(x,y,z,0)標識向量,而(x,y,z,1)表示點。
平移、旋轉、縮放
平移
平移沒什麼好說的,(x,y,z,1)向x,y,z軸分別移動a,b,c單位長度後變成(x+a, y+b, z+c, 1)。寫成矩陣相乘的方式即爲:
⎣⎢⎢⎡x+ay+bz+c1⎦⎥⎥⎤=⎣⎢⎢⎡100001000010abc1⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
旋轉
對於旋轉,任何一個旋轉都可以認爲是沿着x,y,z軸分別旋轉 α, β, γ 度數,所以選旋轉就先講沿着某個軸向的旋轉。這裏以逆着座標軸正向方向看去的順時針爲旋轉的正向,就是你的視線朝向和座標軸正向是相反的,(⊙o⊙)…我還是畫個圖吧,下圖就是沿着z軸旋轉的正向了哈~
1. 沿x軸旋轉
嗯!這裏推一波公式,其實很簡單,就是三角函數。
如上圖左邊,A點沿着x軸旋轉一定角度變成A’,爲了更容易看,右圖是左圖的左視圖,記旋轉的角度爲θ, 旋轉後得到的A’與旋轉中心連線與y軸正方向的夾角爲α(圖中的α是個負值),記A’與旋轉中心連線的長度爲L(A與旋轉中心連線的長度也是L),那麼,顯而易見,有:
x′=y′=z′=xL⋅cos(θ+α)L⋅sin(θ+α)
y=z=L⋅cosαL⋅sinα
根據三角函數公式可以得到
y′=z′=L⋅cos(α−θ)=L⋅(cosαcosθ−sinαsinθ)=ycosθ−zsinθL⋅sin(α−θ)=L⋅(sinθcosα+cosθsinα)=ysinθ+zcosθ
綜上,有:
x′=y′=z′=xycosθ−zsinθysinθ+zcosθ
現在就可以寫成漂亮的矩陣形式了:
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
2. 沿y軸或者z軸旋轉
推了x軸的,其他兩個軸向其實原理都是一樣的。
對於y軸,可以簡單把y軸和x軸對調,也就是公式裏的x,y對調,不過這樣子的話,z軸的方向會反過來,所以再把z相關的加個符號就好了。
公式如下:
y′=x′=z′=yxcosθ+zsinθ−xsinθ+zcosθ
寫成漂亮的矩陣形式就是:
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
對於z軸,x,z互換,y置反,直接上公式:
z′=y′=x′=zycosθ+xsinθ−ysinθ+xcosθ
矩陣形式:
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
那一個物體沿着x,y,z 軸分別旋轉α, β, γ 度數就把3個矩陣相乘就好了。
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡cosγsinγ00−sinγcosγ0000100001⎦⎥⎥⎤⎣⎢⎢⎡cosβ0−sinβ00100sinβ0cosβ00001⎦⎥⎥⎤⎣⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡cosβcosγcosβsinγ−sinβ0sinαsinβcosγ−sinγcosαcosαcosγ+sinαsinβsinγsinαcosβ0sinβcosαcosγ+sinαsinγ−sinαcosγ+sinγsinβcosαcosαcosβ00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
縮放
縮放感覺也沒的說,直接上公示,下面公式表示沿着x,y,z軸分別縮放a,b,c倍:
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡a0000b0000c00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤