嗯…
這是在看「XNA Collision Detection for 3D models」時的筆記,其實就是簡單的翻譯…
有些部份我不太知道怎樣翻,就自動忽略XD
如果不care就看看吧~哈哈~
最原始的半徑檢測
這是個最簡單的碰撞檢測技術,也就是將所有物件用一個圓球包起來。然後利用兩個物件的半徑進行檢測。這是目前 Air Legends 所採用的方式,如果你仔細觀察,應該可以發現,當兩個飛機發生碰撞時,他們並沒有真的靠在一起。
選擇…
XNA 提供兩個碰撞偵測的類別: BoundingSphere & BoundingBox。這兩者都是不可見的,同時也都有一個叫做 Intersects() 的方法,用來檢測是否與其他 BoundingSphere 或 Axis Aligned Bounding Box發生碰撞。
例如:
if (bulletBoundingBox.Intersects(planeBoundingBox)) { // 飛機被擊中。 } |
這裡有些應該了解的:
- 當遊戲中的實體物件移動時,同時也要更新對映的碰撞物件。
- 當你縮放實體物件時,也要同時縮放對映的碰撞物件。
- 當旋轉你的實體物件時,一樣要旋轉對應的碰撞物件。
(簡單說就是要和實體物件同步咩~廢話真多…)
使用BoundingBox有些問題。BoundingBox就是一個AABB(軸對齊包圍盒)。
想像有個看不見的立方體圍繞在我的飛機模型周圍。這是我們用來和其他飛機或子彈做碰撞偵測的 BoundingBox。
BoundingBox的型狀和位置取模型的最大和最小值。他們的資料型態是 Vector3,所以我們擁有X、Y 和Z在最小值的角落,以及最大值的角落。
那麼,當我們的模型旋轉時會怎樣呢?我們希望同時旋轉BoundingBox的最大 & 最小的值。
XNA有個方法可以轉換Vector的旋轉,所以是可行的。我們可以想像旋轉後的BoundingBox會像是…
警告!可以想像結果應該像是上圖一樣,我們可以在Debug時將BoundingBox畫出來。但是那並非BoundingBox的Intersects()方法所用的型狀,他會看作是…
我們旋轉了最大 & 最小的兩的頂點,但是當BoundingBox對齊軸線時,對齊的結果就如圖中所示。這是我為何選擇BoundingSphere替代BoundingBox的理由之一。球體並沒有任何旋轉的問題,不管你怎麼轉它都還是一樣的球體。
現在你可能在想…「球體和前面提到的半徑檢測有何不同?」。是的,一個球體包圍著我們的模型並不能改進甚麼,但是,你可以將之拆解成數個較小的BoundingSphere去取代模型的球體。接下來我們就要實際操作!
先在這邊停下來,將在Part2繼續。
OK!我忍不住,這裡偷偷貼一張…
雖然原作者似乎有些有趣的用詞,但那些我真的不知道怎樣翻,我盡力了
再次強調…這單純是筆記,並不是專業翻譯XDD
順便嘗試使用這個看起來不錯看的字體(英文部分)