我正在参加「掘金·启航计划」
本文系原创,转载请注明出处.码字不易,希望大家多多关注,多多点赞!
线性变换
在上一篇文章的开头我们说过,线性代数是研究向量空间和它们之间的线性映射的学科,上一篇文章我们介绍了向量空间,本篇文章将着重介绍它们之间的线性变换.那么什么是线性变换?以及它为何对计算机图形学如此重要呢?
我们先抛开第一个问题来回答第二个问题,主要有以下几个原因:
- 首先,从计算上来说,线性方程组是易于求解的.
- 图形学中的基本变换(旋转, 平移, 缩放)都可以通过线性变换来表达.
- 所有的变换都可以近似的表达为短时间/短距离内的线性变换(Taylor’s Theorem),这种近似处理几乎对几何,动画,渲染,图像处理都有涉及.
线变换射是什么?(几何视角)
我们先从几何视角出发,来直观的感受线性变换到底是什么意思.
- 经过线性变换后的图像直线会保持直线
- 经过线性变换后的图像原点保持不变
线性变换-代数定义
一个变换f是线性的当且仅当它对向量做变换(vectors to vectors),并且对于任意的向量 和标量,满足:
换句话说,先对两个向量相加然后做变换,或者对两个向量先变换后相加(缩放同理),结果都是一样的.
线性变换-笛卡尔坐标系下的定义
对于在欧几里得空间和之间的变换(例如从2D到3D的映射),我们可以给出更精确的定义.在n维欧几里得空间中,映射f是线性的当且仅当它可以被表示为:
其中表示构成欧几里得空间的第个向量.换句话说,它是一个固定向量组的线性组合
举例说明,如下图所示,二维空间的向量有两个分量,线性映射f由两个三维空间的向量和组成,根据前文定义,对向量应用线性变换f,即向量的每个分量对组成线性映射的向量组应用线性组合.
经过f映射后,量变换为三维空间的另一个向量,我们可以在脑海中想象这样的变换,将二维平面挤压旋转放置到三维空间中,同时在这个过程中保证了直线永远是直线,原点固定不变.
线性变换 vs 仿射变换
先从一个简单的问题开始,有函数,你认为该函数(或者说变换)是线性的吗?从直觉上来说,肯定是的,因为从函数图像我们可以直观的看到,它是一条直线:
但是仔细回想下之前关于线性变换的两条基本原则:1:直线保持直线 2:原点保持不变.很明显该变换违反了第二条原则:原点保持不变,.从代数定义验证同样不满足:
这种变换称为仿射变换(Affine function)
生成空间(Span)
从几何上来说,两个向量和的生成空间指的是什么?
向量和构成的平面,即两个向量任意的线性组合得到的向量集合所张成的空间:
推广到更高维度:
生成空间 vs 线性变换
生成空间给我们提供了一种描述线性变换的视角.
任何线性变换的图像其实就是构成该线性变换向量所张成的空间.此处的图像指的是函数图像.
如上图所示线性变换可以理解为向量和所张成的空间,即三维空间中由向量和$\vec{a_{2}}所构成的二维平面.
向量空间的基(Basis)
生成空间和基的概念密切相关,假设我们有个向量,…,由这些向量所张成的空间表示为:
那么我们可以认为这些向量是构成空间的基(Basis)
注1:构成向量空间的基的条件: 基向量是线性独立的(linear independence)
注2:构成向量空间的基向量不一定是正交的,当然正交基在某些情况下很方便
正交基(Orthonormal Basis)
构成向量空间的基向量是正交的当且仅当:
- 每个基向量都是单位向量(长度为1)
- 基向量相互垂直
换句话说,如果,…是向量空间的基向量并且它们是正交的,当且仅当:
使用正交基其中一个好处就是,由正交基构成的向量空间下的向量的运算 + +…+是有明确的几何意义的,即向量的长度的平方.
Gram-Schmidt正交化
那么假设我们有一个非正交基构成的向量空间,如何将其转换为正交基呢?
可以使用Gram-Schmidt算法实现,算法步骤如下:
- 标准化(normalize)任意一个基向量(除以向量的模),得到
- 拿到另外一个基向量,通过向量点积计算在上的投影,将分解为平行和垂直于的两个向量,得到垂直于的向量
- 标准化该向量得到
- 重复以上步骤