我想知道是否有人可以給我一個關於如何首先實現一個類來定義多邊形的想法,以及如何檢測使用這個類的兩個多邊形之間的碰撞。我在Android上的Java工作是更具體的,但我也可以使用NDK的C/C++。我想要定義我的多邊形,我只需要一個頂點數組吧?使用多邊形碰撞檢測
當我做碰撞檢測時,我已經閱讀了有關分離軸定理和GJK算法的內容。這是正確的路要走,還是我讓這個過於複雜?只是試圖開始正確的方向。謝謝!
我想知道是否有人可以給我一個關於如何首先實現一個類來定義多邊形的想法,以及如何檢測使用這個類的兩個多邊形之間的碰撞。我在Android上的Java工作是更具體的,但我也可以使用NDK的C/C++。我想要定義我的多邊形,我只需要一個頂點數組吧?使用多邊形碰撞檢測
當我做碰撞檢測時,我已經閱讀了有關分離軸定理和GJK算法的內容。這是正確的路要走,還是我讓這個過於複雜?只是試圖開始正確的方向。謝謝!
你聽起來像是你對這種事情相當陌生,這也許是你意識到的一個更大的問題。
我認爲你最好先定義你想要解決的問題,然後找到一個解決方案來解決這個問題。
讓我問你一些問題預選賽:
你說的是2D還是3D?
這是用於物理系統嗎?
你需要知道它們相交的地方嗎?或者只是它們相交?
你需要做的形狀布爾操作(如獲得交集或聯合或東西)?
我在2D中工作,是的,這是一個物理遊戲。我的目標是讓世界上的球反彈所有的物體。我目前有矩形和它的作品,但我想添加一些圖像,我可以創建多邊形使用預定義的頂點。根據物體碰撞的位置,我希望能夠將球彈出。 – 2012-02-24 17:54:47
對於物理學,你需要一些聽起來很簡單但在實踐中非常困難的事情: 1)你需要關於多邊形遊戲如何接觸(而不僅僅是接觸)的極其精確的信息。事實證明這很難。 2)你需要能夠解決多個移動物體之間的碰撞。這也很難。 如果你想要做的是寫一個物理庫,並假裝你正在寫一個遊戲,然後查找「Erin Catto」。他寫了一堆關於此的東西。如果你想寫一個遊戲,去獲得(免費)Box2D物理庫的實現 – 2012-02-24 17:56:46
這可能是我最終做的事情。我已經研究過使用Box2D,但希望能夠嘗試自己做這個工作,只是想知道學習Box2D是否會花費比嘗試手動實現這個更長的時間。謝謝。 – 2012-02-24 18:01:28
這取決於多邊形的類型。
如果你的多邊形是凸的,那麼一個有序的頂點列表將描述一個,而分離軸和GJK都將是可應用的算法。
如果你的多邊形是凹的但是簡單的(即,邊從不相交),那麼有序的頂點列表仍然足夠,但是分離軸或GJK都不適合。
如果你的多邊形是複雜的(即邊可能相交),那麼你需要頂點列表和填充規則。該規則確定哪些部分的飛機被認爲是在多邊形內部,哪些在外部。
例如,假設像五角星的多邊形:
在填充規則的區別在於在中間的五邊孔是多邊形的部分或簡單的孔的差。
所有更復雜的多邊形類型都可以分解爲多種簡單多邊形的多個實例,因此只需在地面放置一面旗幟並聲明您只對凸多邊形感興趣就可以了 - 這就是例如,GPU正是如此。
假設您將碰撞定義爲兩個多邊形是否重疊,分離軸定理非常簡單,而且絕對是一種可行的方法。如果你打算製作一個包含很多多邊形的場景,那麼你可能還需要一個寬泛的階段,這是一個快速的方法來標記一堆多邊形,因爲在做昂貴的測試之前,它們絕對不會重疊,以找出哪個多邊形其餘的仍然是。
一個明顯的例子是bin排序 - 假設你將屏幕劃分爲16個像素的垂直條,然後對每個多邊形進行分類(i)確定它接觸的是哪個bin; (ii)針對已經在這些箱中的所有多邊形進行測試; (iii)將其添加到垃圾箱。這可能意味着你甚至從來沒有考慮過很多時候應用這個測試。這個具體的方案有一些明顯的問題,取決於你的場景,但存在更智能的算法。
這是一個很好的解釋,謝謝!我在想Box2D可能是我應該去的路線。我對實現這一點非常感興趣,但使用完整的物理庫對我來說可能更容易也更有用。我非常感謝你的回答。 – 2012-02-24 18:03:39
這可能不是一個壞主意。我一直在做這些東西多年,並快速瀏覽一些代碼展示,我已經設法在約1,500條線上完成具有嚴格約束的剛性凸體,並且 - 完全分開 - 在軟約束條件下的非凸有彈性體同樣的,但如果你想要投入Box2D所做的所有事情(這比我的1500件作品中的任何一件都多),並且使其效率更高,你必須做更多的事情,並且要非常小心它。這是一個非常有趣的領域。 – Tommy 2012-02-24 19:47:11
你幾乎在正確的軌道上。如果你想讓碰撞正常工作,真的不會有更簡單的選擇。 – Dervall 2012-02-24 17:46:04
我在這個網站上找到了一個關於分離軸定理的很好的解釋http://www.codezealot.org/archives/55 – 2012-02-24 18:07:47
[This](http://www.metanetsoftware.com/technique/tutorialA.html)也是非常好。來自制作N的球員的教程 – 2012-02-24 18:26:31