Real-Time-Rendering 矩阵(一)

        接下来就是矩阵了。图形学中矩阵作为最常用的工具涉及的知识点也非常多。本文以《3D图形基础:图形与游戏开发》及《Real-Time-Rendering》书中对矩阵的知识点的讲述为基础,先做一篇矩阵概述即基础知识。

一、矩阵的数学定义

        矩阵一般用来描述两个座标系统间的关系。通过定义一种运算将一个座标系中的向量转换到另一个座标系中。

        行数和列数相同的矩阵称为方阵。而本文即后续主要讨论4x4一下的方阵。

        方阵的对角线元素即元素的行号和列号相同的元素。其他元素为非对角线元素。如果所有非对角线元素都为0,则该矩阵称为对角矩阵。如:

\begin{bmatrix} 1 & 0 & 0\\ 0 & 5 & 0\\ 0 & 0 & 6 \end{bmatrix}

        若一个对角矩阵的对角线元素皆为1,称为单元矩阵。如:

\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}

        矩阵的转置即该矩阵沿矩阵的对角线翻折,或使行向量变为列向量,列向量变为行向量。如:

\begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} 转置后 \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} 转置后为\begin{bmatrix} 1 & 4 & 7\\ 2 & 5 & 8\\ 3 & 6 & 9 \end{bmatrix}

        矩阵的转置的转置为原矩阵。任意对角矩阵转置都与原矩阵相同。

        矩阵与标量相乘即各元素与标量相乘。

        矩阵与矩阵相乘。首先矩阵与矩阵相乘必须满足前者的列数等于后者的行数。如3x4的矩阵乘4x6的矩阵会得到3x6的新矩阵。矩阵相乘的公式如下,简单来说即结果矩阵中的任意元素Cij为矩阵A中第i行元素集合与矩阵B中第j行元素集合相乘后的和。

        \mathbf{c}_i_j = \sum_{k=1}^{n}\mathbf{a}_i_k\mathbf{b}_k_j

        矩阵乘法不满足交换律,但满足结合律。矩阵积的转置等同于各矩阵转置的反序乘积。

        (\mathbf{AB})^{T} = \mathbf{B}^{T}\mathbf{A}^{T}

 

二、矩阵的几何解释

        “不幸的是,没有人能告诉您矩阵像什么——您必须自己去感受”。引用黑客帝国的一句话。下面我们去感受下矩阵是什么。

        一般来说,方阵可以描述任何向量的线性变化。如旋转、缩放、投影、镜像、仿射。

        下面我们描述下向量通过矩阵的变换。

        根据向量加法可以如下拆分一个向量:

        \mathbf{v} = [x\: y\: z]^{T} = [x\: 0\: 0]^{T} + [ 0\: y\: 0]^{T} + [0\: 0\:z]^{T}

        \mathbf{v} = [x\: y\: z]^{T} = x[1\: 0\: 0]^{T} + y[ 0\: 1\: 0]^{T} + z[0\: 0\:1]^{T}

        将上式和3x3的单元矩阵与向量v相乘的运算相比较。很容易发现计算过程完全相同。

        如果我们把如上指向+x、+y、+z方向的单位向量定义为pqr。那么向量v就被表示成向量pqr的线性变换了。向量pqr被称为基向量。然而一个座标系可以用任意三个基向量定义。要求pqr不在一个平面即线性无关。已pqr构成3x3矩阵M

        \mathbf{M} = [\mathbf{p}\: \mathbf{q}\: \mathbf{r}]^{T} = \begin{bmatrix} \mathbf{p}_{x} & \mathbf{p}_{y} &\mathbf{p}_{z} \\ \mathbf{q}_{x} & \mathbf{q}_{y} & \mathbf{q}_{z}\\ \mathbf{r}_{x} &\mathbf{r}_{y} &\mathbf{r}_{z} \end{bmatrix}

        将矩阵M与向量v相乘可得

        \begin{bmatrix} \mathbf{p}_{x} & \mathbf{p}_{y} &\mathbf{p}_{z} \\ \mathbf{q}_{x} & \mathbf{q}_{y} & \mathbf{q}_{z}\\ \mathbf{r}_{x} &\mathbf{r}_{y} &\mathbf{r}_{z} \end{bmatrix}[x\: y\: z]^{T} = \begin{bmatrix} x\mathbf{p}_{x} + y\mathbf{q}_{x} + z\mathbf{r}_{x}\\ x\mathbf{p}_{y} + y\mathbf{q}_{y} + z\mathbf{r}_{y}\\ x\mathbf{p}_{z} + y\mathbf{q}_{z} + z\mathbf{r}_{z} \end{bmatrix} = x\mathbf{p} + y\mathbf{q} + z\mathbf{r}

        在阐述下列定义前,我们需要先做一个约定。通过前面的学习我们知道矩阵相乘或矩阵与向量相乘不满足交换律。所以我们需要定义好向量表示的方法为列向量。因此当向量与矩阵相乘时需要左乘矩阵。这与unity常规的约定一致。

        我们发现上式计算与前面计算转换后的v一致。引申出:

        如果把矩阵的列解释为座标系的基向量。那么左乘该矩阵就相当于执行了一次座标转换。若有aM = b,我们可以说Ma转换到b

        这样我们就拥有一种反向构建矩阵的可能。即计算一个期望的变化(旋转、缩放等)后的座标系的基向量。通过基向量获取矩阵!

