【问题标题】:Get a 2D concave polygon from a 3D object从 3D 对象获取 2D 凹多边形
【发布时间】:2016-04-23 06:42:42
【问题描述】:

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

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

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

还是更容易生成 OOBB?

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    为了计算 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)。如果您的对象经历了刚性变换,那么边界球体是好的,因为球体在刚性变换下仍然是一个球体,而边界框在旋转它们后不会保持轴对齐。

    【讨论】:

    • 您好,很抱歉这么久才回复。看起来真棒!但我现在意识到我并没有真正写出我想要的东西。我知道获得凹形的外顶点非常复杂,光栅化似乎是最好的解决方案,但 Box2D 只接受凸形。这显然是我的错,我把我的猴子轮廓画成凹形!我将把它留在这里以供将来参考和一个好的答案,但我可能会问另一个问题,以获得一个凸形的形状(想想,在形状周围包裹一个紧的松紧带)。
    猜你喜欢
    • 2015-03-14
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2011-05-02
    • 2017-12-07
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多