向量

向量最基本的定义就是一个方向,向量有一个方向(Direction)大小(Magnitude,也叫做强度或长度)

向量取反

对一个向量取反(Negate)会将其方向逆转。

向量加减

向量的加法可以被定义为是分量(Component-wise)的相加,即将一个向量中的每一个分量加上另一个向量的对应分量:

向量的减法等于加上第二个向量的相反向量:

长度

使用勾股定理(Pythagoras Theorem)来获取向量的长度。

单位向量

有一个特殊类型的向量叫做单位向量(Unit Vector),单位向量有一个特别的性质——它的长度是1。我们把这种方法叫做一个向量的标准化(Normalizing)

点乘

点乘(Dot Product),两个向量的点乘等于它们的数乘结果乘以两个向量之间夹角的余弦值。

两个向量看做是单位向量,长度是1,公式就简化成:

使用点乘可以很容易测试两个向量是否正交(Orthogonal)平行(正交意味着两个向量互为直角)。

通过点乘的结果计算两个非单位向量的夹角,点乘的结果除以两个向量的长度之积,得到的结果就是夹角的余弦值,即cosθ。

叉乘

叉乘(Cross Product)又称向量积(Vector Product)。

其运算结果是一个向量,并且与这两个向量都垂直,是这两个向量所在平面的法线向量。使用右手定则确定其方向。

矩阵

简单来说矩阵就是一个矩形的数字符号表达式数组。矩阵中每一项叫做矩阵的元素(Element)

矩阵的加减

注意,数学上是没有矩阵与标量相加减的运算的,但是很多线性代数的库都对它有支持。

矩阵的数乘

和矩阵与标量的加减一样,矩阵与标量之间的乘法也是矩阵的每一个元素分别乘以该标量。

矩阵相乘

矩阵相乘的限制:

  1. 只有当左侧矩阵的列数与右侧矩阵的行数相等,两个矩阵才能相乘。
  2. 矩阵相乘不遵守交换律(Commutative),也就是说A⋅B≠B⋅AA⋅B≠B⋅A。

单位矩阵

在OpenGL中,由于某些原因我们通常使用4×4的变换矩阵,而其中最重要的原因就是大部分的向量都是4分量的。最简单的变换矩阵就是单位矩阵(Identity Matrix),单位矩阵是一个除了对角线以外都是0的N×N矩阵。

缩放

对一个向量进行缩放(Scaling)就是对向量的长度进行缩放,而保持它的方向不变

位移

位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程,从而在位移向量基础上移动了原始向量。

齐次坐标(Homogeneous Coordinates)

向量的w分量也叫齐次坐标。想要从齐次向量得到3D向量,可以把x、y和z坐标分别除以w坐标。通常不会注意这个问题,因为w分量通常是1.0。

使用齐次坐标有几点好处:它允许我们在3D向量上进行位移(如果没有w分量我们是不能位移向量的)。

如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能位移。

旋转

2D或3D空间中的旋转用角(Angle)来表示。角可以是角度制弧度制的,周角是360角度或2PI弧度。

  • 弧度转角度:角度 = 弧度 * (180.0f / PI)
  • 角度转弧度:弧度 = 角度 * (PI / 180.0f)

在3D空间中旋转需要定义一个和一个旋转轴(Rotation Axis)。物体会沿着给定的旋转轴旋转特定角度。

沿x轴旋转:

沿y轴旋转:

沿z轴旋转:

利用旋转矩阵我们可以把任意位置向量沿一个单位旋转轴进行旋转。也可以将多个矩阵复合,比如先沿着x轴旋转再沿着y轴旋转。但是这会导致一个问题——万向节死锁(Gimbal Lock),避免万向节死锁的真正解决方案是使用四元数(Quaternion),它不仅更安全,而且计算会更有效率。

矩阵组合

矩阵乘法是不遵守交换律的,顺序很重要。当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的,所以应该从右向左读这个乘法。建议在组合矩阵时,先进行缩放操作,然后是旋转,最后才是位移,否则它们会互相影响。

最后更新于 2022-07-18