美文网首页OpenGL计算机图形学OpenGL ES图形处理
仿射空间中几种基本映射的矩阵表述

仿射空间中几种基本映射的矩阵表述

作者: 猫爸iYao | 来源:发表于2018-11-22 17:37 被阅读3次

用矩阵表述变换与齐次坐标一文中我们了解了旋转、平移的矩阵表述。在这里,我们试着总结一下仿射空间中其他几种映射的矩阵表述。

为了方便观察,在这里我们仅讨论二维空间中的基本变换。对于每一个变换,我们采取方程组,坐标系图,矩阵分别描述,便于理解。

一、旋转

旋转在几何和线性代数中是描述刚体围绕一个固定点的运动的在平面或空间中的变换。

需要注意,在这里我们只讨论比较常用的“坐标系保持不动,向量绕坐标轴旋转”观点。

对于给定点P(x, y, z),计算其绕Z轴逆时针旋转\alpha ^\circ后新的坐标P'(x', y', z')。如下图所示:

旋转

由于涉及到角度,我们可以把笛卡尔坐标系转换为极坐标系,设r为极半径。则P点坐标为
\left\{ \begin{array}{l} x = r \cdot cos\beta \\ y = r \cdot sin\beta \\ z = z \end{array} \right. \tag1
相应的,P'点坐标为
\left\{ \begin{array}{l} x' = r \cdot cos(\alpha + \beta) \\ y' = r \cdot sin(\alpha + \beta) \\ z' = z \end{array} \right. \tag2
由方程组(1)、(2)可知,P'关于x, y的方程为:
\left\{ \begin{array}{l} x' = x \cdot cos\alpha - y \cdot sin\alpha \\ y' = x \cdot sin\alpha + y \cdot cos\alpha \\ z' = z \end{array} \right. \tag3
用4x4矩阵可以表述为:
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} cos\alpha & -sin\alpha & 0 & 0\\ sin\alpha & cos\alpha & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right\} \tag4
即,三维旋转变换矩阵为:
\left\{ \begin{matrix} cos\alpha & -sin\alpha & 0 & 0\\ sin\alpha & cos\alpha & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\}

同样的方法,我们可以得出下面几种常见的旋转变换矩阵:
\begin{array}{c} \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & cos\alpha & -sin\alpha & 0\\ 0 & sin\alpha & cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & cos\alpha & sin\alpha & 0\\ 0 & -sin\alpha & cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{点$P$绕X轴逆时针旋转$\alpha^\circ$} & \text{点$P$绕X轴顺时针旋转$\alpha^\circ$} \\[2ex] \left\{ \begin{matrix} cos\alpha & 0 & -sin\alpha & 0\\ 0 & 1 & 0 & 0\\ sin\alpha & 0 & cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} cos\alpha & 0 & sin\alpha & 0\\ 0 & 1 & 0 & 0\\ -sin\alpha & 0 & cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{点$P$绕Y轴逆时针旋转$\alpha^\circ$} & \text{点$P$绕Y轴顺时针旋转$\alpha^\circ$} \\[2ex] \left\{ \begin{matrix} cos\alpha & -sin\alpha & 0 & 0\\ sin\alpha & cos\alpha & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} cos\alpha & sin\alpha & 0 & 0\\ -sin\alpha & cos\alpha & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{点$P$绕Z轴逆时针旋转$\alpha^\circ$} & \text{点$P$绕Z轴顺时针旋转$\alpha^\circ$} \end{array}

二、缩放

缩放在欧式空间中是描述延某一方向或所有方向按照一定缩放因子放大或者缩小物体的线性变换。

我们通常讨论物体延一个或多个坐标轴方向的缩放,每一个坐标轴方向都有其单独的缩放因子。

当所有坐标轴方向的缩放因子一样时,此时的缩放叫做均匀缩放位似变换。均匀缩放的结果在几何意义上相似于原始物体。

当各坐标轴方向的缩放因子不同时,缩放后结果的形状可能发生变化,此时的缩放被叫做方向缩放

对于给定物体中某一点P(x, y, z),计算其均匀缩放m(m>1时为放大, 0<m <1时为缩小)后的结果P'(x', y', z')

