[3D 图形学基础] 读书笔记(2) Part_I(Getting Started) - Linear 线性

来源:互联网 发布:神策分析数据分析技术 编辑:程序博客网 时间:2024/06/07 02:51

本章是颇为基础的一章,主要有这些内容~

1. 定义了一套符号系统,用于表示三维中各种对象,并定义了这些符号相互间的运算规则,个人感觉在分析问题时非常有用,可以让你摆脱数字的困扰,从更抽象的层面来思考问题。本书其他章节也通篇使用了这一套符号系统。关键内容就是4个:点、向量、坐标系向量和坐标系统。

2. 讨论了矩阵所代表的线性变换。初学线性代数的时候确实困惑了一阵子矩阵的问题,其实从线性变换的角度来理解矩阵是非常清楚的:以三维空间为例,假设我们有一组(3个)向量基,由这组向量基定义出一个三维向量空间,在这个空间内描述一个向量,那么当我们对这个向量进行线性变换时,无非就是对这一组(3个)向量基进行了新的线性组合而已,而这个线性组合的内容,就可以写作矩阵的形式。

3. 解释了向量的点乘与叉乘,这里讲得不是很清楚,只是提到了计算公式,想要知道具体的原理还需要自己翻翻其他的资料。

4. 介绍了利用矩阵进行旋转和缩放操作,其实就是旋转矩阵和缩放矩阵内部各项参数的构成。

文章结束有本章内容的PDF链接~


Chapter_2 Linear 线性


[向量与线性变换]
我们学习3D计算机图形学的第一件任务,是理解怎样用坐标系来表示点,以及怎样对这些点实施有用的几何变换。学习线性代数时你可能已经见过类似的内容,但是,在计算机图形学中,我们常常同时使用许多不同的坐标系统,并且同样地,我们需要特别关注这些不同的坐标系统各自起到的作用。最终,我们处理这些基本内容的方式或许也会和线性代数有些不同。

在本章中,我们从向量和线性变换开始。向量用来表示三维运动,而线性变换用来操作向量,例如旋转和缩放。在随后的几章中,我们会了解到仿射(affine)变换,它增加了平移的功能。在第6章之前我们都不会进入到实际的编程中。我们会先仔细理解相应的原理,这样在随后开始编程时,实现我们想要的功能就会更容易。

2.1 Geometric Data Types 几何体类型

假想一些真实世界中的几何点。这样的点在三维空间中可以用三个实数来表示,
xyz
[坐标系统,坐标系向量和几何点]
我们称之为坐标系向量(coordinate vector)。这些数用于表示某点的位置,它与某个默认坐标系统(coordinate system)相关,该坐标系统有默认的原点和方向。如果我们需要改变默认坐标系统,我们就会需要用不同的数字,不同的坐标系向量,来描述同样一个点。所以,为了指明一个点的实际位置,我们同时需要一个坐标系统和一个坐标系向量。这样我们就必须非常小心区分以下概念:坐标系统,坐标系向量和几何点。

[几何点,向量,坐标系向量和坐标系统在本书中的符号]
我们从四种类型的数据开始,每种类型有它自己的表示符号(图2.1)。

  • 点:p~用带有波浪线的字母表示,这是一个几何点,而不是数值对象。
  • 向量:v⃗ 用上方带有箭头的字母表示。这也是一个非数值对象。我们在第3章会更详细的解释向量和点的区别。它们最主要的区别是点代表位置,而向量代表点与点之间的位移。
  • 坐标系向量:c由粗体字母表示,坐标系向量是一个由实数组成的数值对象。
  • 坐标系统:ft由粗体字母、箭头和上标t表示。(我们用粗体来表示垂直方向上的集合,上标t将它转换为一个水平方向的集合,而箭头告诉我们它是一个向量的集合而非数值的。)实际上有两种坐标系统,向量基(basis)用来描述向量,坐标系(frame)用来描述点。我们使用同一个符号,利用上下文来区分它们。


    几何数据类型:点类型用圆点表示,向量用箭头表示。向量表示点与点之间的位移,平移对向量不产生影响。坐标系(frame)表示一个坐标系统,由一个原点和一组向量基表示。坐标系向量是三个一组的实数。

