图形学入门第二课:向量与线性代数
图形学有个前置课程,就是线性代数。但是这门课的重点不是线性代数,我们以最快,最猛烈的的节奏将线性代数的重点迅速过一遍。线性代数并不难,这里假设你是个高中生哦,至少得懂数学方程吧。
本课程的学习课件来自闫令琪教授的 《GAMES101: 现代计算机图形学入门》
课件下载链接:向量与线性代数 [课件] 或 Google Drive
那为什么我们需要学线性代数呢?
因为三维空间中的一个点(x,y,z),这实际上就是个向量表示。涉及到各种变换,例如,一个几何图形的平移,旋转,缩放,都可以表示成一个矩阵跟一个向量的乘法。
首先,Vector,数学上叫向量,物理上叫矢量。他表示的是一个方向。
向量表示两个属性:
- 方向
- 长度
向量无论怎么移动,其向量本身不变。
![image-20211111122312193](/Users/admin/Library/Application Support/typora-user-images/image-20211111122312193.png)
图形学里,我们用单位向量来表示向量的方向。
向量的加法
两个向量可以相加。在几何学里的理解,一般采用平行四边形法则和三角形法则。
在代数学里,向量可以用笛卡尔坐标系来描述。下图是笛卡尔直角坐标系。x是横坐标,沿着x方向走;y是纵坐标,沿着垂直向上的y的方向走。
那么向量x 和 向量y 的和就可以表示成上图 的A。那么向量A的长度就是||A||。从上边的坐标系就可以看出来,代数的垂直坐标系可以非常方便的计算出向量的长度。
向量的乘法
向量有两个主要的乘法
- Dot Product (点乘)
- Cross Product (叉乘)
Dot(scalar) Product
从上边的公式可以看出,两个向量的点乘是一个数。看右边的公式,当两个向量是单位向量的时候,两个向量的点乘就是两个向量的夹角的余弦。
那么向量的点乘到底怎么算呢?从代数上,点乘既然是一种运算,和其他运算法则一样都会满足三个性质:
- 交换律
- 分配律
- 结合律
那么换成向量,在笛卡尔坐标系里,两个向量的点乘可以表示如下:
思考:在图形学里,两个向量的点乘有什么用呢?这里先思考一分钟再往下读。
答案:点乘在图形学里有两个重要的作用。
用来寻找两个向量的夹角。
用来寻找一个向量投影到另一个向量长什么样子。什么叫一个向量在另外一个向量的投影呢?看下边的一个例子:
))
在上图中,a和b两个向量的方向是不一样的。现在,我们想把b向量投影在a向量上。假设有一束光垂直照在向量a上,那么b自然会投射一个阴影在a上。那么既然b向量投影在a向量上,那么b的投影一定沿着a向量。那么为了计算投影的长度,就可以依照直角三角形关系,投影的长度就是b向量的长度 乘 a和b的夹角余弦。
Cross Product
叉乘是计算出垂直于两个输入向量的第三个向量。可以参考下边的示意图:
上图黄色的向量就是向量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轴。
这里有个通用解释:如果看到
那么我们就说这是个右手坐标系。如果是-z,那就是左手坐标系。在我们这门课里,我们考虑的都是右手坐标系,但是在OpenGL里,它假设的是-z,也就是左手坐标系。
那么,上边的公式里,如果一个向量 叉乘 它自己,为什么是0?
我们可以通过公式推导:
两个向量的叉乘=两个向量的长度 X 他们的夹角的正弦值。
这里帮助大家复习一下三角函数:
正弦值是在直角三角形中,對邊的長比上斜邊的長的值。任意銳角的正弦值等于它的餘角的餘弦值,任意銳角的餘弦值等于它的餘角的正弦值。所以,
另外,向量的叉乘在代数上的笛卡尔坐标系的也可以表达出来:
一个向量可以用矩阵表示出来,然后叉乘另外一个矩阵。向量的矩阵形式叉乘,我们会在下一节课展开讲细节。
思考:向量的叉乘在图形学里有什么作用?
答案:
- 判定左或右
- 判定内或外
怎么判断左右呢?参考上图,如果向量a叉乘向量b 得出来的z是正的,那么按照右手定则,就说明,b在a的左侧;否则,就在右侧。
怎么判断内或外呢?
如图上,一个三角型按照三个向量逆时针排布。接下来我们按照右手定则,旋转AB和AP,那么可以判断p在AB的左侧;同样判断BC和AP,发现p在BC的左侧;同理判断CA和AP,发现p在AC的左侧。也就是说,p点在三角形的三边左侧,那么p就在三角形内。
对于任何一个三角型,如果一个点,一直都在一个三角形的三边的左边,或者三边的右边,那么则可以判断这个点在三角形的内部。
那么,线性代数的基础就复习完了,下一节课,我们重点来讲矩阵。