點(diǎn)積運(yùn)算非常適合確定游戲中的對象是否彼此相向。它也適合用來測試某個(gè)對象是否在一個(gè)對象的某一邊,3D游戲中經(jīng)常使用這種方法來保證角色不能穿墻。
點(diǎn)積運(yùn)算本身很簡單:第一個(gè)向量的所有元素與第二個(gè)向量的對應(yīng)元素分別相乘,然后這些值加到一起,得到一個(gè)標(biāo)量。點(diǎn)積在3D圖形學(xué)中是一種很常用的運(yùn)算,所以運(yùn)算符*常被重載以代表這種運(yùn)算。
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);
}
點(diǎn)積對于判斷點(diǎn)在平面之前還是之后非常有用。平面是一個(gè)二維表面,就像一張紙。紙可以擺放在任何位置,擺放成任意角度,就像是一個(gè)集合平面。區(qū)別在于,紙張是有邊緣的,平面卻沒有,它們沿著兩個(gè)維度無限延展,就像是沒有邊界的紙張。平面通過使用點(diǎn)和法向量定義(見圖8-14)。點(diǎn)確定平面在空間中的位置,法向量確定了平面的指向。
在游戲中,可能把3D平面放在某個(gè)位置來標(biāo)志變化:如果玩家通過了這個(gè)平面,則他通關(guān),或者出現(xiàn)一個(gè)boss,或者玩家掉入海中。測試玩家位于平面哪一側(cè)的方法如下。
● 創(chuàng)建一個(gè)從平面位置指向玩家位置的向量。
● 對平面的法向量和新創(chuàng)建的向量求點(diǎn)積。
● 如果結(jié)果為0,玩家剛好位于平面上。
● 如果結(jié)果大于0,玩家位于平面的法向量一側(cè)。
● 如果結(jié)果小于0,玩家位于平面的另一側(cè)。
圖8-15以圖形化的方式顯示了這個(gè)測試。