Dot & Cross

点乘 Dot Product

点乘是两个向量的运算,结果为一个标量。

1
A · B  = |A||B|cosθ

若 A B 都为单位向量,则结果就是 cosθ,根据cos性质:

1
2
3
A Dot B > 0 则两向量夹角 < 90°
A Dot B = 0 则两向量垂直
A Dot B < 0 则两向量夹角 > 90°

由此, 游戏中可以用于:

  • 判定角色前后关系(判断视角FOV)

    1
    playerA朝向为向前向量A,playerA指向playerB的方向的向量B,A Dot B 结果 > 0 或某个阈值, 则代表playerB 在 playerA 前方,或者说在可视范围内。  
  • 漫反射光照模型

1
2
3
4
5
用于计算物体表面每个像素点的漫反射。表面指向光源方向向量 L Dot 像素法线方向向量(垂直与表面)

I = L Dot N

结果越大即方向越相似,即光越亮,反射越强。

叉乘 Cross Product

叉乘是三维空间中两个向量的运算,结果是一个新向量,其方向垂直于输入的两个向量。

1
A cross B = (AyBz - AzBy, AzBx - AxBz, AxBy - AyBx)

模长为

1
|A cross B| = |A||B|sinθ
  • A cross B 垂直于 A 和 B,则可以计算A B 为边向量的三角面法向量。

  • 判定左右,计算旋转

    1
    与Dot类似,根据sin性质,cross可用于判定左右,Dot用于判定前后
  • 判定某点是否在某凸多边形内

    1
    与上面类似,只需与逐条边向量比较,都为同向即为在内部。