三、矩阵的行列式

        方阵M的行列式记作|M|。

        2x2阶矩阵行列式定义:

        \left | \mathbf{M} \right | = \begin{vmatrix} m_{11} &m_{12} \\ m_{21} & m_{22} \end{vmatrix} = m_{11} m_{22} - m_{21} m_{22}

        3x3阶矩阵行列式定义:

        \left | \mathbf{M} \right | = \begin{vmatrix} m_{11} &m_{12} &m_{13} \\ m_{21}& m_{22} & m_{23}\\ m_{31} & m_{32} & m_{33} \end{vmatrix} = m_{11}m_{22}m_{33} + m_{12}m_{23}m_{31} + m_{13}m_{21}m_{32} - m_{13}m_{22}m_{31} - m_{12}m_{21}m_{33} - m_{11}m_{23}m_{32}

        对于任意矩阵。我们需要先引申两个概念:

        假设矩阵M有r行c列。\mathbf{M}^{{ij}}表示从M中除去第i行和第j列剩下的矩阵。称其为矩阵M的余子式。

        对于方阵M,给定行、列元素的代数余子式等于相应余子式的有符号行列式。如下:

        c_{ij} = (-1)^{i+j}|\mathbf{M}^{ij}|

        通过代数余子式引申出矩阵的行列式公式:

        首先从矩阵中任意选一行或一列,对该行或列的每个元素都乘以对应的代数余子式。这些乘积的和就是矩阵的行列式。如下就是分别选一行,如行i。或选一列,如列j。

        |\mathbf{M}| = \sum_{j = 1}^{n}m_{ij}c_{ij} = \sum_{j = 1}^{n}(-1)^{i+j}|\mathbf{M}^{ij}|

        |\mathbf{M}| = \sum_{i = 1}^{n}m_{ij}c_{ij} = \sum_{i = 1}^{n}(-1)^{i+j}|\mathbf{M}^{ij}|

        例如我们算一个4x4矩阵的行列式。选取第一行。

        \begin{vmatrix} m_{11} & m_{12} & m_{13} & m_{14}\\ m_{21} & m_{22} & m_{23} & m_{24}\\ m_{31} & m_{32} & m_{33} & m_{34}\\ m_{41} & m_{42} & m_{43} & m_{44} \end{vmatrix} = m_{11}\begin{bmatrix} m_{22} & m_{23} & m_{24}\\ m_{32} & m_{33} & m_{34}\\ m_{42} & m_{43} & m_{44} \end{bmatrix} - m_{12}\begin{bmatrix} m_{21} & m_{23} & m_{24}\\ m_{31} & m_{33} & m_{34}\\ m_{41} & m_{43} & m_{44} \end{bmatrix}

                                                +m_{13}\begin{bmatrix} m_{21} & m_{22} & m_{24}\\ m_{31} & m_{32} & m_{34}\\ m_{41} & m_{42} & m_{44} \end{bmatrix} - m_{14}\begin{bmatrix} m_{21} & m_{22} & m_{23}\\ m_{31} & m_{32} & m_{33}\\ m_{41} & m_{42} & m_{43} \end{bmatrix}

        再将3x3矩阵行列的运算公式带入即可。

        显然高阶行列式计算的复杂度呈指数递增。我们可以使用“主元选择的计算方式”来优化对于高阶矩阵行列式计算的效率。

        行列式有以下重要性质:

        1.矩阵积的 行列式等于矩阵行列式的积。

        2.矩阵转置的行列式等于原矩阵行列式。

        3.矩阵任意行或列全为0,则行列式为0,。

        4.交换矩阵的任意两行或两列,行列式变负。

        5.任意行或列的非零积加到另一行或列不会改变行列式的值。

