计算机图形学(二): 线性代数概览(中)

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

本文系原创,转载请注明出处.码字不易,希望大家多多关注,多多点赞!

线性变换

在上一篇文章的开头我们说过,线性代数是研究向量空间和它们之间的线性映射的学科,上一篇文章我们介绍了向量空间,本篇文章将着重介绍它们之间的线性变换.那么什么是线性变换?以及它为何对计算机图形学如此重要呢?
我们先抛开第一个问题来回答第二个问题,主要有以下几个原因:

  1. 首先,从计算上来说,线性方程组是易于求解的.
  2. 图形学中的基本变换(旋转, 平移, 缩放)都可以通过线性变换来表达.
  3. 所有的变换都可以近似的表达为短时间/短距离内的线性变换(Taylor’s Theorem),这种近似处理几乎对几何,动画,渲染,图像处理都有涉及.

线变换射是什么?(几何视角)

我们先从几何视角出发,来直观的感受线性变换到底是什么意思.
1.jpg

  1. 经过线性变换后的图像直线会保持直线
  2. 经过线性变换后的图像原点保持不变

线性变换-代数定义

一个变换f是线性的当且仅当它对向量做变换(vectors to vectors),并且对于任意的向量 u\vec{u} v\vec{v}和标量aa,满足:

  1. f(u+v)=f(u)+f(v)f(\vec{u} + \vec{v}) = f(\vec{u}) + f(\vec{v})
  2. f(au)=af(u)f(a\vec{u}) = af(\vec{u})

换句话说,先对两个向量相加然后做变换,或者对两个向量先变换后相加(缩放同理),结果都是一样的.

2.jpg

线性变换-笛卡尔坐标系下的定义

对于在欧几里得空间RmR^mRnR^n之间的变换(例如从2D到3D的映射),我们可以给出更精确的定义.在n维欧几里得空间中,映射f是线性的当且仅当它可以被表示为:
f(u1,...,un)=i=1nuiaif(u_{1},…,u_{n}) = \sum_{i = 1}^{n} u_{i}\vec{a_{i}} 其中ai\vec{a_{i}}表示构成欧几里得RnR^n空间的第ii个向量.换句话说,它是一个固定向量组的线性组合

举例说明,如下图所示,二维空间的向量u\vec{u}有两个分量u1u2u_{1}和u_{2},线性映射f由两个三维空间的向量a1\vec{a_{1}}a2\vec{a_{2}}组成,根据前文定义,对向量u\vec{u}应用线性变换f,即向u\vec{u}的每个分量对组成线性映射的向量组应用线性组合.
经过f映射后,量u\vec{u}变换为三维空间的另一个向量(fu)(f\vec{u}),我们可以在脑海中想象这样的变换,将二维平面挤压旋转放置到三维空间中,同时在这个过程中保证了直线永远是直线,原点固定不变.
3.jpg

线性变换 vs 仿射变换

先从一个简单的问题开始,有函数f(x)=ax+bf(x) = ax + b,你认为该函数(或者说变换)是线性的吗?从直觉上来说,肯定是的,因为从函数图像我们可以直观的看到,它是一条直线:

4.jpg
但是仔细回想下之前关于线性变换的两条基本原则:1:直线保持直线 2:原点保持不变.很明显该变换违反了第二条原则:原点保持不变,f(0)=bf(0) = b.从代数定义验证同样不满足:

5.jpg

这种变换称为仿射变换(Affine function)

生成空间(Span)

从几何上来说,两个向量u\vec{u}v\vec{v}的生成空间指的是什么?

向量u\vec{u}v\vec{v}构成的平面,即两个向量任意的线性组合得到的向量集合所张成的空间:

au+bva\vec{u} + b\vec{v}

推广到更高维度:

span(u1,...uk)={xVx=i=1kaiui,a1,...,akR}span(\mathbf{u_{1}},…\mathbf{u_{k}}) = \left \{ \mathbf{x} \in V | \mathbf{x} = \sum_{i=1}^{k}a_{i} \mathbf{u_{i}}, a_{1},…,a_{k} \in R \right \}

生成空间 vs 线性变换

生成空间给我们提供了一种描述线性变换的视角.

任何线性变换的图像其实就是构成该线性变换向量所张成的空间.此处的图像指的是函数图像.

3.jpg

如上图所示线性变换ff可以理解为向量a1\vec{a_{1}}a2\vec{a_{2}}所张成的空间,即三维空间中由向量a1\vec{a_{1}}和$\vec{a_{2}}所构成的二维平面.

向量空间的基(Basis)

生成空间和基的概念密切相关,假设我们有nn个向量e1\vec{e_{1}},…en\vec{e_{n}},由这些向量所张成的空间表示为RnR^n:

span(e1,...,en)=Rnspan(\mathbf{e_{1}},…,\mathbf{e_{n}}) = R^n

那么我们可以认为这些向量是构成RnR^n空间的基(Basis)

注1:构成向量空间的基的条件: 基向量是线性独立的(linear independence)

注2:构成向量空间的基向量不一定是正交的,当然正交基在某些情况下很方便

正交基(Orthonormal Basis)

构成向量空间的基向量是正交的当且仅当:

  1. 每个基向量都是单位向量(长度为1)
  2. 基向量相互垂直

换句话说,如果e1\vec{e_{1}},…en\vec{e_{n}}是向量空间RnR^n的基向量并且它们是正交的,当且仅当:

<ei,ej>={1,i=j0,otherwise<\mathbf{e_{i}}, \mathbf{e_{j}}> = \left\{\begin{matrix} 1, i = j \\ 0, otherwise \end{matrix}\right.

6.jpg

使用正交基其中一个好处就是,由正交基构成的向量空间下的向量的运算u12u_{1}^2 + u22u_{2}^2+…+un2u_{n}^2是有明确的几何意义的,即向量的长度的平方.

Gram-Schmidt正交化

那么假设我们有一个非正交基构成的向量空间,如何将其转换为正交基呢?
可以使用Gram-Schmidt算法实现,算法步骤如下:

  1. 标准化(normalize)任意一个基向量u1\vec{u_{1}}(除以向量的模),得到e1\vec{e_{1}}
  2. 拿到另外一个基向量u2\vec{u_{2}},通过向量点积计算u2\vec{u_{2}}e1\vec{e_{1}}上的投影,将u2\vec{u_{2}}分解为平行和垂直于e1\vec{e_{1}}的两个向量,得到垂直于e1\vec{e_{1}}的向量u 2\vec{u^~2}
  3. 标准化该向量得到e2\vec{e_{2}}
  4. 重复以上步骤

7.jpg

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYR7En5Y' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片