第一章
本章用了生动的语言和形象的例子由浅入深(此处省略)
重点:笛卡尔坐标系
–>一维坐标定向(数轴)
–>二维坐标定向(8种但是本质一样)
–>三维坐标定向:左手坐标系(Direct Unity UE)和右手坐标系(OpenGL) 当然事实上不绝对
第二章
矢量运算,大部分都是基础,这里强调一下点积和叉积的一些要点。
点积:几何意义->投影
叉积:几何意义->平行四边形面积 哪个坐标系用哪个手
混合积:高数学了书里没有,还是写一下2333
第三章
这章开始结合了一些实际情况,首先,我们需要了解几个坐标空间
- 世界空间:(Unity里的WorldTransform)
- 对象空间:(Unity里的LocalTransform)
- 相机空间:(注意区分左右手!):相机于原点,+z指向前方,+y指向上方,+x指向(左手右侧,右手左侧,注意用哪个手四指x转到y大拇指指向z,所以不奇怪)
- 直立空间:本书造出来的,物体作为原点,世界空间平移的产物,本质上是世界空间转换到对象空间的中间产物。
- 裁剪空间:整理的时候放过来实际上没说,第十章的内容
基矢量部分线代学的还行的可以跳,就是正交,秩的内容稍作变换甚至没有变换。当然因为是整理,所以写一个重要的数学公式
Gram-Schmidt正交化:虽然柯西他们更早发现,挠头,李群变换中还有推论,这里不再赘述。
第四章
这一章说的是矩阵,确实没啥可说的,相信大家的线代教材都比这书写的好,挠头。稍微写几个重点吧。
- 矩阵乘法
- 转置和行列式的一些规律,具体找本线代书吧,这书这部分有点拉。
- 这书没有,但是必须提一下:左乘行变换,右乘列变换
第五章
这一章说的是矩阵的实践意义,如果是第一二章是为第三章铺垫,那么第四章就是为第五章铺垫。这一章开始说变换了。有意思一些。
!!!!注意,本书喜欢用行向量。。。事实上大多数数学用的列向量,当然如果你理解了都一样,但是这个问题吧,就像大括号要不要换行一样,狗头。我其实更喜欢列向量,所以用的列向量,当然就是转置一下的事,不过我相信由于国内教育的问题,理工科大学生都会更喜欢列向量的表示。事实上DirectX是行向量,OpenGL是列向量(你俩非要不一样,主打一手差异化是吧)101是列向量,很多圣经也是列向量,本书是行向量。本文是列向量(因为和书上有出入)。更重要的是本文大括号换行!!!!
旋转
首先我们定义变换矩阵, R ( θ ) R(θ) R(θ),我们记逆时针旋转为正。现在我们旋转θ,记原本的坐标为 v = ( x , y ) ′ v=(x,y)^{'} v=(x,y)′,新的坐标为 v = ( x ′ , y ′ ) v=(x^{'},y^{'}) v=(x′,y′),则 v ′ = R ( θ ) ∗ v v^{'}=R(θ)*v v′=R(θ)∗v。一样,我们先从二维开始,默认大家数学基础过关,显然易得,答案见图。
然后是三维,首先,我们要明白一个事情,准确描述一个旋转需要什么。毕竟不用证明,稍加想象,我们可以得出结论——除了角度,我们还需要的是轴。二维的旋转呢,我们没有指明轴啊,只会指明一个点(坐标原点或者任意点)可能会有人奇怪,但是相信不久就能自己反应过来,二维的时候我们实际上是以二维空间指定点处的在三维空间中的二维空间的法向量旋转的(原点时为Z轴)。
那么本着由易到难的原则,我们先考虑坐标轴本身:此时显然问题可以退化为二维问题,答案易得见图。
然后我们来看看任意轴的情况,这里推荐大家自行推演一遍。图片挡下文大法
这里我们用了线代推导中常用的一种思路,向量分解。我们注意到分解以后,其实投影到旋转轴上的这一部分向量,旋转并不会改变它,而剩下的这部分向量旋转被转化成了二维上的旋转,二维旋转君本当上手!图中有推导,具体过程可以手推或者看书(书也没多详细,当然也不是多难的过程)
对于投影部分和垂直部分,我们可以表示出其中一个,另一个用做差表示,而由于点积的几何意义投影部分显然更好表示。投影部分不需要处理,垂直部分需要乘一个旋转矩阵。此时我们可以任意选择二维平面的XY轴。当然我们倾向于让计算更为简单,因而我们可以选择将垂直部分作为一个轴,此时投影部分也是一个轴,剩下的轴可以用叉乘得到,即图中的
w
w
w。
缩放
和旋转一样,我们首先还是要搞明白如何才能准确描述一个缩放,答案和旋转类似,一个方向和一个比例。
然后还是本着从易到难的原则,先从轴向开始。这里较为简单,不管二维还是三维,轴向缩放就是简单的对角矩阵,书上把几个轴同时缩放组合在一起了,我觉得这在逻辑上不太合适。因为一次缩放应该是一个方向的,后面任意方向也是一个方向,三个轴同时缩放其实是三个轴的单次缩放的矩阵乘积。
结果了轴向,我们再来研究任意方向的缩放:还是从二维到三维。还是推荐大家先自行推导。图片挡下文大法
思路还是对缩放方向投影进行分解。大体思路如图:
然后由于把v和n均为向量,移动到原点后可以确定一个平面,所以三维和二维是相同的,类似可得,不再赘述。
正交投影
投影是一种降维操作,我们可以想象一下投影到
Z
=
0
Z=0
Z=0平面的过程,此时实际上相当于我们丢掉了所有点的Z坐标值。
还是老样子从易到难,先从轴向考虑,我们考虑简单的投影到
X
=
0
X=0
X=0,
Y
=
0
Y=0
Y=0,
Z
=
0
Z=0
Z=0平面的情况,正如上文所提到的我们丢掉了所有点的某个坐标,为了形式的统一,我们可以得到一个矩阵。用原本三维坐标系中的坐标表示二维平面的点。但是当我们拓展到
X
=
a
X=a
X=a,
Y
=
b
Y=b
Y=b,
Z
=
c
Z=c
Z=c平面时,会发现我们没法做到这点,所以我们只讨论正交投影(即经过原点),因为投影到
X
=
a
X=a
X=a,
Y
=
b
Y=b
Y=b,
Z
=
c
Z=c
Z=c平面实际上是正交投影加平移。而这个问题会被后面我们提到的齐次坐标解决。哈密顿不仅为自己在历史留下了名字,还为英国永久贡献了一个景点,笑。
那么任意经过线和平面的正交投影呢?书中没有推导,我这里简单推导一下本质上其实是去掉这个平面法向量方向的坐标,见图。
反射
二维对于某一条线,三维对于某一个平面的翻转可以等价于其法向量方向的-1比例的缩放
错切
达成一种倾斜效果,方法是将某一坐标分量的k倍加到另一个坐标分量上,很少用,也没有啥推导,直接给出矩阵。
H
x
(
s
)
=
[
1
0
s
1
]
(二维)
H_x(s)= \left[ \begin {matrix} 1 & 0 \\ s & 1 \\ \end{matrix} \right] \tag{二维}
Hx(s)=[1s01](二维)
H x y ( s , t ) = [ 1 0 0 0 1 0 s t 1 ] (三维) H_{xy}(s,t)= \left[ \begin {matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ s & t & 1 \end{matrix} \right] \tag{三维} Hxy(s,t)= 10s01t001 (三维)
组合变换
大家都学过线代,明人不说暗话,上面几个变换都能用矩阵变换,自然也能通过几个变换矩阵乘积后形成的新矩阵,实现组合变换。
刚体变换
改变位置方向但是不改变形状和大小的变换,行列式为1,刚体变换正交,可逆,保持角度,仿射。
变换分类和性质
1:矩阵变换:矩阵表示的变换
2:线性变换:满足
F
(
a
+
b
)
=
F
(
a
)
+
F
(
b
)
F(a+b)=F(a)+F(b)
F(a+b)=F(a)+F(b)且
F
(
k
a
)
=
k
F
(
a
)
F(ka)=kF(a)
F(ka)=kF(a)的变换
3:仿射变换:
v
′
=
v
M
+
b
v^{'}=vM+b
v′=vM+b的变换
4:可逆变换:有逆变换(可以还原)
5:保持角度的变换:变换后,向量间夹角不变的
1属于2,2属于3,并非所有4都是3,但是本书不讨论那些,而3本质上是平移+2,2是否可逆却决于矩阵是否可逆,即矩阵秩
第六章
矩阵数学
一样,本着大家都会线代的前提,略过一些基础,这里仅列一下重点
行列式几何意义:基矢量构成的平行四边形/平行六面体的有向面积
正交化的意义:由于外部数据源获取了不良数据或者累计浮点误差(矩阵蠕动)–>正交化(凹凸映射常)
Gram-Schmidit正交化各个轴有偏差---->无偏差的递增正交化
“齐次坐标”
本书在本章进行了科普,相应的数学推导在后面。。。说实话对我来说挺难受的,但是还是按它的思路走吧。
在第五章,我们指出了三维空间下的平移变换没法用三维的矩阵变换实现平移,为此,我们引入了齐次坐标,也就是讲三维拓展到了四维,本来三维空间其实就是四维空间里
w
=
1
w=1
w=1的超平面。
映射为
(
x
,
y
,
z
,
w
)
=
>
(
x
/
w
,
y
/
w
,
z
/
w
)
(x,y,z,w)=>(x/w,y/w,z/w)
(x,y,z,w)=>(x/w,y/w,z/w),通常也有
(
x
,
y
,
z
)
=
>
(
x
,
y
,
z
,
1
)
(x,y,z)=>(x,y,z,1)
(x,y,z)=>(x,y,z,1)
数学好的同学看到这个映射就会产生一些疑问,比如w=0,此时矢量的长度失去了意义,仅仅用来表示方向。本书不太讨论这种问题,毕竟也不是严格的数学书。
那么显然,我们可以兼容以前用三维矩阵能表示的变换,那么平移呢?这也是我们的初心。
H
(
a
,
b
,
c
)
=
[
1
0
0
a
0
1
0
b
0
0
1
c
0
0
0
1
]
(平移)
H(a,b,c)= \left[ \begin {matrix} 1 & 0 & 0&a \\ 0 & 1 & 0 &b\\ 0 &0 & 1&c\\ 0 &0 & 0&1 \end{matrix} \right] \tag{平移}
H(a,b,c)=
100001000010abc1
(平移)
稍加观察,我们可以发现,齐次坐标表示的三维空间的平移其实是四维空间的错切。
本章w被限制为1,其实不太具有讨论价值,就是个引入。
透视投影
还是从简单的例子开始:对于空间中的一个点
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)假设现在将它投影到
z
=
d
z=d
z=d上,显然由相似可得,为
(
d
x
/
z
,
d
y
/
z
,
d
)
(dx/z,dy/z,d)
(dx/z,dy/z,d),由于涉及到了乘除法,我们没法用矩阵变换表示,事实上,这里即使是四维也不行。
不过这里我们可以发现,xy的相对比例是不变的,只是乘了一个公因数
d
/
z
d/z
d/z,因而我们可以考虑存储这个值,多次变换也只需要做一次透视除法。得到了这个齐次坐标
(
x
,
y
,
z
,
z
/
d
)
(x,y,z,z/d)
(x,y,z,z/d)
透视投影的时候,投影点在原点会方便很多,这也是相机空间的优势之一。本章给出的这个矩阵
H = [ 1 0 0 0 0 1 0 0 0 0 1 1 / d 0 0 0 0 ] (透视投影) H= \left[ \begin {matrix} 1 & 0 & 0&0 \\ 0 & 1 & 0 &0\\ 0 &0 & 1&1/d\\ 0 &0 & 0&0 \end{matrix} \right] \tag{透视投影} H= 100001000010001/d0 (透视投影)
第七章
二维:极坐标
三维:球坐标,柱坐标
高数都学过,就是两个注意点:奇点和定义域