3d数学之向量详解

向量的定义:

既有大小又有方向的量称之为向量,与之相对应的是标量,标量是只有大小没有方向的量。

一个向量的一般在头上添加一个箭头表示,比如向量V,可以表示为V\vec{V}

游戏中一般以二维向量跟三维向量居多,例如一个由A点指向B点的向量,可以表示为AB\vec{AB},由于向量是有方向的,因此向量AB\vec{AB}与向量BA\vec{BA}并不等价

二维向量的表示为V=(Vx,Vy)V=(V_x, V_y),如A = (2, 3), B=(-1, -4)
三维向量可以表示为V=(Vx,Vy,Vz)V=(V_x, V_y,V_z),如A = (2, 3, 4), B = (-1, -4, 6)

需要特别注意的是两个特殊的向量:零向量跟单位向量
长度为0的向量称之为零向量,零向量与所有向量平行
模为1的向量称之为单位向量,单位向量并不是唯一的,每个向量单位化以后都是单位向量

向量的几何意义

我们都知道,位置是相对的。因此坐标轴就很重要,在游戏中,向量结合坐标轴来确定位置。

就以Unity来说,如果假设Unity的坐标轴的原点表示为O(0,0),那么一个物体的坐标点为A(3,3),实际上可以看作一条从原点O指向点A的向量,可以表示为AO(3,3)\vec{AO}(3, 3)

向量的计算

1. 向量的数乘

向量的数乘表示向量跟一个实数相乘的乘积,结果还是一个向量。 比如实数a跟一个向量V=(Vx,Vy)V=(V_x, V_y)相乘,结果为aV=(aVx,aVy)aV=(aV_x, aV_y)

  • 数乘的几何意义
    我们都知道,向量是有方向跟大小的,而数乘就最直观的表现就是更改向量的方向跟模的大小。
    当 a > 0时,向量V的方向不变,模变为原来的a倍
    当 a = 0时,向量变为零向量,模等于0
    当 a < 0时,向量方向变为原来相反的方向,模变为原来的|a|倍

在Unity的坐标轴中,如果一个物体的位置为A(3, 3,3),如果我们将其位置乘以2再赋值给这个物体,那么A的位置就会变成A’(6,6,6)。也就是说,我们将这个物体的位置从A点移动到了A’点。

2. 向量的加减法

- 向量的加法

两个向量相加以后的结果还是一个向量,新向量的各个分量的值等于两个向量的对应分量的加值。计算公式为A+B=(A1+B1,A2+B2...,An+Bn)A + B = (A_1 + B_1, A_2 + B_2 ... , A_n + B_n)
例如两个二维向量相加,向量CC等于向量A(3,4)A(3, 4)加向量B(5,6)B(5, 6),即:$C = $ A+B=(3+5,4+6)A + B = (3+5, 4+6)

- 加法的几何意义

向量的加法,可以用平行四边形法则或者三角形法则描述:

1. 平行四边形法则:

两个向量相加,可以考虑为两个同起点的向量分别作为边长,绘制出来的一个平行四边形,这个平行四边形的以旧向量同起点的对角线就是两个向量之和所得的一条新向量

2. 三角形法则:

两个向量相加,可以考虑为这两条向量首尾相连后,分别作为三角形的两条边长,然后以第一条的起始位置,第二条的尾巴位置进行补全的一条向量,就是这两条向量的加值向量。如下图:

3d数学之向量详解

- 向量的减法

两个向量相减所得还是一个向量,这个向量的各个分量的值为旧向量的各个分量的差值。公式为:AB=(A1+B1,A2+B2...,An+Bn)A - B = (A_1 + B_1, A_2 + B_2 ... , A_n + B_n)
例如两个二维向量相加,向量CC等于向量A(3,4)A(3, 4)加向量B(5,6)B(5, 6),即:$C = $ AB=(35,46)A - B = (3-5, 4-6)

向量的减法同样支持三角形法则,与加法所不同的是,减法的所得的最终向量,其方向是由减数向量的终点指向被减数向量的终点。

