2016-01-18 43 views
2

由於我的項目只會使用2d碰撞,所以我決定將所有物理和碰撞都交給Box2D 有3D圖形從3D對象中獲取2D凹多邊形

Box2D世界將自上而下,所以我需要將我的3D對象和平坦化爲它變成一個2D多邊形。這是去除每個頂點y座標一樣方便,但Box2D的不喜歡一堆頂點重疊的實際對象:

A 3D object Topdown object (flattened)

所以我想我如何可以實現的一些建議算法(或者是有,我應該使用庫?)得到一個好的漂亮的多邊形這樣的:

Nice pretty polygon

或者是基因評級OOBB更容易?

編輯:我現在認識到,Box2D只採取凸形狀!但對於其他具有更精確物理學的圖書館來說,這仍然有用。

謝謝!

回答

0

爲了計算3D對象的2D表示,一個可能的方法是光柵化:你從頂視圖創建對象的二進制光柵圖象(「二進制」意味着每個像素是隻有黑色或白色),然後您可以使用一組黑色像素作爲2D對象表示,或者如果您仍然需要多邊形,則可以運行邊界遍歷算法來計算構成此2D對象邊界的像素序列。該算法的精度取決於像素分辨率。一個這樣的實現是OpenCV的findContours(http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html)。

一旦你有一個像素序列,你可能想要簡化多段線,以保持頂點數低,這樣使用此多段線的後續操作將運行得更快。 (見http://doc.cgal.org/latest/Polyline_simplification_2/index.html


更一般地,如果你正在做的碰撞,你需要決定你如何精確需要的碰撞檢測是開始。如果你想要高精度的3D碰撞檢測,那麼展平到2D並不是一個好方法。所以,如果你需要高精度,高性能,你必須做一些預處理你的網格,如計算的軸對齊包圍盒層次樹或包圍球(https://en.wikipedia.org/wiki/Bounding_volume_hierarchy)。如果你的物體經歷了剛性變換,那麼邊界球體是好的,因爲球體在剛性變換下仍然是球體,其中邊界框在旋轉它們之後不保持軸對準。

+0

嗨,抱歉這麼長時間才能回覆。看起來很棒!但我現在意識到我沒有真正寫出我想要的東西。我知道獲得凹形狀的outilne頂點非常複雜,並且柵格化似乎是最好的解決方案,但Box2D只接受凸形狀。這顯然是我的錯,我把我的猴子輪廓畫成凹形! 在這裏我要離開這個以供將來參考和一個很好的答案,但我會問另一個問題爲得到一個凸形出這個(想想,纏繞形狀的緊彈性)。 – fordcars