OpenGL计算机图形学OpenGL ES图形处理

用矩阵表述变换与齐次坐标

2018-11-16  本文已影响5人  猫爸iYao

一、线性变换与仿射变换的概念

我们知道在计算机图形学中,变换通常包含线性变换、仿射变换、透视变换等。并且,我们用4x4的矩阵表述变换,同时引入了齐次坐标。那么,为什么会这样呢?

在讨论这个问题之前,我们需要了解一下线性变换和仿射变换的定义。

线性映射:在两个向量空间之间的一种保持向量加法和标量乘法的特殊映射。

线性变换种类较多,通常有旋转、缩放、错切、镜像等。

仿射映射:指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

二、用方程组表述线性变换与仿射变换

首先,我们讨论一下线性变换。由于线性变换种类较多,这里仅讨论最常见的旋转变换

在三维笛卡尔坐标系Oxyz中,我们如何得到点P(x, y, z)绕Z轴逆时针旋转α度后新的坐标P'(x', y', z')

由于是绕Z轴旋转,我们可以轻易地把笛卡尔坐标系转换为Oxy平面上的极坐标系Orr为半径坐标。假设点P与X轴夹角为\theta,我们可以得到P'关于xy的方程(此处z不用考虑)。

\left\{ \begin{array}{c} x = r \cdot cos\theta \\ y = r \cdot sin\theta \\ \end{array} \right. \tag 1
\left\{ \begin{array}{l} x' = r \cdot cos(\theta + \alpha) \\ y' = r \cdot sin(\theta + \alpha) \\ z' = z \end{array} \right. \tag 2
由方程组(1)和方程组(2)可以得出:
\left\{ \begin{array}{l} x' = x \cdot cos\alpha - y \cdot sin\alpha \\ y' = y \cdot cos\alpha + x \cdot sin\alpha \\ z' = z \end{array} \right. \tag 3
接下来我们讨论一下仿射变换中的特例:平移

思考一个问题:在三维笛卡尔坐标系Oxyz中,我们如何平移一个点P(x, y, z)?很简单,我们只需要将每一个坐标分量和对应的偏移量相加即可。
\left\{ \begin{array}{c} x' = x + \Delta x \\ y' = y + \Delta y \\ z' = z + \Delta z \\ \end{array} \right. \tag 4

三、用矩阵表述线性变换和仿射变换

如果我们仅仅做单次的旋转或者平移,上面的方程组已经足够了。然而,在实际的项目当中,我们通常需要做复杂的连续的变换操作。如果还用这种方程组的办法,大量的计算不论是对开发人员还是计算机都是一种不必要的负担。因此,寻找一种更加方便计算的方法是无比迫切的事情。联系到矩阵与方程组的关系,以及矩阵乘法的本质,矩阵表述变换由此变得自然。

因此,旋转变换方程组可以由矩阵表述为:
\left\{ \begin{matrix} x' \\ y' \\ z' \end{matrix} \right\} = \left\{ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x\\ y\\ z \end{matrix} \right\} \tag 5
由式(5)可以得出,旋转变换是一个3x3矩阵(设为M)与点P的乘积结果。即:
f(p) = M \cdot P \tag 6
如果有多线性变换,其结果为:
\begin{align} f(p) & = M_1 \cdot (M_2 \cdot (M_3 \cdot P)) \\ & = (M_1 \cdot M_2 \cdot M_3) \cdot P &\text{根据矩阵乘法结合律} \\ & = M \cdot P \end{align} \tag 7
同理,平移变换可以由矩阵表述为:
\left\{ \begin{matrix} x'\\ y'\\ z'\\ \end{matrix} \right\} = \left\{ \begin{matrix} x\\ y\\ z\\ \end{matrix} \right\} + \left\{ \begin{matrix} \Delta x\\ \Delta y\\ \Delta z\\ \end{matrix} \right\} \tag 8

四、为什么是4x4矩阵?

很遗憾,平移无法用3x3矩阵与向量的乘法来计算。也就是说,3x3矩阵不能使投影变换的计算变得简单方便。

什么样的矩阵才能同时表述线性变换和平移?

回过头去重新审视方程组(3)、(4),上面的问题变成了什么样的矩阵能够同时表达方程组(3)、(4)。

考虑为了同时满足方程组(3)、(4),我们可以构造一个特殊的方程组:
\left\{ \begin{array}{l} x' = cos\alpha \cdot x - sin\alpha \cdot y + \Delta x \\ y' = sin\alpha \cdot x + cos\alpha \cdot y + \Delta y \\ z' = z + \Delta z \end{array} \right. \tag 9
这个方程组是一次旋转与一次平移的结合。然而,方程组中存在常量,我们如何用矩阵乘法来表述这个非齐次方程组呢?

我们可以把它看作一个四元齐次式,其中新增一个分量w用来表示偏移量:
\left\{ \begin{array}{l} \Delta x = a \cdot w ,& \text{$a \neq 0$} \\ \Delta y = b \cdot w ,& \text{$b \neq 0$} \\ \Delta z = c \cdot w ,& \text{$c \neq 0$} \end{array} \right. \tag{10}
由方程组(9)、(10)可知:
\left\{ \begin{array}{l} x' = cos\alpha \cdot x - sin\alpha \cdot y + a \cdot w \\ y' = sin\alpha \cdot x + cos\alpha \cdot y + b \cdot w \\ z' = z + c \cdot w \\ w' = w \end{array} \right. \tag{11}
现在,我们可以用4x4矩阵来表述方程组(11):
\left\{ \begin{matrix} x' \\ y' \\ z' \\ w' \end{matrix} \right\} = \left\{ \begin{matrix} cosα & -sinα & 0 & a\\ sinα & cosα & 0 & b\\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ w \end{matrix} \right\} \tag{12}
此时,我们已经可以用4x4矩阵同时表述旋转与平移。代价是我们新增了一个分量w

五、齐次坐标

上面提到的三位点P额外添加一个分量w组成的四元组,其实就是齐次坐标。那么,我们如何用齐次坐标表示三维的点呢?

事实上,齐次坐标(x, y, z, w) \Leftrightarrow 三维坐标 (x/w, y/w, z/w)w \neq 0

六、齐次坐标如何区分向量与点

由方程组(10)、(12)中,当w=1\alpha = 0^\circ时,
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} 1 & 0 & 0 & \Delta x \\ 0 & 1 & 0 & \Delta y \\ 0 & 0 & 1 & \Delta z \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ 1 \end{matrix} \right\} \tag{13}
这就是点P的平移变换。

我们也知道,线性变换是发生在两个向量空间之间的,也就是说,一个向量经过线性变换会生成一个新的向量。而向量是没有位置的,所以向量没有平移变换。为了使得平移对向量无效,此时,w = 0

由方程组(10)、(12)可知,当w=0时,三维向量的旋转变换矩阵表述为
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 0 \end{matrix} \right\} = \left\{ \begin{matrix} cos \alpha & -sin \alpha & 0 & \Delta x \\ sin \alpha & cos \alpha & 0 & \Delta y \\ 0 & 0 & 1 & \Delta z \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ 0 \end{matrix} \right\} \tag{14}
由方程式(13)、(14)可知,齐次坐标可以很好的区分向量和点。即,(x, y, z, 1)是点,(x, y, z, 0)是向量。

上一篇下一篇

猜你喜欢

热点阅读