点积运算非常适合确定游戏中的对象是否彼此相向。它也适合用来测试某个对象是否在一个对象的某一边,3D游戏中经常使用这种方法来保证角色不能穿墙。
点积运算本身很简单:第一个向量的所有元素与第二个向量的对应元素分别相乘,然后这些值加到一起,得到一个标量。点积在3D图形学中是一种很常用的运算,所以运算符*常被重载以代表这种运算。
public double DotProduct(Vector v)
{
return (v.X * X) + (Y * v.Y) + (Z * v.Z);
}
public static double operator *(Vector v1, Vector v2)
{
return v1.DotProduct(v2);
}
点积对于判断点在平面之前还是之后非常有用。平面是一个二维表面,就像一张纸。纸可以摆放在任何位置,摆放成任意角度,就像是一个集合平面。区别在于,纸张是有边缘的,平面却没有,它们沿着两个维度无限延展,就像是没有边界的纸张。平面通过使用点和法向量定义(见图8-14)。点确定平面在空间中的位置,法向量确定了平面的指向。
在游戏中,可能把3D平面放在某个位置来标志变化:如果玩家通过了这个平面,则他通关,或者出现一个boss,或者玩家掉入海中。测试玩家位于平面哪一侧的方法如下。
● 创建一个从平面位置指向玩家位置的向量。
● 对平面的法向量和新创建的向量求点积。
● 如果结果为0,玩家刚好位于平面上。
● 如果结果大于0,玩家位于平面的法向量一侧。
● 如果结果小于0,玩家位于平面的另一侧。
图8-15以图形化的方式显示了这个测试。