在这里,我们讨论的是三维空间的均匀缩放。但是为了便于观察,我使用了二维平面的均匀缩放的图示。


缩放

如图所示,我们已知点P(x, y, z)的坐标,则P'(x', y', z')坐标可表示为
\left\{ \begin{array}{l} x' = mx \\ y' = my \\ z' = mz \end{array} \right. \tag5
用4x4矩阵表示为
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} m & 0 & 0 & 0 \\ 0 & m & 0 & 0 \\ 0 & 0 & m & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right\} \tag6
即,三维缩放变换矩阵为:
\left\{ \begin{matrix} m & 0 & 0 & 0 \\ 0 & m & 0 & 0 \\ 0 & 0 & m & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\}

同样的方法,我们可以得出下面几种常见的缩放变换矩阵(缩放因子m):
\begin{array}{c} \left\{ \begin{matrix} m& 0 & 0 & 0\\ 0 & m & 0 & 0\\ 0 & 0 & m & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} m & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{均匀缩放} & \text{X轴方向缩放} \\[2ex] \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & m & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & m & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{Y轴方向缩放} & \text{Z轴方向缩放} \end{array}

三、平移

平移在仿射空间中指物体延同一方向移动相同距离的变换。

平移是一种等距同构的变换,它可以被视为某一向量施加于物体每一点的结果。即,设v是已知向量,P为空间中一点,则平移
T_v(P) = P + v \tag7
对同一物体的多次连续平移,其结果可用一次平移表示,它符合向量的加法法则。即
T_v(T_u(P)) = T_{v+u}(P) \tag8

对于给定点P(x, y, z),计算施加向量v(\Delta x, \Delta y, \Delta z)的平移结果P'(x', y', z')

同样,为了便于观察,我们使用二维空间的平移图示。如下图:


平移

如图所示,我们已知点P(x, y, z)的坐标,则点P'(x', y', z')坐标可表示为
\left\{ \begin{array}{l} x' = x + \Delta x \\ y' = y + \Delta y \\ z' = z + \Delta z \end{array} \right. \tag9
用4x4矩阵表示为
\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\} \cdot \left\{ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right\} \tag{10}
即平移变换矩阵为
\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\}

四、反射

反射在仿射空间中指把物体变换成它的镜像的映射。

需要注意,这里的反射与渲染阶段的光线“反射”不是同一个概念。这里是指数学意义上的反射。

对于给定点P(x, y, z),计算其针对x-z平面的镜像结果。如下图所示:

反射

由上图可以很容易得到,P'(x', y', z')关于xyz的方程组
\left\{ \begin{array}{l} x' = x \\ y' = -y \\ z' = z \end{array} \right. \tag{11}
用4x4矩阵表示为
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right\} \tag{10}
P(x, y, z)针对平面x-z的反射映射矩阵为
\left\{ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\}
同样可以得出以下一些常见的反射变换矩阵
\begin{array}{c} \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} -1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & -1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{针对平面$x-y$反射} & \text{针对平面$y-z$反射} & \text{针对平面$x-z$反射} \end{array}

五、投影

投影是指一个从向量空间V映射到它自身的线性变换。

投影是生活中“平行投影”概念的形式化和一般化。例如,在现实生活中,阳光照射物体在地面留下的影子。我们假设阳光是沿着同一方向(平行且垂直于地面的)照射物体,地面是严格的平面。那么,这就是投影最直观的例子。

对于给定点P(x, y, z),计算其在平面y-z上的投影点P'(x', y', z')。如下图:

投影
根据上图,可得 错切

如上图所示,直线P'D是直线PD在平行于X轴方向上绕Z轴的错切。