[依赖符号进行对象计算]
在下面以及随后的章节中,我们会定义所有的对象类型,以及可以对它们进行的操作。当思考如何操作几何体时,我们会极大的依靠符号来完成数值的(坐标系向量)和非数值的(向量和坐标系统)对象计算。我们只有预先建立好所有必须的惯例,到了第5章才能够放下非数值对象,而使用其数值部分在计算机代码中完成计算。

2.2 Vectors, Coordinate Vectors, and Bases 向量,坐标系向量和向量基

[向量是抽象的位移概念,坐标系向量是特定坐标系下的一组实数]
首先,我们要清晰的区分向量和坐标系向量。在本书中,向量总是抽象的几何实体用以表示世界中两个点之间的位移。例如“向东一英里”。坐标系向量是在我们有一个默认坐标系统时,用于表示向量的一组实数。

[定义向量空间]
正式来说,一个向量空间V是一系列满足特定规则的v⃗ 元素。特别是,需要定义一个加法运算,将两个向量映射到第三个上。也还需要定义一个乘法,将实数标量乘以一个向量来得到另一个向量。

要得到一个有效的向量空间,还需要遵守一些其他的规则,我们不会在此很详细的展开描述。
例如,加法运算需要符合结合律和交换律。
再例如,标量乘法必须符合分配率

α(v⃗ +w⃗ )=αv⃗ +αw⃗ 

…等等。

有很多对象类型都符合向量空间的结构。
但是在本书中,我们将会关注于,在实际的几何体点间,由实际运动所构成的向量空间。特别是,我们不会(从纯数学的角度)将向量看做三个数的集合

[定义坐标系统]
一个坐标系统,或者向量基,是一小组向量,通过向量运算可以利用它来产生整个向量集合。(更正式一点,我们说一组向量b⃗ 1b⃗ n是线性相关的,如果存在非零的标量α1αn使得iaib⃗ i=0。如果一组向量不是线性相关的,随后我们可以称它为非线性相关。如果b⃗ 1b⃗ n非线性相关,并且可以通过加法和标量乘法产生出完整的向量空间V,那么集合b⃗ i称作V的向量基,并且我们说n是该基/空间的维度。)对于空间中的任意运动,它的维度为3.我们也会把每一个向量基称为轴向(axis),特别地我们会称第一个轴向为x,第二个轴向为y,第三个轴向为z

我们可以使用一组向量基来生成空间中的任意向量。可以用一组唯一的坐标系向量ci表示如下。

v⃗ =icib⃗ i

[用符号表示向量基与坐标系向量]
也可以使用向量代数符号写作如下
v⃗ =icib⃗ i=[b⃗ 1b⃗ 2b⃗ 3]c1c2c3(2.1)

上述公式最右侧的表达式使用了线性代数中标准的矩阵乘法。其中,每个cib⃗ i表示一个实数标量与抽象向量相乘。我们可以使用速记符号将其写作

v⃗ =b⃗ tc

其中v⃗ 是向量,bt是一行向量基,而c是(列)坐标系向量。

2.3 Linear Transformations and 3 by 3 Matrices 线性变换与3x3矩阵

[线性变换的两个基本属性]
一个线性变换L即是从VV的变换,满足以下两个属性:

L(u⃗ +v⃗ )L(αv⃗ )=L(v⃗ )+L(u⃗ )=αL(v⃗ )

我们使用符号v⃗ L(v⃗ )来表示向量v⃗ 通过L变换为L(v⃗ )

其中的线性变换部分可以用矩阵来表示。这是因为线性变换可以通过其对向量基的影响来直接表示。以下为它的工作方式:

