Python 两个不规则形状三维物体相交的测量

Python 两个不规则形状三维物体相交的测量,python,3d,computational-geometry,bin-packing,Python,3d,Computational Geometry,Bin Packing,我试图实现一个目标函数,使两个不规则形状的3d对象的重叠最小化。虽然重叠的最精确测量是相交体积,但它的计算成本太高,因为我处理的是具有1000多个面且不是凸面的复杂对象 我想知道是否有其他3d对象之间的交点测量更容易计算?2测量要求为:1。当测量值为0时,应无重叠;2.度量值应该是一个标量(不是布尔值),表示重叠的程度,但该值不需要非常精确 我正在考虑的可能测量包括某种2D相交表面积或1D穿透深度。或者,我可以使用基于样本的方法估计体积,该方法在一个对象内采样点,并测试另一个对象中存在的点的百分

我试图实现一个目标函数,使两个不规则形状的3d对象的重叠最小化。虽然重叠的最精确测量是相交体积,但它的计算成本太高,因为我处理的是具有1000多个面且不是凸面的复杂对象

我想知道是否有其他3d对象之间的交点测量更容易计算?2测量要求为:1。当测量值为0时,应无重叠;2.度量值应该是一个标量(不是布尔值),表示重叠的程度,但该值不需要非常精确

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

我将非常感谢任何关于这个问题的建议、代码或公式。另外,如果您可以建议任何接受.obj、.ply…等文件并执行三维几何计算的库(最好是python库),那将非常棒!如果我找到一个好方法,我也会在这里发布

更新:
我发现了一个名为Trimesh的好python库,它可以执行我和其他人在本文中提到的所有计算。它计算与混合器后端的确切相交体积;它可以对网格进行体素化并计算共占体素的体积;它还可以在一个网格内执行曲面和体积点采样,并在另一个网格内执行测试点包容。我发现表面点采样和包容测试(表面交叉点)以及网格方法是最快的

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


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

通过直接体素化:

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

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


使用这种机器,估算两个对象的体积以及相交或并集非常简单。成本将取决于面数和体素数。

这个问题不涉及代码,因此它纯粹是数学问题。最后一部分是图书馆。这两件事都是离题的,所以我想。编程不仅仅是变量和分号。谢谢你的回答!我个人发现体素方法是计算效率最高的方法之一,特别是可以控制网格分辨率的方法。另外,由于我对相交体积而不是比率感兴趣,我不需要担心两个网格的并集或大小比较,我可以简单地使用共占体素的体积*体素的体积。