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}
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.