GAMES103课程笔记02-Math Background

这个系列是GAMES103:基于物理的计算机动画入门(GAMES 103: Intro to Physics Based Animation)的同步课程笔记。本课程是计算机动画的入门课程,着重介绍各种基于物理的动画仿真模拟技术。本节课主要复习相关的数学知识。

Vector

Definition

对物理系统的模拟离不开线性代数的相关知识,因此我们从最基础的向量(vector)开始复习。在图形学中向量一般默认是指三维向量,它表示空间点p的坐标:

p=[pxpypz]R3

在大多数的教材和论文中都会默认我们的坐标系是右手系,但需要注意的是在某些库和引擎中可能会使用左手系(如Unity、DirectX等)。

Addition and Subtraction

向量的基本运算是加法和减法,此时我们只需要将对应位置坐标相加减即可:

p±q=q±p=[px±qxpy±qypz±qz]R3

从几何的角度上看,向量的加减实际上就是平行四边形法则:

我们可以利用向量的加减法来表示点的运动。假设空间中点在0时刻的位置为p并以速度v进行运动,则t时刻p点在t时刻的位置为:

p(t)=p+tv

类似地,我们也可以利用向量加减法来表示直线。经过点p和点q的直线可以表示为:

p(t)=p+t(qp)=(1t)p+tq

0t1p(t)位于线段pq上;当t>1t<0p(t)位于线段pq外。从这个角度上看,p(t)实际上是对pq的位置进行了一个线性插值。

Vector Norm

我们可以通过范数(norm)来度量向量的大小,常用的范数包括:

  • 2-norm:p2=(px2+py2+pz2)12
  • 1-norm:p1=|px|+|py|+|pz|
  • p-norm:pp=(|px|p+|py|p+|pz|p)1p
  • infinity norm:p=max{|px|,|py|,|pz|}

通过范数我们就可以度量pq之间的距离pq。同时范数为1的向量称为单位向量(unit vector),对于任意非零的向量我们可以通过规范化(normalization)来将它转换成单位向量:

p¯=pp

Dot Product

点乘运算(dot product)或者说内积运算(inner product)将两个向量映射成标量:

pq=pxqx+pyqy+pzqz=pTq=pqcosθ

从几何上看向量之间的点乘等价于它们的模长之积乘以它们夹角的余弦:

点乘运算的常用性质如下:

  • 交换律:pq=qp
  • 结合律:p(q+r)=qp+qr
  • 模长:pp=p22
  • 对于非零向量pqpq=0pq

通过点乘运算我们可以完成很多相对复杂的任务。假设我们想要计算oqv方向上的投影,首先可以利用点乘得到oqv方向上投影的长度:

s=qocosθ=qovcosθv=(qo)vv=(qo)v¯

因此投影坐标为:

s=o+sv¯

类似地,假设平面的法向为n,我们可以利用点乘来判断p点与平面的相对位置关系:

s=(pc)n

s>0表示p点在平面上方;若s<0表示p点在平面下方;若s=0则表示p点在平面上。

最后一个例子,我们可以利用点乘来判断p点在运动过程中是否与圆盘c相交。假设t时刻p点到圆心的距离恰好为r

p(t)c2=p+tvc2=r2

整理方程可以得到关于时间t的二元一次方程:

(vv)t2+2(pc)vt+(pc)(pc)r2=0

因此我们就可以通过这个方程根的数目来判断p点是否与圆盘相交。

Cross Product

叉乘运算(cross product)也是一种常用的向量乘法,它定义为:

r=p×q=[pyqzpzqypzqxpxqzpxqypyqx]

从几何上看,r是一个垂直于pq的向量,它的模长等于两个向量模长之积乘以它们夹角的正弦:

r=pqsinθ

叉乘运算的常用性质如下:

  • 垂直性:rp=rq=0
  • 反交换性:p×q=q×p
  • 结合律:p×(q+r)=q×p+q×r
  • 对于非零向量pqp×q=0pq

叉乘运算的一个重要应用是可以计算三角形的面积和法向。对于点x0x1x2构成的三角形我们可以构造出三角形的两条边:

x10=x1x0 x20=x2x0

因此三角形的法向为:

n=x10×x20x10×x20

三角形的面积则可以表示为:

A=12x10h=12x10x20sinθ=12x10×x20

不过需要注意的是法向的朝向与三角形三个顶点的顺序有关,因此三角形顶点的顺序也称为拓扑顺序。

类似地,我们可以利用叉乘来判断共面p点是否在三角形内部:

