Loading... # Lec03~04: Transformation 变换 ## 1. 基础变换 考虑到 **平移** 需要,引入 **齐次坐标** 对于二维图像上, - 点 $(x, y)$,其齐次坐标为:$(x,y,1)$ - 向量$(x,y)$,其齐次坐标为:$(x,y,0)$ 因为向量具有平移不变性。同时这样可以保证加减性质不变: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005003842.png?x-oss-process=image/resize,p_50) 对于$(x,y,w),\ w>0$ 我们将其等价为$(x/w,\ y/w,\ 1)$ 的**点**。即`点+点`的结果在齐次坐标下即为**两点间的中点** (因为w=2) ### 1.1 缩放 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005000454.png?x-oss-process=image/resize,p_30) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005004405.png?x-oss-process=image/resize,p_50) ### 1.2 旋转 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005000555.png?x-oss-process=image/resize,p_30) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005004420.png?x-oss-process=image/resize,p_50) ### 1.3平移 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005004453.png?x-oss-process=image/resize,p_30) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005004437.png?x-oss-process=image/resize,p_50) ### 1.4 仿射变换 **仿射变换 = 线性变换 + 平移变换** ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005005155.png) ### 1.5 复合变换 多个简单的变换矩阵可以组合成一个矩阵(相乘即可,**注意顺序**) 比如要将某个点绕着一个非原点的点$(a, b)$旋转$\alpha$度,可以进行如下操作: 1. 将点平移$(-a,-b)$ 2. 绕着原点旋转$\alpha$度 3. 将点平移$(a, b)$ ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005010101.png?x-oss-process=image/resize,p_50) ### 1.6 逆变换 变换矩阵 $T$ 的逆矩阵 $T^{-1}$ 即为与 $T$ 相反的逆变换 **正交矩阵:** 观察旋转矩阵$R_\theta$: $$ R_{\theta}=\left(\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right) $$ 若要旋转 $-\theta$ 角度,则其变换矩阵为: $$ R_{-\theta}=\left(\begin{array}{cc} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{array}\right)=R_{\theta}^{T} $$ 显然可以看出,$R_{-\theta} = R_{\theta}^{T} = R_{\theta}^{-1}$ 转置矩阵与逆矩阵相等的矩阵称为 **正交矩阵**。 且**所有的旋转矩阵都是正交矩阵** ## 2. 3D变换 3维空间同样适用二维的齐次坐标规则 3维的仿射变换: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005010406.png?x-oss-process=image/resize,p_50) ### 2.1 缩放 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005161153.png?x-oss-process=image/resize,p_50) ### 2.2 平移 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005161223.png?x-oss-process=image/resize,p_50) ### 2.3 旋转 #### 2.3.1 绕某一轴旋转 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005161402.png?x-oss-process=image/resize,p_70) - 注意:$R_y(\alpha)$中的左下角的$-sin\ \alpha$和右上角的$sin\ \alpha$和常规的旋转矩阵是相反的。xyz轴的关系:z-xy,x-yz,y-zx。所以对于绕y轴旋转,对应的顺序其实是:第3行第3列(zz)、第3行第1列(zx)、第1行第3列(xz)、第1行第1列(xx) *这点在三维叉积公式上也有体现* #### 2.3.2 任意旋转(欧拉角) 任意角度的旋转都可以转换成绕x、y、z轴的旋转的组合 $R_{xyz}(\alpha,\beta,\gamma) = R_{x}(\alpha)R_{y}(\beta)R_{z}(\gamma)$ **Rodrigues 旋转公式**: 绕着 $n$ 向量所在轴,旋转 $\alpha$ 度 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005164937.png) 其中 $I$ 是3阶单位矩阵, $N$矩阵 其实就是 $n$ 向量的叉积矩阵(被该矩阵作用得到的结果 等同于 与n向量叉积的结果) 推导过程:[https://www.cnblogs.com/wtyuan/p/12324495.html](https://www.cnblogs.com/wtyuan/p/12324495.html) ## 3. 视图变换(Viewing Transformation) 我们可以这样来描述视图变换的任务:**将虚拟世界中以(x, y, z) 为坐标的物体变换到 以一个个像素位置(x, y) 来表示的屏幕坐标系之中(2维)**,这确实是一个较为复杂的过程,但是整个过程可以被细分为如下几个步骤: - 模型变换(Model transformation) 摆放模型 - **视图变换**(Viewing transformation) 摆放相机 - 投影变换(Projection transformation) 将相机的视图投影到照片上 模型变换就是上文阐述的直接总用于空间中模型的变换。 想要在二维的屏幕上看到图像还需要**相机**获取**视图**,这部分涉及到的变换,称为**视图变换** 先定义一个**相机**: - positon:$\vec{e}$ - gaze direction:$\vec{g}$ - up direction:$\vec{t}$ ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005183703.png?x-oss-process=image/resize,p_50) 当相机和物体之间没有相对运动的时候,相机所看到的图像是不变的。所以为了方便,我们约定:始终**使相机的位置** $\vec{e}$ **处于原点**,$\vec{g}$ **看向-z轴方向**,$\vec{t}$ **始终朝向y方向**。 当相机变换时,我们同时变换物体,以保持相机与物体的相对静止。 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005193358.png) 要把相机变换到这个指定位置,我们需要对相机进行变换。 - 将 $\vec{e}$ 平移至原点 - 将 $\vec{g}$ 旋转至 -z 轴方向 - 将 $\vec{t}$ 旋转至 x 轴方向 所以可得变换$M_{view} = R_{view}T_{view}$ 其中![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005194345.png?x-oss-process=image/resize,p_50) 对于$R_{view}$,由于直接旋转(将 $\vec{g}$ 旋转至 -z 轴方向,将 $\vec{t}$ 旋转至 y 轴方向)过于复杂,我们考虑其逆变换$R_{view}^{-1}$(将 -z 旋转至 $\vec{g}$ 方向,将 x 旋转至 $\vec{t}$ 方向) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005195121.png) 同时,**所有的旋转矩阵都是正交矩阵** [见1.6],所以易得 $R_{view}$ 即为 $(R_{view}^{-1})^{T}$ 由此,我们就得到了我们所需要的**视图变换**:$M_{view}$ 当我们对相机进行此变换时,**对所有物体同时进行此变换**,就可以保持物体相机相对位置不变。 ## 4. 投影变换(Projection Transformation) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005201250.png) ### 4.1 正交投影(Orthographic projection) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005210136.png) 在摄像机坐标系中选取一个立方体范围,设在 x, y, z 方向上的范围分别是$[l,\ r];\ [b,\ t];\ [f,\ n]$,然后平移并缩放至 $[-1,\ 1]^3$ > 之所以$ f < n$ (far < near),即在 z 轴上远坐标小于近坐标,是因为我们的 gaze-at 方向是顺着 -z 轴方向,所以越远的点z值越小。 > > 这样选取 gaze-at 的方向是为了配合 model,因为 model 是以所有轴正方向作为正向的,以 -z 为 gaze-at 方向可以模拟人类正常的观察方向。如果反向朝向z方向,投影之后物体就是关于原点对称的(x轴)。 > > 这也是为什么有些API(比如OpenGL)使用左手系,可以让z值都方便为正值。 具体操作: - 将物体平移到原点 - 将物体缩放至“标准立方体” ( $[-1,\ 1]^3$ )中 得到变换矩阵: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005210237.png) ### 4.2 透视投影(Perspective projection) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005212051.png?x-oss-process=image/resize,p_50) 透视投影就是最类似人眼所看东西的方式,遵循近大远小 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005212152.png?x-oss-process=image/resize,p_50) 可以将透视投影分解成2个操作: - 先将视椎体(frustum,左) “压缩” 成 “标准立方体“ (cuboid,右),即把远平面进行缩放,使得**近远平面变一样大** ($M_{persp->ortho}$) - 进行正交投影($M_{ortho}$) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211005213836.png?x-oss-process=image/resize,p_50) 我们要如何进行缩放操作?先规定: **近平面的z值是n不会变化**。 **远平面的z值f在向中间挤的过程中也不会变化**。 **远平面的中心点是不受挤压的影响的,挤压之后仍然是中心点。** 此时,投影过程可用下图解释,将$(x,y,z)$一点投影至投影屏幕之后,他的坐标变为$(x^{\prime},y^{\prime},z^{\prime})$ ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006000809.png?x-oss-process=image/resize,p_70) 根据相似三角形可得: $y'=\frac{n}{z}y$ 以及 $x'=\frac{n}{z}x$ 由此,问题便成为:寻找一个变化矩阵 $M_{persp->ortho}$ 使得作用于$(x,y,z,1)$后得到 $(n/z*x,\ n/z*y,\ ?,\ 1)$,即 $(nx,\ ny,\ ?,\ z)$ [见1中齐次坐标定义] 矩阵除第3行以外的值都显然易得: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006003021.png?x-oss-process=image/resize,p_50) 对于第3行,我们需要利用**近平面和远平面的z值不变**的特点来求。 ① 近平面z值不变,用**近平面的z值——n**,去替换z就有了: $M_{persp->ortho}$ 作用于$(x,y,n,1)$后得到$(nx,\ ny,\ n^{2},\ n)$ 显然 $x、y$ 和 $n$ 无关,故第三行前两个值显然为0,设第三第四分别为A、B,则有: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006004357.png?x-oss-process=image/resize,p_50) 即:$An+B=n^{2}$ ② 远平面中点$(0,0,f,1)$不变,所以 $M_{persp->ortho}$ 作用于$(0,0,f,1)$后得到$(0,\ 0,\ f^{2},\ f)$ 即:$Af+B=f^{2}$ 综上两式可得解: $A=n+f$ $B=-nf$ 得出: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006010843.png) 最后的一步,将这个被压缩过的空间,重新正交投影成"标准立方体",故定义透视投影变换$M_{persp}$ 如下: $\large{M_{persp} = M_{ortho}M_{persp->ortho}}$ ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006010743.png) 如何定义近平面的 t,b,l,r (上下左右的位置)呢? 一般常用:**宽高比 (aspect ratio)、垂直可视角度 (fovY)** 来描述 - 垂直可视角度:上端中点,视点,下端中点之间的夹角 ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006205412.png?x-oss-process=image/resize,p_50) ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006205658.png?x-oss-process=image/resize,p_50) 所以便有了: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/20211006205903.png?x-oss-process=image/resize,p_50) ## 5. 坐标系统 为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到上述几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于**局部空间**(Local Space),在这里它称为**局部坐标**(Local Coordinate),它在之后会变为**世界坐标**(World Coordinate),**观察坐标**(View Coordinate),**裁剪坐标**(Clip Coordinate),并最后以 **屏幕坐标** (Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么: ![](https://irimskyblog.oss-cn-beijing.aliyuncs.com/content/coordinate_systems.png) 1. 局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标,一般是在一个以物体中心为原点的空间。 2. 下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放。 3. 接下来我们将世界坐标变换为观察空间坐标,使得每个坐标都是从摄像机或者说观察者的角度进行观察的。 4. 坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。 5. 最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做**视口变换**(Viewport Transform)的过程(*下一篇会讲到视口变换以及光栅化* )。视口变换将位于-1.0到1.0范围的坐标变换到屏幕的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。 最后修改:2021 年 12 月 07 日 03 : 05 AM © 允许规范转载