2010-07-16 153 views
8

我正嘗試用C++編寫二維物理引擎。到目前爲止,它似乎最受歡迎的是Box2D。不幸的是,Box2D是一個剛體身體物理引擎,這並不能真正幫助我嘗試我想要的東西。用C++編寫的非剛體二維物理引擎

我希望能夠定義一個形狀,其中有許多由彈簧連接的頂點,這樣當這個形狀與剛性或其他非剛性形狀碰撞時,它的形狀將是靈活的。

現在我試圖想到只用剛體在Box2D中這樣做的方法,但似乎總是缺點:

  1. 使用矩形或線段的靈活形狀的外邊緣。這些將與其他形狀相撞。不幸的是,它們並不富彈性,所以不會看到預期的效果。
  2. 形狀的每個頂點都可以是一個具有自己小圓形形狀的物體。這些物體可以通過彈簧連接在一起。這在形狀變形方面效果很好,但想象一下,如果形狀落在剛性釘上並且釘穿過頂點之間。然後形狀會卡在尖峯上。

那麼在C++中做這種物理的最好方法是什麼?最好不必編寫完整的物理引擎。也許我只是缺少Box2D的一個功能。也許這不是正確的選擇。那麼什麼是正確的選擇?

回答

3

有幾個軟件包/引擎支持可變形/軟體。如果你想免費的東西,你可以例如檢查出Phyz,SOFABullet

wikipedia上有詳細的列表。其中大多數都是基於3D的,但您可以通過將場景設置爲平面來將它們調整爲2D模型。

快樂編碼!

0

我真的不知道什麼是最好的方式,但here,靠近頁面的末尾是「泉」的代碼。

1

如果你只是在尋找變形,我會建議使用一個多邊形模型(trimesh),在那裏我會將碰撞回調捕捉到表示該形狀的剛體上。在碰撞點之後,我將確定造成一個或多個頂點的變形量。

對於不變形,我建議每個時步你應該遍歷你的變形點,並試圖將它們向外推。我猜這個查詢可以通過碰撞世界中非常小的球體查詢來完成。這也需要你保持一個「最大」未變形的位置。

這種方法實現起來相當簡單,雖然它不會是一個「柔體」,它可能是您正在尋找的東西。 http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/似乎是一個實現,它提供了您可能想要查看的源代碼。