正文

游戲數(shù)學(16)

精通C#游戲編程 作者:(英)斯庫勒


 

點積運算非常適合確定游戲中的對象是否彼此相向。它也適合用來測試某個對象是否在一個對象的某一邊,3D游戲中經(jīng)常使用這種方法來保證角色不能穿墻。

點積運算本身很簡單:第一個向量的所有元素與第二個向量的對應元素分別相乘,然后這些值加到一起,得到一個標量。點積在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);

}

點積對于判斷點在平面之前還是之后非常有用。平面是一個二維表面,就像一張紙。紙可以擺放在任何位置,擺放成任意角度,就像是一個集合平面。區(qū)別在于,紙張是有邊緣的,平面卻沒有,它們沿著兩個維度無限延展,就像是沒有邊界的紙張。平面通過使用點和法向量定義(見圖8-14)。點確定平面在空間中的位置,法向量確定了平面的指向。

在游戲中,可能把3D平面放在某個位置來標志變化:如果玩家通過了這個平面,則他通關(guān),或者出現(xiàn)一個boss,或者玩家掉入海中。測試玩家位于平面哪一側(cè)的方法如下。

● 創(chuàng)建一個從平面位置指向玩家位置的向量。

● 對平面的法向量和新創(chuàng)建的向量求點積。

● 如果結(jié)果為0,玩家剛好位于平面上。

● 如果結(jié)果大于0,玩家位于平面的法向量一側(cè)。

● 如果結(jié)果小于0,玩家位于平面的另一側(cè)。

圖8-15以圖形化的方式顯示了這個測試。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號