【问题标题】:Measurement for intersection of 2 irregular shaped 3d object测量 2 个不规则形状 3d 对象的交点
【发布时间】:2018-03-31 04:10:29
【问题描述】:

我正在尝试实现一个目标函数,以最大限度地减少 2 个不规则形状 3d 对象的重叠。虽然重叠的最准确测量是相交体积,但它的计算量太高,因为我正在处理具有 1000 多个面且不是凸面的复杂对象。

我想知道是否还有其他计算速度更快的 3d 对象之间的交集测量? 2 对测量的要求是: 1、测量为0时,不能有重叠; 2. 测量值应该是一个标量(不是布尔值),表示重叠的程度,但这个值不需要很准确。

我正在考虑的可能测量包括某种 2D 相交表面积或 1D 穿透深度。或者,我可以使用基于样本的方法估计体积,该方法对一个对象内的点进行采样并测试另一个对象中存在的点的百分比。但我不知道在复杂的 3d 形状内采样点以及测试一个点是否被这种形状包围的计算成本有多大。

我将非常感谢有关此问题的任何建议、代码或方程式。此外,如果您可以建议任何接受 .obj、.ply...等文件并执行 3D 几何计算的库(最好是 python 库),那就太好了!如果我找到好的方法,我也会在这里发布。

更新: 我找到了一个很好的 Python 库,叫做 Trimesh,它可以执行我和其他人在这篇文章中提到的所有计算。它计算与 Blender 后端的精确相交量;它可以体素化网格并计算共同占用的体素的体积;它还可以在一个网格内执行表面和体积点采样,并在另一个网格内执行测试点控制。我发现表面点采样和包含测试(表面交叉的排序)和网格方法是最快的。

【问题讨论】:

  • 本题不涉及代码,纯数学题。最后一部分要求图书馆。两者都是 SO 题外话。
  • @KlausD。编程不仅仅是变量和分号。

标签: python 3d computational-geometry bin-packing


【解决方案1】:

我首先会尝试基于样本的方法。在联合边界 AABB 中生成一堆点,然后将 A 和 B 中的点数除以 A 或 B 中的点数。(您可以根据您的用例调整此度量 - 它效果不佳当 A 和 B 的体积非常不同时。)要检查给定点是否在给定的体积中,请使用谷歌的交叉数测试。有一些加速结构可以帮助进行此测试,但我的猜测是,能够为您提供合理准确度的样本数量低于从构建加速结构中整体受益所需的样本数量。

作为一种变体,您可以检查线交点而不是点交点:生成一条随机(轴对齐,以提高效率)线,并测量其中有多少包含在 A、B 和 A和 B。这需要比多面体点更多的簿记,但会为您提供更好的每个样本信息,从而减少您最终遍历所有面的次数。

【讨论】:

    【解决方案2】:

    通过直接体素化:

    如果面的大小相似(如果需要对大的面进行三角剖分),您可以使用网格化方法:定义一个间距大于最长边的常规 3D 网格,并为每个体素存储一位。

    然后对于网格的每个顶点,设置它所包含的单元格的位(这只是截断坐标)。通过这样做,您将获得对象的边界作为连接曲面。您将通过 3D 填充算法从内部或外部像素获得体积估计值。 (外面会更容易,但一定要在对象周围留下一个体素边距。)

    使用这种机器可以直接估计两个对象以及交集或联合的体积。成本将取决于面数和体素数。

    【讨论】:

    • 感谢您的回答!我个人发现体素方法是计算效率最高的方法之一,尤其是您可以控制网格分辨率。此外,由于我只对相交体积而不是比率感兴趣,我不需要担心 2 个网格的联合或大小比较,我可以简单地使用 # of co-occupied voxels * volume of the voxel。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多