Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
IWSR opened this issue Nov 8, 2022 · 0 comments
Open

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

IWSR opened this issue Nov 8, 2022 · 0 comments

Comments

@IWSR
Copy link
Owner

IWSR commented Nov 8, 2022

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

前言

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

三维图形基本几何变换

平移

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

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

已知:

$$ \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} $$

$$ \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} $$

解得

$$ \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)

已知:

$$ \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} $$

$$ \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} $$

解得

$$ \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 轴的旋转。那么其三维的旋转其实就很好理解了,无非就是增加一个固定不变的维度罢了。

即:

$$ \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} $$

得:

$$ \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} $$

解:

$$ 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)

$$ 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)

$$ R_{y}γ = \begin{pmatrix} cosγ & 0 & sinγ & 0 \\ 0 & 1 & 0 & 0 \\ -sinγ & 0 & cosγ & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$

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

$$ R = R_{x}αR_{y}γR_{z}β $$

但是看到这一定会产生这样的疑问 —— 我该如何将绕某个轴的 θ 角分解为 α β γ呢?欧拉角与罗德里格旋转公式间的相互转换,我后面再水一篇文章。

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

错切

沿着 X 轴切变

即描述从(x, y, z) 到 (x + my + nz, y, z) —— m, n参考二维的正切,根据选择的角度不同所采用的三角函数也不同

$$
\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 + my + nz \
y \
z \
1
\end{pmatrix}
$$

解得

$$ \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)

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

$$ \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)

$$ \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ m & n & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} $$

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant