graphics-doc-数学

点(point)是空间中的一个位置,没有大小、宽度。
在四维的齐次坐标里面,点的w分量设为1,如此,使用$4×4$矩阵对一个点进行变换时,平移、旋转、缩放都会施加于该点。

矢量

矢量(vector)也被称为向量,是空间中一个包含了模(矢量的长度)和方向(矢量在空间中的指向)的有向线段,没有位置。
在四维的齐次坐标里面,矢量的w分量设为0,如果,使用$4×4$矩阵对矢量进行变换时,平移的效果会被忽略,因为矢量是没有位置的。

矢量和标量的乘

$$k\mathbf{v}=(kv_x,kv_y,kv_z)$$

矢量和标量的除

$$\dfrac{\mathbf{v}}{k}=\dfrac{(v_x,v_y,v_z)}{k}=\dfrac{1}{k}(v_x,v_y,v_z)=({\dfrac{v_x}{k},\dfrac{v_y}{k},\dfrac{v_z}{k}})$$

矢量加法

$$\mathbf{a}+\mathbf{b}=(a_x+b_x,a_y+b_y,a_z+b_z)$$

矢量减法

$$\mathbf{a}-\mathbf{b}=(a_x-b_x,a_y-b_y,a_z-b_z)$$

矢量的模

$$|\mathbf{v}|=\sqrt{v_x^2+v_y^2+v_z^2}$$

矢量的归一化

$$_{\Large {\mathbf{v}}}^{∧}=\dfrac{\mathbf{v}}{|\mathbf{v}|}$$

矢量的点积(内积)

$$\mathbf{a}·\mathbf{b}=\mathbf{b}·\mathbf{a}=|\mathbf{a}||\mathbf{b}|cosθ=(a_x,a_y,a_z)·(b_x,b_y,b_z)=a_xb_x+a_yb_y+a_zb_z$$

$${\Large{\mathbf{a}}}^{∧}·{\Large{\mathbf{c}}}^{∧}=\dfrac{直角边}{斜边}=cosθ$$

数学意义

  • 用于判断2个矢量的朝向

点积

点积

矢量的叉积(外积)

$$\mathbf{a}×\mathbf{b}=(a_x,a_y,a_z)×(b_x,b_y,b_z)=(a_yb_z-a_zb_y, a_zb_x-a_xb_z,a_xb_y-a_yb_x)$$

$$\mathbf{a}×\mathbf{b}≠\mathbf{b}×\mathbf{a}$$

$$\mathbf{a}×\mathbf{b}=-(\mathbf{b}×\mathbf{a})$$

$$(\mathbf{a}×\mathbf{b})×\mathbf{c}≠\mathbf{a}×(\mathbf{b}×\mathbf{c})$$

$$|\mathbf{a}×\mathbf{b}|=|\mathbf{a}||\mathbf{b}|sinθ$$

数学意义

  • 用于求平面的法向量

矩阵

矩阵和标量相乘

$$kM=Mk=k\left[\begin{matrix}m_{11} & m_{12} & m_{13} \m_{21} & m_{22} & m_{23} \m_{31} & m_{32} & m_{33}\end{matrix}\right]=\left[\begin{matrix}km_{11} & km_{12} & km_{13} \km_{21} & km_{22} & km_{23} \km_{31} & km_{32} & km_{33}\end{matrix}\right]$$

矩阵和矩阵相乘

$$A_{r×n}B_{n×c}=C_{r×c}$$

$$c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+…+a_{in}b_{nj}=\sum_{k=1}^{n}{a_{ik}b_{kj}}$$

$$AB≠BA$$

$$(AB)C=A(BC)$$

例子