四、矩阵的逆

        方阵M的逆,记作\mathbf{M}^{-1},当两个矩阵相乘,结果为单位矩阵。即:

        \mathbf{M}(\mathbf{M}^{-1}) = \mathbf{M}^{-1} \mathbf{M} = \mathbf{I}

        并非所有矩阵都有逆。例如一个矩阵某行或列全为0,那么用该矩阵乘以任意矩阵都会得到零矩阵。我们称该矩阵可逆或非奇异。所以区分一个矩阵是否可逆或使非奇异矩阵,只需检测该矩阵的行列式是否为零。

        M的标准伴随矩阵记作“adj M”。定义为M的所有代数余子式矩阵的转置矩阵。如:

        \mathbf{M} = \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix}

        分别计算M的代数余子式:

        c_{11} = +\begin{bmatrix} 5 & 6\\ 8 & 9 \end{bmatrix} = -3      c_{12} = +\begin{bmatrix} 4 & 6\\ 7 & 9 \end{bmatrix} = -6      c_{13} = +\begin{bmatrix} 4 & 5\\ 7 & 8 \end{bmatrix} = -3

        c_{21} = +\begin{bmatrix} 2 & 3\\ 8 & 9 \end{bmatrix} = -6      c_{22} = +\begin{bmatrix} 1 & 3\\ 7 & 9 \end{bmatrix} = -12    c_{23} = +\begin{bmatrix} 1 & 2\\ 7 & 8 \end{bmatrix} = -6

        c_{31} = +\begin{bmatrix} 2 & 3\\ 5 & 6 \end{bmatrix} = -3      c_{32} = +\begin{bmatrix} 1 & 3\\ 4 & 5 \end{bmatrix} = -7      c_{33} = +\begin{bmatrix} 1 & 2\\ 4 & 5 \end{bmatrix} = -3

        可得到M的 伴随矩阵

        adj\mathbf{M} = \begin{bmatrix} c_{11} & c_{12} & c_{13}\\ c_{21} & c_{22} & c_{23}\\ c_{31} & c_{32} & c_{33} \end{bmatrix}^{T} = \begin{bmatrix} -3 & -6 & -3\\ -6 & -12 & -6\\ -3 & -7 & -3 \end{bmatrix}^{T}

        矩阵的逆为矩阵M的伴随矩阵除以M的行列式,即:

        \mathbf{M}^{-1} = adj\mathbf{M}/|\mathbf{M}|

        同样矩阵的逆的计算也可以通过高斯消元法等来计算从而节省计算量。但使用标准伴随矩阵可以提供无分支实现。非常适合GPU这样的并行能力强分支计算效率低的硬件。所以在不同情境结合矩阵的大小及特殊性选择计算方式才是最优解。

        矩阵的逆同样有一些重要的性质:

        1.如果M是非奇异矩阵,则该矩阵的逆的逆等于原矩阵。

        2.单位矩阵的逆等于它本身。

        3.矩阵转置的逆等于其的逆的转置。

        4.矩阵乘积的逆等于矩阵的逆的相反顺序的乘积。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章