三维图形基本几何变换的矩阵推导

前言

此文是 齐次坐标与二维图形基本几何变换的矩阵推导 的衍生。理解二维的变换就能轻松推导三维的。

三维图形基本几何变换

平移

描述从点 (x, y, z) 到 (x + dx, y+ dy, z + dz)

引入齐次坐标，可表述为 (x, y, z, 1) 变形推导为 (x + dx, y+ dy, z + dz, 1)

已知:

Copy(a 11a 12a 13a 14a 21a 22a 23a 24a 31a 32a 33a 34a 41a 42a 43a 44)(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} ​a11​a21​a31​a41​​a12​a22​a32​a42​​a13​a23​a33​a43​​a14​a24​a34​a44​​ ​ ​xyz1​ ​= ​x+dx​y+dy​z+dz​1​ ​

得

Copy{a 11 x+a 12 y+a 13 z+a 14=x+dxa 21 x+a 22 y+a 23 z+a 24=y+dya 31 x+a 32 y+a 33 z+a 34=z+dza 41 x+a 42 y+a 43 z+a 44=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}⎩ ⎨ ⎧​a11​x+a12​y+a13​z+a14​=x+dx​a21​x+a22​y+a23​z+a24​=y+dy​a31​x+a32​y+a33​z+a34​=z+dz​a41​x+a42​y+a43​z+a44​=1​

解得

Copy(100dx010dy001dz0001)\begin{pmatrix} 1 & 0 & 0 & dx \\ 0 & 1 & 0 & dy \\ 0 & 0 & 1 & dz \\ 0 & 0 & 0 & 1 \end{pmatrix} ​1000​0100​0010​dxdydz1​ ​

缩放

描述从点 (x, y, z) 到 (sx*x, sy*y, sz*z)，sx sy sz 为常量。

引入齐次坐标，可表述为 (x, y, z, 1) 变形推导为 (sx*x, sy*y, sz*z, 1)

已知:

Copy(a 11a 12a 13a 14a 21a 22a 23a 24a 31a 32a 33a 34a 41a 42a 43a 44)(xyz1)=(sx∗xsy∗ysz∗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} s_x * x \\ s_y * y \\ s_z * z \\ 1 \end{pmatrix} ​a11​a21​a31​a41​​a12​a22​a32​a42​​a13​a23​a33​a43​​a14​a24​a34​a44​​ ​ ​xyz1​ ​= ​sx​∗xsy​∗ysz​∗z1​ ​

得

Copy{a 11 x+a 12 y+a 13 z+a 14=sx∗xa 21 x+a 22 y+a 23 z+a 24=sy∗ya 31 x+a 32 y+a 33 z+a 34=sz∗za 41 x+a 42 y+a 43 z+a 44=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}⎩ ⎨ ⎧​a11​x+a12​y+a13​z+a14​=sx​∗xa21​x+a22​y+a23​z+a24​=sy​∗ya31​x+a32​y+a33​z+a34​=sz​∗za41​x+a42​y+a43​z+a44​=1​

解得

Copy(sx0000sy0000sz00001)\begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} ​sx​000​0sy​00​00sz​0​0001​ ​

旋转

对于三维的旋转可以分解为三个矩阵（绕 x 轴旋转、绕 y 轴旋转、绕 z 轴旋转）的乘积

绕 z 轴旋转 —— Rz(β)

还记得我们对二维旋转的推导吗？我们在 x, y 轴构成的平面上进行旋转时其实也可以视为是在绕着 z 轴的旋转。那么其三维的旋转其实就很好理解了，无非就是增加一个固定不变的维度罢了。

即：

Copy(a 11a 12a 13a 14a 21a 22a 23a 24a 31a 32a 33a 34a 41a 42a 43a 44)(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} ​a11​a21​a31​a41​​a12​a22​a32​a42​​a13​a23​a33​a43​​a14​a24​a34​a44​​ ​ ​xyz1​ ​= ​xcosβ−ysinβycosβ+xsinβz1​ ​

得：

Copy{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=za 41 x+a 42 y+a 43 z+a 44=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}⎩ ⎨ ⎧​a11​x+a12​y+a13​z+a14​=xcosβ−ysinβa21​x+a22​y+a23​z+a24​=ycosβ+xsinβa31​x+a32​y+a33​z+a34​=za41​x+a42​y+a43​z+a44​=1​

解：

Copy 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}Rz​β= ​cosβsinβ00​−sinβcosβ00​0010​0001​ ​

绕 x 轴旋转 —— Rx(α)

同理可得（固定 x）

Copy 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}Rx​α= ​1000​0cosαsinα0​0−sinαcosα0​0001​ ​

绕 y 轴旋转 —— Ry(γ)

同理可得（固定 y）

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

于是我们得到了三维的旋转矩阵

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

但是看到这一定会产生这样的疑问 —— 我该如何将绕某个轴的 θ 角分解为 α β γ 呢？这个疑问先留着，我好再水一篇文章。

只不过目前旋转的轴都被限制在过原点这一前提下，如果旋转轴并不过原点的话，得先把轴平移到过原点，随后再旋转，旋转结束后再平移到原来的位置。任何复杂的变换都可以分解为数个简单变换的合成。

错切

沿着 X 轴切变

即描述从 (x, y, z) 到 (x + my + nz, y, z), m,n 均为正切函数

Copy(a 11a 12a 13a 14a 21a 22a 23a 24a 31a 32a 33a 34a 41a 42a 43a 44)(xyz1)=(x+m∗y+n∗zyz1)\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} ​a11​a21​a31​a41​​a12​a22​a32​a42​​a13​a23​a33​a43​​a14​a24​a34​a44​​ ​ ​xyz1​ ​= ​x+m∗y+n∗zyz1​ ​

解得

Copy(1mn0010000100001)\begin{pmatrix} 1 & m & n & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} ​1000​m100​n010​0001​ ​

沿着 Y 轴切变

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

求解就跳过了，相信聪明的大家一定看出来了行列项代表的意思了

Copy(1000m1n000100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ m & 1 & n & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} ​1m00​0100​0n10​0001​ ​

沿着 Z 轴切变

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

Copy(10000100mn100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ m & n & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} ​10m0​01n0​0010​0001​ ​