测量2个不规则形状的3d物体的交点

时间:2018-03-31 04:10:30

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

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

我想知道是否还有其他三维物体之间的交点测量,计算速度要快得多? 2测量要求如下:1。当测量值为0时,不应有重叠; 2.测量应该是一个标量(不是布尔值),表示重叠程度,但这个值不需要非常准确。

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

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

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

2 个答案:

答案 0 :(得分:0)

基于样本的方法是我首先尝试的方法。在联合边界AABB中生成一堆点,并将A和B中的点数除以A或B中的点数。(您可以根据用例调整此度量 - 它不能很好地工作当A和B的音量非常不同时。)要检查给定点是否在给定音量中,请使用Google的交叉数测试。有一些加速结构可以帮助进行这项测试,但我的猜测是,为您提供合理精度的样本数量低于从构建加速结构中获益的样本数量。

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

答案 1 :(得分:0)

通过直接体素化:

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

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

使用此机器估算两个对象以及交叉点或联合的体积是很简单的。费用取决于面部数量和体素数量。