banner
IWSR

IWSR

我永远喜欢志喜屋梦子!

三維圖形基本幾何變換的矩陣推導

前言#

此文是 齊次座標與二維圖形基本幾何變換的矩陣推導 的衍生。理解二維的變換就能輕鬆推導三維的。

三維圖形基本幾何變換#

平移#

描述從點 (x, y, z) 到 (x + dx, y+ dy, z + dz)

引入齊次座標,可表述為 (x, y, z, 1) 變形推導為 (x + dx, y+ dy, z + dz, 1)

已知:

(a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44)(xyz1)=(x+dxy+dyz+dz1)\begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} x + d_x \\ y+ d_y \\ z + d_z \\ 1 \end{pmatrix}

{a11x+a12y+a13z+a14=x+dxa21x+a22y+a23z+a24=y+dya31x+a32y+a33z+a34=z+dza41x+a42y+a43z+a44=1\begin{cases} a_{11}x + a_{12}y + a_{13}z + a_{14} = x + d_x \\ a_{21}x + a_{22}y + a_{23}z + a_{24} = y+ d_y \\ a_{31}x + a_{32}y + a_{33}z + a_{34} = z + d_z \\ a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\ \end{cases}

解得

(100dx010dy001dz0001)\begin{pmatrix} 1 & 0 & 0 & dx \\ 0 & 1 & 0 & dy \\ 0 & 0 & 1 & dz \\ 0 & 0 & 0 & 1 \end{pmatrix}

縮放#

描述從點 (x, y, z) 到 (sx*x, sy*y, sz*z),sx sy sz 為常量。

引入齊次座標,可表述為 (x, y, z, 1) 變形推導為 (sx*x, sy*y, sz*z, 1)

已知:

(a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44)(xyz1)=(sxxsyyszz1)\begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} s_x * x \\ s_y * y \\ s_z * z \\ 1 \end{pmatrix}

{a11x+a12y+a13z+a14=sxxa21x+a22y+a23z+a24=syya31x+a32y+a33z+a34=szza41x+a42y+a43z+a44=1\begin{cases} a_{11}x + a_{12}y + a_{13}z + a_{14} = s_x * x \\ a_{21}x + a_{22}y + a_{23}z + a_{24} = s_y * y \\ a_{31}x + a_{32}y + a_{33}z + a_{34} = s_z * z \\ a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\ \end{cases}

解得

(sx0000sy0000sz00001)\begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

旋轉#

對於三維的旋轉可以分解為三個矩陣(繞 x 軸旋轉、繞 y 軸旋轉、繞 z 軸旋轉)的乘積

繞 z 軸旋轉 —— Rz(β)#

還記得我們對二維旋轉的推導嗎?我們在 x, y 軸構成的平面上進行旋轉時其實也可以視為是在繞著 z 軸的旋轉。那麼其三維的旋轉其實就很好理解了,無非就是增加一個固定不變的維度罷了。

即:

(a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44)(xyz1)=(xcosβysinβycosβ+xsinβz1)\begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} xcosβ - ysinβ \\ ycosβ + xsinβ \\ z \\ 1 \end{pmatrix}

得:

{a11x+a12y+a13z+a14=xcosβysinβa21x+a22y+a23z+a24=ycosβ+xsinβa31x+a32y+a33z+a34=za41x+a42y+a43z+a44=1\begin{cases} a_{11}x + a_{12}y + a_{13}z + a_{14} = xcosβ - ysinβ \\ a_{21}x + a_{22}y + a_{23}z + a_{24} = ycosβ + xsinβ \\ a_{31}x + a_{32}y + a_{33}z + a_{34} = z \\ a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\ \end{cases}

解:

Rzβ=(cosβsinβ00sinβcosβ0000100001)R_{z}β = \begin{pmatrix} cosβ & -sinβ & 0 & 0 \\ sinβ & cosβ & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

繞 x 軸旋轉 —— Rx(α)#

同理可得(固定 x)

Rxα=(10000cosαsinα00sinαcosα00001)R_{x}α = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cosα & -sinα & 0 \\ 0 & sinα & cosα & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

繞 y 軸旋轉 —— Ry(γ)#

同理可得(固定 y)

Ryγ=(cosγ0sinγ00100sinγ0cosγ00001)R_{y}γ = \begin{pmatrix} cosγ & 0 & sinγ & 0 \\ 0 & 1 & 0 & 0 \\ -sinγ & 0 & cosγ & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

於是我們得到了三維的旋轉矩陣

R=RxαRyγRzβR = R_{x}αR_{y}γR_{z}β

但是看到這一定會產生這樣的疑問 —— 我該如何將繞某個軸的 θ 角分解為 α β γ 呢?這個疑問先留著,我好再水一篇文章。

只不過目前旋轉的軸都被限制在過原點這一前提下,如果旋轉軸並不過原點的話,得先把軸平移到過原點,隨後再旋轉,旋轉結束後再平移到原來的位置。任何複雜的變換都可以分解為數個簡單變換的合成。

錯切#

沿著 X 軸切變#

即描述從 (x, y, z) 到 (x + my + nz, y, z), m,n 均為正切函數

(a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44)(xyz1)=(x+my+nzyz1)\begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} x + m*y + n*z \\ y \\ z \\ 1 \end{pmatrix}

解得

(1mn0010000100001)\begin{pmatrix} 1 & m & n & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

沿著 Y 軸切變#

描述點 (x, y, z) 到點 (x, y + mx + nz, z)

求解就跳過了,相信聰明的大家一定看出來了行列項代表的意思了

(1000m1n000100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ m & 1 & n & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

沿著 Z 軸切變#

描述點 (x, y, z) 到點 (x, y, z + mx + ny)

(10000100mn100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ m & n & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。