p点在三角形内部时会将三角形分成3个部分,它们的面积分别为:

A0=12(x1p)×(x2p)n A1=12(x2p)×(x0p)n A2=12(x0p)×(x1p)n A0+A1+A2=A

我们可以使用面积A进行归一化,得到:

b0=A0A,b1=A1A,b2=A2A b0+b1+b2=1

上式中(b0,b1,b2)称为三角形的重心坐标(barycentric coordinates)p点的坐标可以通过重心坐标插值来得到:

p=b0x0+b1x1+b2x2

类似地,我们可以利用叉乘来计算四面体的相关几何量:

x10=x1x0 x20=x2x0 x30=x3x0 A=12x10×x20 h=x30n=x30x10×x20x10×x20 V=13hA=16x30x10×x20=16|x1x2x3x01111|

不过需要注意的是按上式计算的体积仍然是带符号的,当x3位于底面三角形上方时为正数,而当x3位于三角形下方时为负数。

类似于三角形的重心坐标,我们同样可以利用体积来定义四面体的重心坐标:

最后来讨论空间射线与三角形求交。我们可以利用p(t)点与三角形构成四面体的体积来计算它们的交点,当四面体体积为0时有:

(p(t)x0)x10×x20=(px0+tv)x10×x20=0

整理得到:

t=(px0)x10×x20vx10×x20

按上式求解得到的t即为p点到达三角形平面的时刻,接下来只需要检查p(t)是否在三角形内部即可。

Matrix

Definition

接下来我们对矩阵(matrix)进行复习,我们把列向量并排放到一起就得到了矩阵。

Multiplication

矩阵的乘法就不再赘述了,这里主要复习一下矩阵乘法的性质:

  • 矩阵乘法没有交换律:ABBA
  • 矩阵乘法的转置:(AB)TBTAT
  • 矩阵(向量)乘以单位阵等于自身:Ixx
  • 矩阵的逆:AA1=A1A=I(AB)1=B1A1
  • 不是所有的矩阵都存在逆阵

Orthogonality

由正交的单位向量构成的矩阵称为正交阵(orthogonal matrix)