3d数学之向量详解

- 向量的模

向量的模就是向量的长度(大小),是一个标量,用V|V|表示。如果一个向量VV,则存在V=V12+V22...+Vn2|V| = \sqrt[]{V_1^2 + V_2^2...+V_n^2},即,向量的模等于向量的各个分量的平方之和的开平方

  • 零向量的模为零,单位向量的模为1

  • 向量的单位化:任意非零的向量,可以通过将每个分量数乘以 1V\frac{1}{|V|},得到的新向量就是这个向量的单位化向量
    公式为:V^=(V1V,V2V,...VnV)\hat{V} = (\frac{V_1}{|V|}, \frac{V_2}{|V|}, ... \frac{V_n}{|V|})

  • 模的性质
    V0|V| \geq 0 零向量等于0,其他向量的模都大于0
    aV=aV|aV| = |a||V| 一个实数乘以一个向量以后的模,等于一个实数乘以一个向量的模
    A+BA+B|A + B| \leq |A| + |B| 向量的加法支持三角形法则,也就是说,三角形的两条边长之和大于第三边

- 向量的点积

向量的点积表示为$A \cdot B = A_1B_1 + A_1B_1 + … + A_nB_n $

  • 几何公式:$A \cdot B = |A||B|\cos \alpha $ 其中α\alpha为两个向量之间的夹角

  • 几何意义:点积表示了两个向量的接近程度,即夹角越小,两个向量越靠近,在等于0的时候平行,等于1的时候垂直。因此向量的点积在游戏中经常用来判断两个向量的接近程度。比如两个移动的物体是否会撞上,需要不需要避开之类的AI计算。同时,已知两个向量,可以计算两个向量的夹角。从而进行旋转操作等
    $A \cdot B > 0 $ 则夹角在[0, 90)
    $A \cdot B = 0 $ 则夹角等于 90,两个向量垂直
    $A \cdot B < 0 $ 则夹角在(90,180)

  • 性质:
    $A \cdot B = B \cdot A $ 点乘支持交换律
    A(B+C)=AB+ACA\cdot (B + C) = A \cdot B + A \cdot C 点乘支持加法的分配律
    (aA)B=a(AB)(aA)\cdot B = a(A\cdot B) 一个实数不影响两个向量的点乘

- 向量的叉乘

三维向量的叉乘表示为A×B=(aybzazby,azbxaxbz,axbyaybx)A \times B =(a_y ∗b_z −a_z∗b_y, a_z∗b_x−a_x∗b_z, a_x∗b_y−a_y∗b_x)
至于谁乘以谁减去谁,则是使用以下这个方法。
A×B=xyzaxayazbxbybzA \times B = \begin{vmatrix} {x}&amp;{y}&amp;{{z}}\\ a_{x}&amp;a_{y}&amp;{a_{z}}\\ b_{x}&amp;b_{y}&amp;{b_{z}}\\ \end{vmatrix}

几何意义:
两个叉乘所得出的新向量,垂直与这两个向量,并穿过这两个向量的交叉点。新向量的方向则取决于我们使用的坐标系,Unity使用的是左手坐标系,OpenGL使用的是右手坐标系。左手坐标系中,左手掌心向外,食指向上,中指向前,大拇指的方向就是x轴,食指指向的是y轴,中指指向的是z轴,将两个向量对准坐标轴,剩余的一个方向就是新向量的方向

叉积的模:$|A \times B| = |A||B|sin\alpha $ 其中$\alpha 是两个向量的夹角 模的几何意义:两个三维向量的叉积的模表示以这两个向量为边长的平行四边形的面积。 根据上面的公式可知,叉积的模是两个向量的模的乘积乘以他们的sin\alpha ,而sin\alpha $所代表的就是求三角形高的公式。

性质:
A×B=(A×B)A \times B = -(A \times B) 支持负交换律
a(A)×B=A×a(B)=a(A×B)a(A) \times B = A \times a(B) = a(A \times B) 实数与相乘可以随意切换
$A \times (B + C) = A \times B + A \times C $