此时,点P(x, y, z)经过错切的结果点P'(x', y', z')关于xyz的方程组为

\left\{ \begin{array}{l} x' = x + my,& \text{$m$为缩放因子} \\ y' = y \\ z' = z \end{array} \right. \tag{11}
用4x4矩阵表述为
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} 1 & m & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right\} \tag{12}
即水平方向(平行于X轴方向)上的错切变换矩阵为
\left\{ \begin{matrix} 1 & m & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\}

相应的,我们可以算出一下几种常见的错切变换矩阵(m为错切因子):
\begin{array}{c} \left\{ \begin{matrix} 1 & m & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & m & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{平行于X轴方向绕Z轴的错切} & \text{平行于X轴方向绕Y轴的错切} \\[2ex] \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ m & 1 & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & 1 & m & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{平行于Y轴方向绕X轴的错切} & \text{平行于Y轴方向绕Z轴的错切} \\[2ex] \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ m & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} & \left\{ \begin{matrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & m & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} \\[2ex] \text{平行于Z轴方向绕X轴的错切} & \text{平行于Z轴方向绕Y轴的错切} \\[2ex] \end{array}

七、总结

上面我们已经了解了反射空间几种基本变换的矩阵表述。下面我们来重新整理一下,首先看如下适用于列向量的4x4矩阵。
A = \left[ \begin{array}{ccc|c} a & b & c & x \\ d & e & f & y \\ g & h & i & z \\ \hline l & m & n & w \end{array} \right]
我们可以很容易地发现,对于矩阵A

元素\{a,b,c,d,e,f,g,h,i\}与线性变换有关;

元素\{x, y, z\}与仿射变换有关。

那么,元素\{l, m, n\}有什么作用呢?

其实,这三个元素与透视投影变换有关。用矩阵表述变换是不是非常神奇?

相关文章

  • 仿射空间中几种基本映射的矩阵表述

    在用矩阵表述变换与齐次坐标一文中我们了解了旋转、平移的矩阵表述。在这里,我们试着总结一下仿射空间中其他几种映射的矩...

  • OpenCV图像处理(十六)重映射和仿射变换

    1、重映射 函数原型 以下为函数应用及效果展示: 2、仿射变换 仿射变换是指在向量空间中进行一次线性变换(乘以一个...

  • CGAffineTransform

    CGAffineTransform用于绘制2D图形的仿射变换矩阵。 仿射变换矩阵用于旋转,缩放,平移或倾斜在图形上...

  • 线性代数-矩阵简介

    矩阵在iOS中可以做什么呢比较常见的? 仿射变换,下图就是利用矩阵进行仿射变换的效果,做的一个筛子。 看看矩阵怎么...

  • 仿射矩阵

    如何通俗地讲解「仿射变换」这个概念? - 马同学的回答 - 知乎https://www.zhihu.com/que...

  • iOS CGAffineTransform 详解

    CGAffineTransform 定义 用于绘制2D图形的一个仿射变换矩阵。一个仿射变换矩阵用于做旋转、缩放、平...

  • 详细解析 CGAffineTransform 矩阵

    CGAffineTransform 是对于仿射变换矩阵进行了封装,而要理解仿射变换(affine transfor...

  • iOS开发经验(6)-Transform

    目录(transform) 基础及矩阵概念 2D仿射 3D仿射 1. 基础及矩阵概念 在iOS的动画效果中,变换是...

  • CGAffineTransform讲解

    用于绘制平面图形的一个仿射变换矩阵。用于做旋转、缩放、平移,一个仿射变换矩阵是一个3*3的矩阵,只用于 xy坐标,...

  • affine transoform仿射变换

    仿射变换矩阵公式: python实现 python中有大量的包提供仿射变换的方法。一、from skimage i...

网友评论

    本文标题:仿射空间中几种基本映射的矩阵表述

    本文链接:https://www.haomeiwen.com/subject/waskqqtx.html