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

Get a 2D concave polygon from a 3D object

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

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

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

或者生成 OOBB 更容易吗?

编辑: 我现在意识到 Box2D 只采用凸形!但这对于其他具有更精确物理学的库仍然有用。

谢谢!

为了计算 3D 对象的 2D 表示,一种可能的方法是光栅化:从俯视图创建对象的二进制光栅图像("binary" 意味着每个像素只有黑色或白色) ,然后您可以使用一组黑色像素作为二维对象表示,或者如果您仍然想要多边形,则可以 运行 边界遍历算法来计算构成此二维对象边界的像素序列。该算法的精度由像素分辨率决定。一种这样的实现是 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 不是一个好的方法。因此,如果您需要高精度和高性能,则必须对网格进行一些预处理,例如计算 axis-aligned 个边界框或边界球 (https://en.wikipedia.org/wiki/Bounding_volume_hierarchy) 的层次树。如果您的对象进行刚性变换,那么边界球体就很好,因为球体在刚性变换下仍然是球体,而边界框在旋转后不会保持 axis-aligned。