[对向量变换等同于对向量基变换]
上面描述的两个线性属性暗示了以下关系

v⃗ L(v⃗ )=L(icib⃗ i)=iciL(b⃗ i)

我们可以将公式(2.1)写作线性代数符号的形式

[b⃗ 1b⃗ 2b⃗ 3]c1c2c3[L(b⃗ 1)L(b⃗ 2)L(b⃗ 3)]c1c2c3

[用矩阵对一组向量基中的每个单独向量进行变换]
L(b⃗ i)三个维度的向量中,每个单独的新向量自身也是V中的元素,并且每个向量都最终都可以写作原始向量基的某种线性组合。例如,使用恰当的Mj,1可以写为

L(b⃗ 1)=[b⃗ 1b⃗ 2b⃗ 3]M1.1M2.1M3.1

[用矩阵变换完整的向量基]
对向量基中所有的向量进行这样的变换,我们就得到了

[L(b⃗ 1)L(b⃗ 2)L(b⃗ 3)]=[b⃗ 1b⃗ 2b⃗ 3]M1.1M2.1M3.1M1.2M2.2M3.2M1.3M2.3M3.3(2.2)

其中M由9个恰当的实数组成。

[用矩阵将一个向量变换为另一个向量]
将这些内容组合起来,我们可以看出对于向量进行线性变换的操作可以表示为:

[b⃗ 1b⃗ 2b⃗ 3]c1c2c3[b⃗ 1b⃗ 2b⃗ 3]M1.1M2.1M3.1M1.2M2.2M3.2M1.3M2.3M3.3c1c2c3

总的来说,我们可以使用矩阵将一个向量变换为另一个

b⃗ tcb⃗ tMc

(图2.2)。
这里写图片描述
经过线性变换的向量v⃗ =b⃗ tcb⃗ tMc。矩阵M与线性变换的具体内容相关。

[用矩阵变换向量基]
如果我们对一组向量基中的每个向量进行变换,我们会得到新的基。这可以表示为

[b⃗ 1b⃗ 2b⃗ 3][b⃗ 1b⃗ 2b⃗ 3]M1.1M2.1M3.1M1.2M2.2M3.2M1.3M2.3M3.3

或者,简写为

b⃗ tb⃗ tM

(图2.3)
这里写图片描述
经过线性变换的向量基b⃗ tb⃗ tM

并且,矩阵也可以和坐标系向量相乘,

cMc

2.3.1 Identity and Inverse 单位矩阵和逆矩阵

单位变换(identity map)不改变任何向量。它的对应矩阵是单位矩阵(identity matrix)

I=100010001

矩阵M的逆是唯一的M1,具有属性MM1=M1M=I。它表示对向量进行逆向变换。如果一个线性变换恰好会使得多个输入向量变换为同样的输出向量,则该变换不可逆,而它的相关矩阵也没有逆。在计算机图形学中,当选择一个3D到3D的线性变换来在空间中移动对象(包括缩放),很少会有需要用到不可逆变换。因此,除非有特殊说明,在本书中用到的所有矩阵都是可逆的。

2.3.2 Matrices for Basis Changes 矩阵用于变换向量基

除了用来描述变换(),矩阵也可以用来描述一组基或向量间的相等关系(=)。尤其是,在等式(2.2)中,我们可以看到以下形式的表达式

a⃗ ta⃗ tM1=b⃗ tM=b⃗ t(2.3)(2.4)

这表达了向量基a⃗ tb⃗ t之间的相等关系。

假设一个向量在一个特定的向量基内用一个特定的坐标系向量表示:
v⃗ =b⃗ tc。给定等式(2.3),则有

v⃗ =b⃗ tc=a⃗ tM1c

这并非是一个变换(否则会用到符号),而是一个等式(使用了=符号)。我们简单的用两个向量基写出了同一个向量。坐标系向量cb⃗ 下描述了向量v⃗ ,而坐标系向量M1ca⃗ 下描述了同一个向量v⃗ 

