如何找到3D对象是否适合另一个3D对象(容器)?

时间:2013-01-12 19:15:01

标签: algorithm computational-geometry

给定两个3d对象,我怎样才能找到一个是否适合第二个对象(并在容器中找到对象的位置)。

应翻译和旋转对象以适合容器 - 但不会另行修改。

其他并发症:

  1. 同样的情况 - 但寻找最合适的解决方案,即使它不是一个合适的匹配(最小化不适合容器的对象的体积)

  2. 支持弹性物体 - 找到最佳配合,同时尽量减少物体中的“扭曲”

  3. 这是一个相当普遍的问题 - 我不希望有完整的解决方案。 任何指向相关论文\ articles \ libraries \ tools的指针都是有用的

5 个答案:

答案 0 :(得分:0)

这可能是一种不太理想的方法。

您可以尝试修复1个形状的位置(在3D空间中)。将另一个形状放在该形状的顶部。然后创建链接,将形状中的一个点连接到另一个形状中的点。然后模拟链接被拉得同样紧张的情况。导致未固定的点旋转并平移直到它稳定。

如果合身足够宽松,您只能使用3个链接(3D链接的最小数量)并尝试每种可能的组合。但是,对于更紧密的贴合,您需要更多的链接,可能足以将它们放置在具有最少点数的形状的每个点上。这意味着你将有一些方法来确定如何放置链接,这不是一件容易的事。

答案 1 :(得分:0)

这似乎是一个很难的问题。可能的方法是使用一些启发式方法来建议转换,而不是检查它是否合适。如果变换仅将物体略微移出内部(例如在一个部件上),而不是略微调整变换并测试它。如果对象是“很多”(例如,在两侧的相同/所有轴上),而不是进行新的启发式猜测。

只是启发式的一般概念。对具有相同像素大小的对象进行光栅化。它可以是对象卷的八叉树。在像素之间建立连接图。检查图之间的子图同构。如果有一个子图而不是该位置用于测试。

此方法还支持90度旋转。

甚至可以在图表上进行一些测试。如果子图的所有卷邻居都在较大的图中,那么对象就在。

一般来说,这是'精炼'的边界框方法。

答案 2 :(得分:0)

另一个解决方案是在两个对象上投射相同数量的点,并在点集上进行最小平方最佳拟合。点集可能不会被排序相同,因此在最小二乘最佳拟合和点重新排序之间进行迭代,以使两个对象上的点接近相同的顺序。这方程式的开发是很多代数,但概念上并不复杂。

答案 3 :(得分:0)

考虑目标对象中的一个多边形(三角形)。对于此多边形,在其他几何(源)中找到等效多边形,即。边长,边缘之间的角度,面积都应该相同。如果只有一个匹配,找到刚性变换矩阵,它改变那个顶点:X' = M*X。由于匹配多边形上的所有点都知道X'X,因此线性代数应该可行。

如果要在多边形的顶点之间进行一对一的映射,则以相同的顺序遍历多边形的边,并创建一个查找表,将每个顶点一个多边形映射到另一个顶点。如果你有一个half edge data structure的3d对象,那将大大简化这个过程。

如果找到多个匹配的多边形,则从两个点遍历源多边形,并使其相邻多边形与目标多边形保持匹配。继续,直到其中一个中断,之后您可以执行与一个匹配版本相同的步骤。

列出了更为严肃的解决方案here,但我认为上述方法也可行。

答案 4 :(得分:0)

多汁的问题!。正如计算几何中的典型问题 不匹配的几何抽象可能会非常复杂。与各种if-else案件等 但是,选择正确的抽象,解决方案将变得很简单,只有很少的子情况。

计算形状和Voilà的Distance Transform!您的解决方案很简单。 请允许我详细说明。

形状在网格上的距离​​图(像素)编码最接近点在网格上的距离 形状与该像素的边界。可以在两个方向上向外或向内计算形状。 在这个问题上,向外距离图就足够了。

  • 步骤1:计算两个形状D_S1,D_S2的距离图
  • 第2步:减去距离图。差异= D_S1-D_S2
  • 第3步:如果Diff仅具有正值。然后,您的形状可以相互包含(+ ve => S1大于S2 -ve => S2大于S1) 如果Diff同时具有正值和负值,则形状相交。

那里有。享受吧!