从3D对象获取2D凹面多边形

时间:2016-01-18 06:59:20

标签: c++ 3d box2d vertex bounding-box

我目前的3D项目时间不多了,所以我决定将所有的物理和碰撞都交给Box2D ,因为我的项目只会使用2d碰撞,但是有3D图形

Box2D世界将是自上而下的,所以我需要将我的3D对象和展平它变成2D多边形。这就像从每个顶点移除y坐标一样简单,但是Box2D不喜欢与实际对象重叠的一堆顶点:

A 3D object Topdown object (flattened)

所以我想就如何实现一个算法(或者是否有一个我应该使用的库?)以获得一个漂亮的漂亮多边形这样的建议:

Nice pretty polygon

或者更容易生成OOBB?

编辑:我现在意识到Box2D只采用凸形!但是对于物理学更精确的其他图书馆来说,这仍然有用。

谢谢!

1 个答案:

答案 0 :(得分: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)的分层树。如果您的对象经历了严格的变换,那么边界球体是好的,因为球体在刚性变换下仍然是一个球体,而边界框在旋转之后不会保持轴对齐。