计算机图形学(五): 渲染管线-空间变换(上)

626 阅读5分钟

我正在参加「掘金·启航计划」

本章我们将开始学习空间变换,空间变换在图形学中有非常广泛的应用,对于我们深入了解图形学底层有很重要的意义,特别在光栅化渲染管线中, 我们知道最初输入的顶点坐标都是物体局部空间的(LocalSpaceLocal Space), 需要经过一系列的变换将物体从局部空间变换为世界空间(物体摆放在场景的哪里,物体的相对位置关系),接下来再变换到相机空间(即我们观看的视角,就像拿个相机拍照一样,我们是从哪个角度对场景进行观察的),即mvp矩阵中的"mm(model Matrix)和vv(view Matrix)".这一系列操作即光栅化渲染管线的第一个阶段,也是理解光栅化背后原理的基础.本章将介绍涉及图形学的基础变换

1.png

空间变换(Spatial Transformation)

任何将一个点转换到一个新位置的函数都可以被认定为空间变换 f:RnRnf: R^n \to R^n 今天我们将重点学习几种基本变换:

  • 旋转(RotationRotation)
  • 缩放(ScalingScaling)
  • 平移(TranslationTranslation)(仿射变换)
  • 错切(ShearingShearing)
  • 镜像("ReflectReflect")

重点讲解 1. 空间几何表示 2. 矩阵表示 3.齐次坐标 4.如何用齐次坐标解决仿射变换和线性变换统一问题

线性变换回顾

前几章我们详细阐述了线性变换的定义,并从几何上和代数上分别对其做了解释:

  1. 从几何的角度,线性变换会保持直线变换后仍然为直线,并保持原点不变

2.jpg

  1. 从代数角度:

f(u+v)=f(u)+f(v)f(\vec{u} + \vec{v}) = f(\vec{u}) + f(\vec{v})

f(au)=af(u)f(a\vec{u}) = af(\vec{u})

3.jpg

为什么我们要关注线性变换?

  1. 应用成本低廉
  2. 容易求解
  3. 多个线性变换的符合构造仍然是线性的
  4. 多个线性变换的乘积可以用单个矩阵来表达
  5. 对各种变换提供了统一的表达方式

变换的种类

4.jpg

各种变换的特征(经过变换后哪些保持不变)

变换不变性代数描述
线性直线保持直线 原点不变性f(ax+y)=af(x)+f(y)f(ax + y) = af(x) + f(y), f(0)=0f(0) = 0
平移两点之间相对位置不变f(xy)=xyf(x-y) = x- y
缩放直线经过原点 任意一点的方向不变f(x)/f(x)=x/xf(x)/\|f(x)\| = x/\|x\|
旋转原点保持不变,两点之间距离不变,面的朝向不变f(x)f(y)=xy,def(f)>0\|f(x) - f(y)\| = \|x-y\|,def(f) > 0

旋转(RotationRotation)

5.png 旋转有三个特征,保持原点不变,保持两点之间距离不变,保持面的朝向不变,前两个特征意味着旋转是一个线性变换

二维旋转

我们知道旋转保持距离和原点不变,因此,二维旋转(旋转角度θ\theta)会将点xx映射到同一半径的圆上的一点fθ(x)f_{\theta}(x)

6.jpg

那么当点xx位于(1,0)处时(1, 0)处时,逆时针旋转θ\theta,点会被映射到哪里呢?

8.jpg

根据简单的三角函数可知,该点的坐标被旋转后为(cos(θ),sin(θ))(\cos(\theta), sin(\theta)).

同理当点位于(0,1)(0, 1)时,被旋转θ\theta角后为(sin(θ),cos(θ))(-\sin(\theta), \cos(\theta))

9.jpg

那么对于任意一个点(x,y)(x,y),该怎么办呢? 我们可以将任意向量分解为两个基向量的线性组合:

10.jpg

x=[x1x2]=x1[10]+x2[01]x = \begin{bmatrix} x1\\ x2 \end{bmatrix} = x_{1}\begin{bmatrix} 1\\ 0 \end{bmatrix} + x_{2}\begin{bmatrix} 0\\ 1 \end{bmatrix}

