游戏开发》读书笔记(一)"/>
《3D数学基础:图像与游戏开发》读书笔记(一)
《3D数学基础:图像与游戏开发》读书笔记(一)
一、向量运算
1. 点积
点积又叫内积、点乘,两个向量的点积结果是一个标,等于两个向量对应维度数值乘积之和。
⎡⎣⎢⎢⎢⎢a1a2⋮an⎤⎦⎥⎥⎥⎥⋅⎡⎣⎢⎢⎢⎢b1b2⋮bn⎤⎦⎥⎥⎥⎥=a1∗b1+a2∗b2+…+an∗bn(1)
点积结果描述了两个向量的“相似”程度,点积结果越大,两向量越想近。
点积等于两个向量的模的积再乘上两个向量夹角的 cos 值。
a⋅b=|a|∗|b|∗cosθ(2)
所以如果其中一个向量是单位向量,比如 a 是单位向量,那么
向量点积优先级高于加法和乘法。
2. 叉积
叉积又叫叉乘,两个向量叉积的结果是一个向量,叉积不满足交换律,但满足反交换律: a×b=−(b×a) 。
⎡⎣⎢a1a2a3⎤⎦⎥×⎡⎣⎢a1a2a3⎤⎦⎥=⎡⎣⎢a2∗b3−b2∗a3a3∗b1−a1∗b3a1∗b2−a2∗b1⎤⎦⎥(3)
两个向量的叉积得到的向量的模等于两个向量的模的积再乘上两个向量夹角的sin值。
|a×b|=|a|∗|b|∗sinθ(4)
叉积的运算优先级和点积一样,不过两个混合运算时优先计算叉积,因为点积运算结果是标量,标量不能叉积。运算 a⋅(b×c) 称为三重积。
叉积的的结果是一个垂直于 a 且垂直于
二、矩阵
1. 矩阵与向量
一个3维向量相当于一个1x3的矩阵,1x3的矩阵乘上3x3的矩阵等于1x3的矩阵,也就是说一个三维向量乘上一个3x3的矩阵能得到另一个三维向量,实现了向量的变换。
矩阵每一维都可以解释为转换后的基向量。
[100]⎡⎣⎢m11m21m31m12m22m32m13m23m33⎤⎦⎥=[m11m12m13](5)
向量可以代表一个方向,也可以代表一个点,所以和矩阵相乘可以实现点的变换,即可以实现三维物体的变换(旋转、缩放、镜像)。三维向量平移需要4x4的矩阵
2. 矩阵与线性变换
在数学上,如果满足下式, F(a) 就是线性的。
F(a+b)=F(a)+F(b)(6)
F(ka)=kF(a)(7)
如果 F 保持了基本的运算:加法和数量乘,那么就可以称该映射为线性的。
2.1 仿射变换
仿射变换是指线性变换后接着平移变换。因此仿射变换的集合是线性变换的超集。
v′=vM+b(8) 向量 v 乘上一个变换矩阵
M 再向 b 向量平移,这样的形式都是仿射。2.2 可逆变换
向量
v 乘上一个变换矩阵 M 会实现相应的变换,如果再乘上矩阵M 的逆 M−1 能撤销 M 的变换,那么这个变换是可逆的。所有基本变换除了投影都是可逆的。
2.3 正交变换
正交变换的基本思想是轴保持互相垂直且不进行缩放,正交变换只有平移、旋转和镜像。
正交矩阵很容易求出它的逆,正交矩阵行列式为
±1 ,所有的正交矩阵都是仿射和可逆的。3. 矩阵的行列式
用 |M| 表示矩阵 M 的行列式,非方阵矩阵的行列式是未定义的,下面给出2x2矩阵和3x3矩阵定义。
∣∣∣m11m21m12m22∣∣∣=m11m22−m12m21(9) ∣∣∣∣m11m21m31m12m22m32m13m23m33∣∣∣∣=m11m22m33+m12m23m31+m13m21m32−m13m22m31−m12m21m33−m11m23m32(10)
在2D中,行列式等于以变换后的基向量为两边的平行四边形的有符号面积。
在3D中,行列式等于以变换后的基向量为三边的平行六面体的有符号体积。如果将3x3矩阵的行为解释为3个向量,那么矩阵的行列式的等于这些向量的“三元组积”
∣∣∣∣∣axbxcxaybycyazbzcz∣∣∣∣∣=axbycz+aybzcx+azbxcy−azbycx−aybxcz−axbzcy=(aybz−azby)cx+(azbx−axbz)cy+(axby−aybx)cz=(a×b)⋅c(11)用 M{ij} 表示矩阵 M 去除第
i 行第 j 列后剩下的矩阵,称为M 的余子式M=⎡⎣⎢−401−3243−2−1⎤⎦⎥⇒M{12}=[01−2−1](12)
通过余子式可以算出矩阵的代数余子式, 代数余子式是一个标量,等于相应余子式的有符号行列式。
cij=(−1)i+j|M{ij}|(13)
代数余子式可以让我们算出nxn矩阵的行列式。首先在矩阵中选择任意一行或一列,对该行或列中的没一个元素,都乘以对应的代数余子式,这些乘积的和就是矩阵的行列式。
|M|==∑nj=1mijcij=∑nj=1mij(−1)i+j|M{ij}|(14)
行列式有下面一些重要性质:
- 矩阵乘积的行列式等于矩阵的行列式的乘积: |AB|=|A||B| ;
- 可以拓展到多个矩阵: |M1M2⋯Mn|=|M1||M2|⋯|Mn| ;
- 矩阵转置的行列式等于原矩阵的行列式: |MT|=|M| ;
- 如果矩阵某一行或某一列全为0,那么该矩阵的行列式为0;
- 如果交换矩阵的任意两行或两列,行列式的值变为原来的相反数;
- 矩阵任意行或列加到另一行或列上,矩阵行列式的值不变。
4. 矩阵的逆
矩阵的逆乘以原矩阵等于单位阵
M(M−1)=M−1M=I(15)
不是所有的矩阵都有逆。如果一个矩阵有逆矩阵,那么称它为可逆的或非奇异矩阵,反之称为不可逆或奇异矩阵。奇异矩阵的行列式为零,非奇异矩阵行列式不为零,所以可以通过求矩阵行列式值判断矩阵是否可逆。
我们把矩阵 M 的代数余子式矩阵的转置矩阵称为
M 的“标准伴随矩阵 ”,记作“ adjM ”。通过用伴随矩阵除以矩阵的行列式就能得到矩阵的逆,所以矩阵的行列式为零则被除数为零,不能算出它的逆
M−1=abjM|M|(16)
矩阵的逆有下面一些重要性质:
- 可逆矩阵的逆的逆等于原矩阵: (M−1)−1=M ;
- 单位阵的逆等于它本身: I−1=I ;
- 矩阵的转置的逆等于它的逆的转置: (MT)−1=(M−1)T ;
- 矩阵乘积的逆等于矩阵逆的相反顺序的乘积: (AB)−1=B−1A−1 ,可以拓展到多个矩阵的情况。
矩阵的逆可以用于撤销我们的(能撤销的)变换。
5. 正交矩阵
正交矩阵是一个非常特殊的矩阵,它的逆等于他的转置,即 MT=M−1 ,所以正交矩阵乘上它的转置等于单位阵。
在3D中正交矩阵出现得很频繁,那么我们要求其逆时求其转置矩阵能大大减少计算量。旋转和镜像矩阵都是正交的。
MMT=I
⎡⎣⎢m11m21m31m12m22m32m13m23m33⎤⎦⎥⎡⎣⎢m11m12m13m21m22m23m31m32m33⎤⎦⎥=⎡⎣⎢100010001⎤⎦⎥
m11m11+m12m12+m13m13=1
m11m21+m12m22+m13m23=0
m11m31+m12m32+m13m33=0
m21m11+m22m12+m23m13=0
m21m21+m22m22+m23m23=1
m21m31+m22m32+m23m33=0
m31m11+m32m12+m33m13=0
m31m21+m32m22+m33m23=0
m31m31+m32m32+m33m33=1设 r1 , r2 , r3 为 M 的行:
r1=[m11m12m13]
r2=[m21m22m23]
r3=[m31m32m33]r1⋅r1=1r2⋅r1=0r3⋅r1=0r1⋅r2=0r2⋅r2=1r3⋅r2=0r1⋅r3=0r2⋅r3=0r3⋅r3=1
根据上面的计算,可以推断:
- 一个向量当且仅当向量为单位向量时,它与自己的点积为1,所以 r1 , r2 , r3 都是单位向量;
- 当且仅当两个向量垂直时,它们的点积才为0,所以 r1 , r2 , r3 两两互相垂直。
所以正交矩阵必须满足一下条件:
- 矩阵的每一行都是单位向量;
- 矩阵的所有行都互相垂直。
6. 4x4齐次矩阵
齐次坐标是指用一个n+1维的向量表示n位的向量。
用四维向量 (x,y,z,w) 来表示三维向量 (x/w,y/w,z/w) ,也就是说 (xw,yw,zw,w) 表示 (x,y,z) ,而 (xw,yw,zw,w) 代表了无穷多个点,当 w 为0时解释为位于无穷远处的点。
6.1 平移
前面通过乘以一个矩阵以达到的变换中没有包括平移,如果想平移,要加上一个矩阵,这样如果想平移,又想旋转缩放等,就不能简单得乘以一个3x3矩阵了,为了做到把变换都变成一个矩阵,在数学上做一些小技巧,就是用齐次坐标。
如果我们用
(x,y,z,w) 表示三维坐标,其中假定w值恒为1。[xyz1]⎡⎣⎢⎢⎢m11m21m310m12m22m320m13m23m3300001⎤⎦⎥⎥⎥
=[xm11+ym21+zm31xm12+ym22+zm32xm13+ym23+zm331]上面运算结果和3D中的变换是一样的,只是最后多了一维且值是1。
[xyz1]⎡⎣⎢⎢⎢100Δx010Δy001Δz0001⎤⎦⎥⎥⎥=[x+Δxy+Δyz+Δz1]
上面很奇妙得用乘法实现了向量的平移,如果需要变换,只要把4x4的变换矩阵左上角的3x3矩阵变为以前的变换矩阵就可以了。这个是齐次坐标的数学上的一个技巧。
值得注意的是如果一个向量要经历一系列的变换,可以先把这些变换的矩阵先全部乘在一起变成一个变换矩阵,但是要注意乘的顺序,变换的顺序必须和乘法的顺序相同。当我们把 w 的值设为0时会发现,平移向量不起平移作用了(被0消掉),只能实现变换,也就说这个
w 可以看做是一个开关控制能否平移。比如一个三元组可以表示点,也可以表示一个向量,点是可以平移的,向量(代表方向)是不应该平移的,因此可以用这个 w <script id="MathJax-Element-26283" type="math/tex">w</script>来控制三元组能否平移。原本的3x3矩阵只能表示3D中的线性变换,所以没有平移,现在用4维向量来表示3维向量后能实现乘以一个矩阵来达到平移的效果,所以可以和之前的线性变换来一起表示一般的仿射变换了。会发现4x4矩阵的乘上一个平移的矩阵后只能影响第四行,而不会影响前面三排包含变换的部分。
更多推荐
《3D数学基础:图像与游戏开发》读书笔记(一)
发布评论