Sunday, June 22, 2008

碰撞測試的簡化

早前我試將 Game Engine 中 Collision 部份,轉為使用 NGD ( Newton Game Dynamics ) 的手動 Collision,便出現了問題:「 怎樣可以簡化兩個物件互相碰撞的方法?」

一如以往,我都是先設定好一些限制,才開始製作。因為 NGD 能夠建立一些基本的 Collision Primitives,例如 Box、Sphere、Capsule ... 等,我便由這些基本的 Primitives 著手。在試作的初時,用了些比較笨的方案,就是每一次要做碰撞測試,都要自己調用 NGD 的 CollisionCollide 功能,後來覺得這個很費時,因為每個物件做每一次碰撞測試,也要編寫一次程式,而且還要同時做 Collision Response。

想了兩、三天後,才醒覺自己的 Game Engine 內的 Frame 架構,是可以加入一些功能,用作記下碰撞測試後的資料,基本上不需要每一次也編寫一大堆重複的程式,所以最後便改成了而下的步驟:
● 用 AABB 測試 物件-A物件-B 是否需要碰撞測試
● 如需碰撞測試,便調用 NGD 的 CollisionCollide 功能
● 如有任何碰撞,將碰撞後的資料寫入物件 ( A / B ) 相對應的 Frame 中
● 同時回傳一個非零的資料,表示產生了碰撞

以上的步驟都是在 Game Engine 內部做好,在我編寫 Game Play 的時候,先調用 Engine 中的碰撞測試功能,若產生了碰撞,我只需要在相關的 Frame 中取回碰撞後的資料,便可以做 Collision Response 的調整。但因為每一種 Game 物件的 Collision Response 也可能有不同,看來這一點就很難加以簡化了。

No comments: