英吋 XNA

XNA – 3D模型的碰撞檢測 – Part 1

嗯…
這是在看「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
順便嘗試使用這個看起來不錯看的字體(英文部分)

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.