$$A_{4×2}B_{2×4}=C_{4×4}\left[\begin{matrix}a_{11} & a_{12} \a_{21} & a_{22} \a_{31} & a_{32} \a_{41} & a_{42}\end{matrix}\right]\left[\begin{matrix}b_{11} & b_{12} & b_{13} & b_{14}\b_{21}& b_{22} & b_{23} & b_{24}\end{matrix}\right]=\left[\begin{matrix}c_{11} & c_{12} & c_{13} & c_{14}\c_{21}& c_{22} & c_{23} & c_{24} \ c_{31} & c_{32} & c_{33} & c_{34}\c_{41} & c_{42} & c_{43} & c_{44}\end{matrix}\right]$$

$$c_{23}=a_{21}b_{13}+a_{22}b_{23}$$

方块矩阵

行和列数量相对的矩阵,加方块矩阵
$$\left[\begin{matrix}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{matrix}\right]$$

对角矩阵

除了对角元素都为0的方块矩阵,叫对角矩阵
$$\left[\begin{matrix}a_{11} & 0 & 0 & 0\0& a_{22} & 0 & 0 \ 0 & 0 & a_{33} & 0\0 & 0 &0 & a_{44}\end{matrix}\right]$$

单位矩阵

对角都为1,其它元素为0的方块矩阵,叫单位矩阵
$$\left[\begin{matrix}1 & 0 & 0 & 0\0&1 & 0 & 0 \ 0 & 0 & 1 & 0\0 & 0 &0 & 1\end{matrix}\right]$$

性质

  • 单位矩阵与任何矩阵相乘得到的矩阵都是原来的矩阵。

$$MI=IM=M$$

转置矩阵

把原矩阵行列翻转得到的矩阵就是转置矩阵

$$M_{ij}^T=M_{ji}$$

$$\left[\begin{matrix}x & y & z\end{matrix}\right]^T=\left[\begin{matrix}x \ y \ z\end{matrix}\right]$$

$$\left[\begin{matrix}x \ y \ z\end{matrix}\right]^T=\left[\begin{matrix}x & y & z\end{matrix}\right]$$

性质

  • 转置矩阵的转置等于原矩阵

$$(M^T)^T=M$$

  • 矩阵串接的转置等于反向串接各个矩阵的转置
    $$(AB)^T=B^TA^T$$

逆矩阵

不是所有的矩阵都有逆矩阵,逆矩阵的出现必现满足一定条件:矩阵要是方块矩阵矩阵的行列式不为0

性质

  • 矩阵与其逆矩阵相乘结果为单位矩阵

$$MM^{-1}=M^{-1}M=I$$

  • 逆矩阵的逆矩阵是原矩阵本身

$$(M^{-1})^{-1}=M$$

  • 转置矩阵的逆矩阵是逆矩阵的转置

$$(M^T)^{-1}=(M^{-1})^T$$

  • 矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵

$$(AB)^{-1}=B^{-1}A^{-1}$$

数学意义

  • 对变换进行还原

我们使用了变换矩阵$M$对矢量$v$进行了一次变换得到了$w$,要还原$w$为$v$,我们可以通过使用$M^{-1}$与$w$进行变换就可以还原得到原来矢量

$$Mv=w$$
$$M^{-1}w=v$$

正交矩阵

如果一个方阵和它的转置矩阵的乘积是单位矩阵,那么这个方阵就是正交矩阵

$$MM^{T}=M^{T}M=I$$

$$MM^T=\left[\begin{matrix}- & m_1 & - \-& m_2 & - \ - & m_3 & -\\end{matrix}\right]\left[\begin{matrix}| & | & | \m_1& m_2 & m_3 \ | & | & |\\end{matrix}\right]=\left[\begin{matrix}m_1·m_1 & m_1·m_2 & m_1·m_3 \m_2·m_1& m_2·m_2 & m_2·m_3 \ m_3·m_1 & m_3·m_2 & m_3·m_3\\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 \0&1 & 0 \ 0 & 0 & 1\\end{matrix}\right]=I$$

数学要求

$$\left[\begin{matrix}m_1·m_1=1 & m_1·m_2=0 & m_1·m_3=0 \m_2·m_1=0& m_2·m_2=1 & m_2·m_3=0 \ m_3·m_1=0 & m_3·m_2=0 & m_3·m_3=1\\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 \0&1 & 0 \ 0 & 0 & 1\\end{matrix}\right]=I$$

  • 矩阵的每一行,即$m_1$,$m_2$,$m_3$都必须是单位矢量,这样它们与自己的点积才能是1
  • 矩阵的每一行,即$m_1$,$m_2$,$m_3$各矢量相互垂直,这样它们自己的点积才能是0

性质

  • 正交矩阵的转置矩阵就是逆矩阵

$$M^{T}=M^{-1}$$

变换

我们把点、方向矢量等数据通过某种方式进行转换的过程称为变换

  • 常见变换
变换名称 线性变换 仿射变换 可逆矩阵 正交矩阵
平移矩阵 × ×
绕坐标轴旋转的旋转矩阵
绕任意轴旋转的旋转矩阵
按坐标轴缩放的缩放矩阵 ×
错切矩阵 ×
镜像矩阵
正交投影矩阵 × ×
透视投影矩阵 × × × ×

线性变换

线性变换指的是那些可以保留矢量加和标量乘的变换。

$$f(x)+f(y)=f(x+y)$$

$$kf(x)=f(kx)$$

仿射变换

仿射变换是合并线性变换和平移变换的变换类型,可以使用$4×4$矩阵来表示。

平移

  • 平移矩阵:

$$M_{translation}=\left[\begin{matrix}1 & 0 & 0 & p_x \0 & 1 & 0 & p_y \0 & 0 & 1 & p_z \0 & 0 & 0 & 1\end{matrix}\right]$$

  • 平移矩阵逆矩阵:

$$M_{translation}^{-1}=\left[\begin{matrix}1 & 0 & 0 & -p_x \0 & 1 & 0 & -p_y \0 & 0 & 1 & -p_z \0 & 0 & 0 & 1\end{matrix}\right]$$

  • 点平移公式:

$$p_{result}=M_{translation} × p_{old}=\left[\begin{matrix}1 & 0 & 0 & p_x \0 & 1 & 0 & p_y \0 & 0 & 1 & p_z \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}x \y \z \1\end{matrix}\right]=\left[\begin{matrix}x+p_x \y+p_y \z+p_z \1\end{matrix}\right]$$

  • 矢量平移公式:

$$v_{result}=M_{translation} × v_{old}=\left[\begin{matrix}1 & 0 & 0 & p_x \0 & 1 & 0 & p_y \0 & 0 & 1 & p_z \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}x \y \z \0\end{matrix}\right]=\left[\begin{matrix}x \y \z \0\end{matrix}\right]$$

缩放

  • 缩放矩阵:

$$M_{scale}=\left[\begin{matrix}S_x & 0 & 0 & 0 \0 & S_y & 0 & 0 \0 & 0 & S_z & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

如果$S_x$=$S_y$=$S_z$,那么这个缩放就是统一缩放,否则是非统一缩放,统一缩放是扩大整个模型,不会改变角度和比例信息,而非统一缩放拉伸或挤压模型,会改变模型的角度和比例。

  • 缩放矩阵逆矩阵:

$$M_{scale}^{-1}=\left[\begin{matrix}\dfrac{1}{S_x} & 0 & 0 & 0 \0 & \dfrac{1}{S_y} & 0 & 0 \0 & 0 & \dfrac{1}{S_z} & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

  • 缩放公式:

$$v_{result}=M_{scale} × v_{scale}=\left[\begin{matrix}S_x & 0 & 0 & 0 \0 & S_y & 0 & 0 \0 & 0 & S_z & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}x \y \z \1\end{matrix}\right]=\left[\begin{matrix}xp_x \yp_y \z*p_z \1\end{matrix}\right]$$

旋转

旋转矩阵是一个正交矩阵,即$M^T=M^{-1}$

  • 绕x轴旋转矩阵:

$$M_{rotationX}=\left[\begin{matrix}1 & 0 & 0 & 0 \0 & cosθ & -sinθ & 0 \0 & sinθ & cosθ & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

  • 绕y轴旋转矩阵:

$$M_{rotationY}=\left[\begin{matrix}cosθ & 0 & sinθ & 0 \0 & 1 & 0 & 0 \-sinθ & 0 & cosθ & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

  • 绕z轴旋转矩阵:

$$M_{rotationZ}=\left[\begin{matrix}cosθ & -sinθ & 0 & 0 \sinθ & cosθ & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

  • xyz旋转矩阵
    $$M_{rotation} = M_{rotationY}M_{rotationX}M_{rotationZ}$$

阅读顺序从右到左,先进行z轴旋转,在进行x轴旋转,最后进行y轴旋转,反着(yxz)也可以。

变换组合

模型到世界

  • 变换矩阵:

$$M_{m→w}=M_{translation}M_{rotation}M_{scale}$$

阅读顺序从右到左,先进行缩放变换,在进行旋转变换,最后进行平移变换。

  • 坐标计算公式
    $$p_{world}=M_{m→w}×p_{model}$$

例子

  • 计算模型下某子节点在世界空间的坐标

父亲节点坐标(1,2,3),角度(30,60,90),缩放(4,5,6)
子节点在父亲节点内的坐标(-1,-2,-3)

$$p_{world}=M_{m→w}×p_{model}$$

$$M_{translation}=\left[\begin{matrix}1 & 0 & 0 & p_x \0 & 1 & 0 & p_y \0 & 0 & 1 & p_z \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 & 1 \0 & 1 & 0 & 2 \0 & 0 & 1 & 3 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotationX}=\left[\begin{matrix}1 & 0 & 0 & 0 \0 & cosθ & -sinθ & 0 \0 & sinθ & cosθ & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 & 0 \0 & 0.86603 & -0.5 & 0 \0 & 0.5 & 0.86603 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotationY}=\left[\begin{matrix}cosθ & 0 & sinθ & 0 \0 & 1 & 0 & 0 \-sinθ & 0 & cosθ & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}0.5 & 0 & 0.86603 & 0 \0 & 1 & 0 & 0 \-0.86603 & 0 & 0.5 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotationZ}=\left[\begin{matrix}cosθ & -sinθ & 0 & 0 \sinθ & cosθ & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}0 & -1 & 0 & 0 \1 & 0 & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{scale}=\left[\begin{matrix}S_x & 0 & 0 & 0 \0 & S_y & 0 & 0 \0 & 0 & S_z & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}4 & 0 & 0 & 0 \0 & 5 & 0 & 0 \0 & 0 & 6 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotation}=M_{ry}M_{rx}m_{rz}=\left[\begin{matrix}0.5 & 0 & 0.86603 & 0 \0 & 1 & 0 & 0 \-0.86603 & 0 & 0.5 & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}1 & 0 & 0 & 0 \0 & 0.86603 & -0.5 & 0 \0 & 0.5 & 0.86603 & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}0 & -1 & 0 & 0 \1 & 0 & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1\end{matrix}\right]= \left[\begin{matrix}0.43301 & -0.5 & 0.75 & 0 \0.86603 & 0 &-0.5 & 0 \0.25 & 0.86603 & 0.43301 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{m→w}=M_{t}M_{r}M_{s}=\left[\begin{matrix}1 & 0 & 0 & 1 \0 & 1 & 0 & 2 \0 & 0 & 1 & 3 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}0.43301 & -0.5 & 0.75 & 0 \0.86603 & 0 &-0.5 & 0 \0.25 & 0.86603 & 0.43301 & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}4 & 0 & 0 & 0 \0 & 5 & 0 & 0 \0 & 0 & 6 & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1.73205 & -2.5 & 4.5 & 1 \3.46410 & 0 & -3 & 2 \1 & 4.33013 & 2.59808 & 3 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$p_{world}=M_{m→w}×p_{model}=\left[\begin{matrix}1.73205 & -2.5 & 4.5 & 1 \3.46410 & 0 & -3 & 2 \1 & 4.33013 & 2.59808 & 3 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}-1\-2 \-3 \1\end{matrix}\right]=\left[\begin{matrix}-9.232052\7.5359 \-14.45448 \1\end{matrix}\right]$$