2.3.3 Extra Structure 其他结构

[向量点乘]
3D空间中的向量也可以进行点乘操作

v⃗ w⃗ 

它输入两个向量,返回一个实数值。点乘允许我们来定义向量的平方长度(也叫做squared norm)

|v⃗ |2:=v⃗ v⃗ 

点乘结果与两向量间的夹角θ[0π]相关

cos(θ)=v⃗ w⃗ |v⃗ ||w⃗ |

v⃗ w⃗ =0我们说两向量垂直。
当一组向量基的向量都为单位长度且两两相互垂直时,我们说它是一组正交向量基。

在一组正交基b⃗ t中,很容易计算两个向量(b⃗ tc)(b⃗ td)的点乘。特别是,有

b⃗ tcb⃗ td=(icib⃗ i)jdjb⃗ j=ijcidj(b⃗ ib⃗ j)=icidi

其中第二行我们使用了点乘是双线性操作符的性质,而第三行依据了向量基的正交性。

[向量基的手性]
当一组二维向量基的第二个向量基可以通过将第一个向量基逆时针旋转90度得到时,我们说这组二维正交基是右手性 的(在这里向量基的顺序非常重要)。

当三个向量基(有序的)按照图2.4的方式排列时,我们说一组三维向量基是右手性的,与图2.5相反。摊开右手,用手指指向第一个向量基,将手指向第二个向量基方向弯曲,此时你的大拇指将会指向第三个向量基方向。
这里写图片描述
一个右手正交坐标系统。z轴指向画面外。图中也表示了绕着x轴的旋转方向。

这里写图片描述
一个左手正交坐标系统。z轴指向画面内。

[向量叉乘]
在三维中,我们还有叉乘操作,输入两个向量,输出一个向量,定义为

v⃗ ×w⃗ :=|v⃗ ||w⃗ |sin(θ)n⃗ .

其中n⃗ 是与由v⃗ w⃗ 组成的平面垂直的单位向量,因此[v⃗ ,w⃗ ,n⃗ ]组成了一个右手坐标系。

在一个右手正交向量基b⃗ t中,计算两个向量(b⃗ tc)×(b⃗ td)的叉乘是很容易的。特别是,它在向量基b⃗ t下的坐标系向量可以如下计算

c2d3c3d2c3d1c1d3c1d2c2d1

2.4 Rotations 旋转

[用轴-角的方式理解旋转]
我们最经常遇到的线性变换是旋转。旋转在保持向量间点乘关系不变的同时,将一组右手性向量基映射到另一组右手性向量基上。因此特别的,对一组右手性的正交向量基进行旋转总是会得到另一组正交向量基。在3D中,旋转总是由一个固定的旋转轴,和绕着该轴旋转的角度组成。

[2D中的旋转]
我们从描述2D中的旋转开始。以一个向量入手。

v⃗ =[b⃗ 1b⃗ 2][xy]

我们假定b⃗ t是一个2D右手性正交向量基。假设我们希望将向量v⃗ 围绕原点逆时针旋转θ角度:该向量旋转后的坐标系向量[x,y]t可以如下计算

x=xcosθysinθ
y=xsinθ+ycosθ

这个线性变换可以写作如下矩阵形式:

v⃗ =[b⃗ 1b⃗ 2][xy][b⃗ 1b⃗ 2][cosθsinθsinθcosθ][xy]

同样,我们可以旋转整个向量基

[b⃗ 1b⃗ 2][b⃗ 1b⃗ 2][cosθsinθsinθcosθ]

[3D中的旋转]
对于3D中的情况,也先假定我们使用一个右手性正交坐标系统。那么,一个向量围绕着z轴旋转θ度就可以表示为

v⃗ =[b⃗ 1b⃗ 2b⃗ 3]xyz[b⃗ 1b⃗ 2b⃗ 3]cs0sc0001xyz