A=[a0a1a2] aiTaj={0,ij1,i=j

容易验证正交阵的转置与自身相乘即为单位阵,或者说正交阵的逆等于自身的转置:

ATA=I A1=AT

Matrix Transformation

矩阵在图形学中的一个重要应用是用来表示物体位置和形状的变换。比如说物体的旋转就可以用一个正交阵来表示,假设初始状态物体的三个正方向与世界坐标系相同,旋转后的正方向为uvw,则旋转矩阵可以利用这三个方向来表示:

类似地,对物体进行伸缩则可以利用一个对角阵来表示,对角阵上每个元素表示在相应轴上伸缩的比例:

Singular Value Decomposition

对任意矩阵A,我们可以对它进行奇异值分解(singular value decomposition, SVD)得到对角阵和正交阵:

A=UΣVT

其中Σ是对角阵,其中的每个元素称为A的奇异值;UV则是正交阵。

我们可以把矩阵A看成是某种线性变换,那么SVD的几何意义则是任意的线性变换都可以通过旋转和缩放来进行描述:

与之类似的还有特征值分解(eigenvalue decomposition),对称矩阵A可以分解为:

A=UDU1

其中D是对角阵,其中的每个元素称为A的特征值;U则是正交阵,它的每一列称为A的特征向量。矩阵A的特征值di和对应的特征向量ui满足:

Aui=diui

需要说明的是严格来说特征值分解对于非对称的矩阵仍然成立,但此时的特征值可能是复数。

Symmetric Positive Definiteness

我们称矩阵A是一个正定对称阵(symmetric positive definiteness)当且仅当对于任意非零向量v满足:

vTAv>0

称矩阵A是一个半正定对称阵(symmetric semi-positive definiteness)当且仅当

vTAv0

正定对称矩阵的特征值都大于0,这里简单进行一下证明:

vTAv=vTUDUTv=(UTv)TD(UTv)=dixi2>0 xi=UiTv

由于v是任意的,vTAv>0要求矩阵A的每个特征值都是正数。

实际上特征值都大于0是对称正定矩阵的充要条件,即我们可以利用特征值分解来判断矩阵是否是正定矩阵。但大多数情况下对矩阵进行特征值分解会有较高的计算复杂度,因此我们需要一些简化的方法来进行判断。实践中较为常用的方式是使用对角元素来进行判断,我们称矩阵A对角占优矩阵(diagonally dominant matrix)如果它的对角元素满足:

Aii>ij|Aij|,i=1,2,...,n

当一个矩阵是对角占优矩阵时它一定是正定的。但需要注意的是存在非对角占优的正定矩阵。

正定矩阵的一个重要性质是当矩阵A是正定矩阵时,矩阵

B=[AAAA]

一定是半正定的。这里简单证明一下:

[xTyT]B[xy]=[xTyT][AAAA][xy]=(xy)TA(xy)0

Linear Solver

矩阵的一个重要应用是求解线性方程组:

Ax=b

假设矩阵A是可逆的方阵,我们可以通过矩阵求逆来求解这个线性方程组。但大多数情况下矩阵求逆具有非常高的计算复杂度,因此实际应用中多半会采取其它的方法来代替矩阵求逆,常用的方法包括直接解法和迭代解法。

直接解法是指对矩阵A进行分解来求解线性方程组,常用的矩阵分解包括LU分解、Cholesky分解等。LU分解来计算线性方程组的主要流程如下:

在实践中人们发现当矩阵A是稀疏矩阵时直接使用LU分解得到的L矩阵和U矩阵往往不再是稀疏矩阵,但是可以通过对未知变量x进行重新排序来保持矩阵的稀疏性,如在matlab的LU分解中就使用了这样的技巧。

另一种常用的方程解法是迭代解法,我们可以通过建立迭代格式来求解线性方程组:

x[k+1]=x[k]+αM1(bAx[k])

其中α为松弛变量,矩阵M为迭代矩阵,bAx[k]则是残差向量。可以证明当满足一定条件时残差向量会收敛到0

bAx[k+1]=bAx[k]αAM1(bAx[k])=(IαAM1)(bAx[k])=(IαAM1)k+1(bAx[0])

上式说明当(IαAM1)谱半径(spectral radius)小于1时,对于任意初值的变量x使用迭代法总能收敛。

除此之外,在使用迭代法求解时还需要计算逆阵M1,这就要求M的逆阵需要容易计算。一般可取M为:

  • Jacobi Method: M=diag(A)
  • Gauss-Seidel Method: M=lower(A)

和直接法相比,迭代法的优势在于比较便于实现、容易并行而且往往很快就能收敛到近似解。相对地,使用迭代法时需要注意迭代的收敛条件而且可能需要比较长的时间才能得到精确解。

Tensor Calculus

本节课最后复习了向量和矩阵的微积分。

1st-Order Derivatives

对于标量函数f(x),定义它的梯度(gradient)为:

f(x)=[fxfyfz]

梯度f(x)的几何意义是在x处使向量场增长最快的方向:

对于向量函数f(x)=[f(x)g(x)h(x)]可以定义它的Jacobian矩阵为:

J(x)=fx=[fxfyfzgxgygzhxhyhz]

其它常用的形式包括散度(divergence)旋度(curl)

f=fx+gy+hz ×f=[hygzfzhxgxfy]

2nd-Order Derivatives

对于标量函数f(x),我们定义它的二阶导数矩阵为:

H=J(f(x))=[2fx22fxy2fxz2fxy2fy22fyz2fxz2fyz2fz2]

上式称为f(x)Hessian矩阵

另一个常用的二阶微分算子是Laplacian算子,它的定义为:

f(x)=2f(x)=Δf(x)=2fx2+2fy2+2fz2

Spring System

利用这些微分算子我们可以计算出很多物理量。假设有一个一端固定的弹簧系统,弹簧的初始长度为L如下图所示:

当弹簧另一端的位置为x时,系统的能量为:

E(x)=k2(xL)2

弹簧的内力可以通过对能量E求梯度并取反方向得到:

f(x)=E(x)=k(xL)xx

系统的切向刚度(tangent stiffness)则可以通过对能量E(x)求二阶导来获得:

H(x)=f(x)x=kxxTx2+k(1Lx)(IxxTx2)

进一步我们可以考虑两端都是自由端的弹簧系统,此时弹簧的伸长量为:

x01=x0x1

系统的能量可以表示为:

E(x)=k2(x01L)2

在这种情况下弹簧系统的能量由x0x1两个位置矢量控制,对它们求梯度可以得到弹簧的内力:

f(x)=E(x)=[0E(x)1E(x)]=[fefe] fe=k(x01L)x01x01

同样地,系统的刚度为:

H(x)=[2Ex022Ex0x12Ex0x12Ex12]=[HeHeHeHe] He=kx01x01Tx012+k(1Lx01)(Ix01x01Tx012)

Reference