计算是建议从右边开始,因为读法是如此,由于矩阵满足结合律所以从左边计算结果是一致。
$M_{ratation}=M_yM_xM_z=M_y(M_xM_z)$
$M_{m→w}=M_{t}M_{r}M_{s}=M_{t}(M_{r}M_{s})$

世界到观察

  • 变换矩阵:

$$M_{w→v}=M_{scale}^{-1}M_{rotation}^{-1}M_{translation}^{-1}$$

阅读顺序从右到左,先进行平移还原,在进行旋转还原,最后进行缩放还原。

  • 坐标计算公式
    $$p_{view}=M_{w→v}×p_{world}$$

由于观察坐标的z轴与世界坐标的z轴是反的。所以计算出来的坐标的z需要取反

例子

  • 计算模型在观察空间的坐标

模型世界坐标(1,2,3)
摄像机世界坐标(4,5,6),角度(90, 0, 0), 缩放(1, 1, 1)

$$M_{translation}=\left[\begin{matrix}1 & 0 & 0 & p_x \0 & 1 & 0 & p_y \0 & 0 & 1 & p_z \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 & 4 \0 & 1 & 0 & 5 \0 & 0 & 1 & 6 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{translation}^{-1}=\left[\begin{matrix}1 & 0 & 0 & -4 \0 & 1 & 0 & -5 \0 & 0 & 1 & -6 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotationX}=\left[\begin{matrix}1 & 0 & 0 & 0 \0 & cosθ & -sinθ & 0 \0 & sinθ & cosθ & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 & 0\0 & 0 & -1 & 0 \0 & 1 & 0 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{rotation}^{-1}=M_{rotationX}^{-1}=\left[\begin{matrix}1 & 0 & 0 & 0\0 & 0 & 1 & 0 \0 & -1 & 0 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{scale}=\left[\begin{matrix}s_x & 0 & 0 & 0 \0 & s_y & 0 & 0 \0 & 0 & s_z & 0 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}2 & 0 & 0 & 0 \0 & 2 & 0 & 0 \0 & 0 & 2 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{scale}^{-1}=\left[\begin{matrix}0.5 & 0 & 0 & 0 \0 & 0.5 & 0 & 0 \0 & 0 & 0.5 & 0 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$M_{w→v}=M_{s}^{-1}M_{r}^{-1}M_{t}^{-1}=\left[\begin{matrix}0.5 & 0 & 0 & 0 \0 & 0.5 & 0 & 0 \0 & 0 & 0.5 & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}1 & 0 & 0 & 0\0 & 0 & 1 & 0 \0 & -1 & 0 & 0 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}1 & 0 & 0 & -4 \0 & 1 & 0 & -5 \0 & 0 & 1 & -6 \0 & 0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}0.5 & 0 & 0 & -2 \0 & 0 & 0.5 & -3 \0 & -0.5 & 0 & 2.5 \0 & 0 & 0 & 1\end{matrix}\right]$$

$$p_{view}=M_{w→v}×p_{world}=\left[\begin{matrix}0.5 & 0 & 0 & -2 \0 & 0 & 0.5 & -3 \0 & -0.5 & 0 & 2.5 \0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}1\2 \3 \1\end{matrix}\right]=\left[\begin{matrix}-1.5\-1.5 \1.5 \1\end{matrix}\right]$$

坐标z需要取反。即真正的坐标是
$$p_{view}=\left[\begin{matrix}-1.5\-1.5 \-1.5 \1\end{matrix}\right]$$