其中为了简便,我们使用符号c:=cosθ以及s:=sinθ。与预期相符,这一变换保持位于第三个轴上的向量不变。在任何z值为常量的平面中,该变换与我们刚刚描述的2D旋转相同。旋转方向可以用以下的方式来视觉化:用右手握住z轴,底部朝向z=0平面;旋转的正方向即为手指弯曲的方向。

一个向量基围绕着x轴的旋转可以计算为

v⃗ =[b⃗ 1b⃗ 2b⃗ 3]xyz[b⃗ 1b⃗ 2b⃗ 3]1000cs0scxyz

同样,旋转方向也可以通过以下方式视觉化:用右手握住x轴,底部朝向x=0平面;旋转的正方向即为手指弯曲的方向(参看图2.4)。

围绕着y轴的旋转可以用以下矩阵完成

c0s010s0c

[用欧拉角在三维空间中旋转]
在某种意义上,通过这些轴向就可以完成3D中的任何旋转。首先,这些旋转的组合是另一个旋转。同时,可以看出通过指定x,y和z旋转我们可以达成任意的旋转。三个轴旋转的角度被称作xyz-欧拉角 。欧拉角可以通过一的平衡环来想象,有三个可动轴,可以通过三个参数决定要达成的旋转(图2.6)。
这里写图片描述
通过设置每个轴向的旋转量,我们可以将金色的圆盘摆放在任意想要的旋转姿态上。

[围绕任意旋转轴的旋转]
一种更直接的表示某一任意旋转的方式,是选取任意单位向量k⃗ 作为旋转轴并直接沿该轴向旋转θ角度。坐标系向量k⃗ 由单位坐标系向量[kx,ky,kz]t给出。那么,该旋转可以通过以下矩阵来表示
k2xv+ckykxv+kzskzkxvkyskxkyvkzsk2yv+ckzkyv+kxskxkzv+kyskykzvkxsk2zv+c(2.5)

其中,为了简写,我们引入了标记v:=1c。反过来看,任意旋转矩阵都可以写作这个形式。

[旋转的复杂性]
我们注意到3D旋转表现出某种复杂的形式。两个围绕着不同轴的旋转不满足交换律。此外,将沿着两个不同轴向的旋转组合时,我们得到的是一个沿着第三个轴向的旋转!

[利用四元数进行旋转插值]
在本书的随后章节,我们会引入四元数来表示旋转,用于在不同的旋转方位间产生平滑的过度动画。

2.5 Scales 缩放

[均匀缩放]
为了对几何体进行建模,我们需要对向量和向量基进行缩放。为了将任意向量以系数α缩放,我们可以使用

[b⃗ 1b⃗ 2b⃗ 3]xyz[b⃗ 1b⃗ 2b⃗ 3]α000α000αxyz

[非均匀缩放]
为了沿着三个轴向进行不同的缩放,我们可以使用更通用的形式

[b⃗ 1b⃗ 2b⃗ 3]xyz[b⃗ 1b⃗ 2b⃗ 3]α000β000γxyz.

这种类型的操作在建模中很有用,例如,当我们知道如何建立球体模型时,即可利用这种不均匀缩放建立椭圆体模型。

Exercises 练习

2.1 在我们的符号体系当中,以下哪些是合法的表达式,如果合法,它的返回值类型是什么?
b⃗ tM,cM,M1c,btNM1c

2.2 对于给定a⃗ t=b⃗ tM,向量b⃗ tNc在向量基a⃗ t下的坐标系向量是什么?

2.3 0⃗ 是零向量,对于任意线性变换LL(0⃗ )是什么?

2.4 T(v⃗ )是一个将特定非零向量k⃗ v⃗ 相加的变换:T(v⃗ )=v⃗ +k⃗ 。那么T是否为线性变换?

本章的PDF版可以去这里拿~

1 0
原创粉丝点击