图形学有个前置课程,就是线性代数。但是这门课的重点不是线性代数,我们以最快,最猛烈的的节奏将线性代数的重点迅速过一遍。线性代数并不难,这里假设你是个高中生哦,至少得懂数学方程吧。

本课程的学习课件来自闫令琪教授的 《GAMES101: 现代计算机图形学入门》

课件下载链接:向量与线性代数 [课件] 或 Google Drive

那为什么我们需要学线性代数呢?

因为三维空间中的一个点(x,y,z),这实际上就是个向量表示。涉及到各种变换,例如,一个几何图形的平移,旋转,缩放,都可以表示成一个矩阵跟一个向量的乘法。

首先,Vector,数学上叫向量,物理上叫矢量。他表示的是一个方向。

5NzRZK8iQWvm2Pd

向量表示两个属性:

  1. 方向
  2. 长度

向量无论怎么移动,其向量本身不变。

![image-20211111122312193](/Users/admin/Library/Application Support/typora-user-images/image-20211111122312193.png)

图形学里,我们用单位向量来表示向量的方向。

向量的加法

两个向量可以相加。在几何学里的理解,一般采用平行四边形法则和三角形法则。

mOjSqriu7QaVKI1

在代数学里,向量可以用笛卡尔坐标系来描述。下图是笛卡尔直角坐标系。x是横坐标,沿着x方向走;y是纵坐标,沿着垂直向上的y的方向走。

ANJ7KybMoYBfWTc

那么向量x 和 向量y 的和就可以表示成上图 的A。那么向量A的长度就是||A||。从上边的坐标系就可以看出来,代数的垂直坐标系可以非常方便的计算出向量的长度。


向量的乘法

向量有两个主要的乘法

  1. Dot Product (点乘)
  2. Cross Product (叉乘)

Dot(scalar) Product

q26Be9IFHgJ8bs1

从上边的公式可以看出,两个向量的点乘是一个数。看右边的公式,当两个向量是单位向量的时候,两个向量的点乘就是两个向量的夹角的余弦。

那么向量的点乘到底怎么算呢?从代数上,点乘既然是一种运算,和其他运算法则一样都会满足三个性质:

  1. 交换律
  2. 分配律
  3. 结合律

MB4nHDXfdctzyal

那么换成向量,在笛卡尔坐标系里,两个向量的点乘可以表示如下:

vU78xSYiKyR9qbk

思考:在图形学里,两个向量的点乘有什么用呢?这里先思考一分钟再往下读。

答案:点乘在图形学里有两个重要的作用。

  1. 用来寻找两个向量的夹角。

  2. 用来寻找一个向量投影到另一个向量长什么样子。什么叫一个向量在另外一个向量的投影呢?看下边的一个例子:

XhLtZY9TpF6NruC))

在上图中,a和b两个向量的方向是不一样的。现在,我们想把b向量投影在a向量上。假设有一束光垂直照在向量a上,那么b自然会投射一个阴影在a上。那么既然b向量投影在a向量上,那么b的投影一定沿着a向量。那么为了计算投影的长度,就可以依照直角三角形关系,投影的长度就是b向量的长度 乘 a和b的夹角余弦。

Cross Product

叉乘是计算出垂直于两个输入向量的第三个向量。可以参考下边的示意图:

z1XvDy

上图黄色的向量就是向量a和b的叉乘。但是叉乘的结果既然是个向量,不光有长度,也会有方向。那么叉乘的结果怎么决定呢,这里要介绍“右手螺旋定则”:

两向量叉乘如a叉乘b,则结果向量的方向用右手螺旋定则判定。

右手螺旋定则:先将两向量移动到同一起点,右手四指从a转到b,则拇指所指方向,即为结果向量的方向。

a叉乘b所得向量方向一定是垂直于a,b所在平面的。

叉乘方向右手螺旋定则怎么判断方向

a×b的方向:四指由a开始,指向b,拇指的指向就是a×b的方向,垂直于a和b所在的平面

b×a的方向:四指由b开始,指向a,拇指的指向就是b×a的方向,垂直于b和a所在的平面

a×b的方向与b×a的方向是相反的,且有:a×b=-b×a

这告诉我们,叉乘并不满足乘法交换律。

思考:叉乘在图形学的里作用又是什么呢?

答案:我们可以用来建立一个三维空间的直角坐标系。在三维空间中,给出一个x轴和y轴,我们可以得到z轴。

dXNjqF

这里有个通用解释:如果看到

图片 CryyTp

那么我们就说这是个右手坐标系。如果是-z,那就是左手坐标系。在我们这门课里,我们考虑的都是右手坐标系,但是在OpenGL里,它假设的是-z,也就是左手坐标系

那么,上边的公式里,如果一个向量 叉乘 它自己,为什么是0?

JyoD1V

我们可以通过公式推导:

77JKXV

两个向量的叉乘=两个向量的长度 X 他们的夹角的正弦值。

iqvToj

这里帮助大家复习一下三角函数:

正弦值是在直角三角形中,對邊的長比上斜邊的長的值。任意銳角的正弦值等于它的餘角的餘弦值,任意銳角的餘弦值等于它的餘角的正弦值。所以,

YN2GFU

另外,向量的叉乘在代数上的笛卡尔坐标系的也可以表达出来:

YUtfu2

一个向量可以用矩阵表示出来,然后叉乘另外一个矩阵。向量的矩阵形式叉乘,我们会在下一节课展开讲细节。

思考:向量的叉乘在图形学里有什么作用?

答案:

  1. 判定左或右
  2. 判定内或外

1kxqR2

怎么判断左右呢?参考上图,如果向量a叉乘向量b 得出来的z是正的,那么按照右手定则,就说明,b在a的左侧;否则,就在右侧。

怎么判断内或外呢?

q8Tko0

如图上,一个三角型按照三个向量逆时针排布。接下来我们按照右手定则,旋转AB和AP,那么可以判断p在AB的左侧;同样判断BC和AP,发现p在BC的左侧;同理判断CA和AP,发现p在AC的左侧。也就是说,p点在三角形的三边左侧,那么p就在三角形内。

对于任何一个三角型,如果一个点,一直都在一个三角形的三边的左边,或者三边的右边,那么则可以判断这个点在三角形的内部。

那么,线性代数的基础就复习完了,下一节课,我们重点来讲矩阵。