通过上边的推导(特殊的两个点/basis),我们知道二维空间下基向量是如何旋转的,因此只需要简单的应用基向量的线性组合.

11.jpg

f(x)=x1[cos(θ)sin(θ)]+x2[sin(θ)cos(θ)]f(x) = x_{1}\begin{bmatrix} \cos(\theta)\\ \sin(\theta) \end{bmatrix} + x_{2}\begin{bmatrix} -\sin(\theta)\\ \cos(\theta) \end{bmatrix}

二维旋转的矩阵表示: fθ(x)=[cos(θ)sin(θ)sin(θ)cos(θ)]f_{\theta}(x) = \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta) \end{bmatrix}

三维旋转

在三维空间,如何围绕基向量ZZ旋转?只需要保持该基向量不变,其他应用二维变换即可:

[cos(θ)sin(θ)0sin(θ)cos(θ)0001]\begin{bmatrix} \cos(\theta)&-\sin(\theta) & 0 \\ \sin(\theta)&\cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}

围绕XX旋转:

[1000cos(θ)sin(θ)0sin(θ)cos(θ)]\begin{bmatrix} 1 & 0 & 0\\ 0 & \cos(\theta)&-\sin(\theta)\\ 0 & \sin(\theta)&\cos(\theta) \end{bmatrix}

旋转矩阵: 矩阵的转置 = 矩阵的逆

旋转会将标准正交基变换为另外一个正交基e1,e2,e3e_{1},e_{2},e_{3},旋转矩阵可以用正交基e1,e2,e3e_{1},e_{2},e_{3}来表示,其中每个基向量做为旋转矩阵的一列,而矩阵的转置是将矩阵的每一列放到对应的行:

12.jpg

13.jpg

有趣的地方来了,当我们将两个矩阵相乘:

14.jpg

15.jpg

我们知道变换后的基向量是正交基(根据旋转矩阵的性质),根据正交基的定义,基向量相互垂直,推导出:

16.jpg

向量均为单位向量,长度为1,推导出:

17.jpg

重要结论

RTR=IR^TR = I

R1R=IR^{-1}R = I

RTR=R1RR^TR = R^{-1}R

RT=R1\Longrightarrow R^T = R^{-1}

旋转矩阵的转置等于它的逆矩阵,这个结论为什么很有用呢,因为矩阵的逆比较难计算,而矩阵的转置相对计算廉价,因此我们可以利用旋转矩阵的这一特殊性质求它的逆矩阵:转置即可.

反射(RelectionRelection)

那么,任何满足QTQ=IQ^TQ = I的矩阵都是旋转矩阵吗? 考虑下边的矩阵:

Q=[1001]Q = \begin{bmatrix} -1&0 \\ 0&1 \end{bmatrix} QTQ=[(1)2001]=IQ^TQ = \begin{bmatrix} (-1)^2&0 \\ 0&1 \end{bmatrix} = I

18.jpg

那么QQ是旋转矩阵吗?显然不是的,该矩阵描述了水平方向上的镜像变换,违反了旋转矩阵的面朝向不变性,是一个反射矩阵(ReflectionsReflections)

正交矩阵(OrthogonalTransformationsOrthogonal Transformations)

我们将这种类型的矩阵(保持距离和原点不变)称之为正交矩阵,旋转矩阵和反射矩阵都是正交矩阵的子集,代数表示:

QTQ=IQ^TQ = I

旋转矩阵: 除了保持距离和原点不变以外,还会保持朝向不变: det(Q)>0det(Q) >0

反射矩阵: 反转朝向:det(Q)<0det(Q) < 0

本章我们深入了解了其中两种变换,旋转和反射,并将其推广到了更泛化的定义:正交矩阵,下一章我们将深入探讨缩放/错切/平移矩阵.

本系列文章会不定期更新,如果你觉得文章对你有帮助,可以订阅专栏计算机图形学,第一时间获取文章更新信息,也希望小伙伴们多多关注,多多点赞:)