2016-01-18 41 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