DirectX11龙书学习笔记(1)——向量

龙书11是一本3D游戏入门级教程,推荐看完这本书之后去看另一本叫做《Real Time Rendering》的书。

本文仅供个人记录和复习,不用于其他用途

什么是向量

计算机专业的学生应该都在大学里学过线性代数,没学过的话高中数学也有向量相关的知识。简单来说,向量就是一种同时具有大小和方向的物理量。向量可以用来表示力、位移和速度,而有时也可以用来表示一个单个方向,比如玩家在 3D 游戏中的观察方向、光线的传播方向等。

由于向量只由其方向和长度所决定,所以当且仅当两个向量具有相同的长度和方向是,我们说这两个向量相等。改变向量位置并不影响两个向量的等价,你可以通过平移让两个等价的向量重叠。

再打个比方,现在有两只蚂蚁,它们分别按照向量 a 和向量 b 进行移动,且向量 a 等于向量 b。假设向量 a 指向北方,长度为1米,那么我们可以认为两只蚂蚁都向北方移动了1米的距离。正如上面所说,尽管两只蚂蚁的位置不同,但向量并不受位置关系的影响。

向量和坐标系

学习向量是为了解决各种向量值的问题,但我们无法在计算机中以几何的方式表示向量。借用高中数学的思想,我们在空间中引入了 3D 坐标系的概念,并将所有的向量尾部平移到坐标系原点,然后通过指向向量首部的坐标来表示一个向量,记作 v=(x,y,z)。如果你只需要处理 2D 坐标系,那么向量就只有两个坐标:v=(x,y),在计算机中可以用2个浮点数来表示一个向量。

向量的值为多少,取决于它处在什么样的参照系中。但不管如何改变,向量的长度和方向是不会改变的,当以不同参照系描述时,同一个向量 v 会有不同的坐标。这就好比摄氏度与华氏度,两者的标准不同,但水的沸点并不会因为标准的改变而改变。

左手系和右手系

所谓左手坐标系,就是把左手手指指向 x 轴正方向,然后朝 y 轴正方向弯曲四指,大拇指就会指向 z 轴正方向。右手坐标系也同理,可以自己尝试一下。

基本向量运算

向量的运算主要包含判等、加法、标量乘法、减法。设 u=(x1,y1,z1) 和 v=(x2,y2,z2)。

  • 若 x1=x2、y1=y2、z1=z2,则 u=v
  • u+v=(x1+x2,y1+y2,z1+z2)。
  • 设 k 为标量,则 ku=(kx1,ky1,kz1)。
  • u-v=u+(-v)=(x1-x2,y1-y2,z1-z2)。

向量的实际应用

假设有两种不同的力作用在某个球体上,为了得出这个球体所受力的总和,就必须要把这两个力进行合并。做法很简单,将向量 a 平移,让它的尾部处在向量 b 的首部。那么净作用力 c 就是从向量 b 的尾部指向向量 a 的首部,刚好构成了一个三角形。

这个时候多少应该记起来了吧?显然,c=a+b