识别3D环境中的模式

时间:2016-01-27 21:24:53

标签: c++ algorithm 3d pattern-matching unreal-engine4

我目前正在开发第三人称建筑游戏(作为bacheleor论文)。我需要识别构造的模式,我可以将相应的结构标记为某个建筑物(因此玩家可以开始使用该建筑物)。

我有以下规则:

  • 3种类型的构建块(均基于立方体)(以及将来会有更多类型)
  • 每个轴上的任何块都可以放大到 k 倍( k = 20
  • 块可以通过任何轴旋转(但保留在3D网格中)
  

问题定义:   网格2x2中的4个基本大小(1,1,1)的立方体应该等于1   框大小(2,2,1),因此所有可能的变体(主要是旋转不同)都可以被评估为有效的模式构造。

我希望我的模式最多可达 30x30x30 基本大小的倍数。

例如,我想识别这样的结构:(目前手动放置在水平target pattern structure 大小为21x21x22,由多个对象构成。

作为限制,我将从精确点开始边界模式搜索(假设该结构为控制台)。电流限制常数约为 50x50x50 基本立方体的倍数。 (限制可能会根据此处的答案进行更改。)

我搜索了20多个小时,结果只是从2D图像中识别3D结构或在2D中识别精确结构的论文。

  

我的问题是随着 K(每个 X,Y,Z)的增长,结构的数量会逐渐增加,这应该被接受为正确的模式构造。

     

问题:我应该使用什么算法(+ heurestic)?

以下3个图像包含结构的可视化,这被视为图像4处的模式的正确变体,因此应该找到并接受它们。 enter image description here enter image description here enter image description here enter image description here

所有这些都具有相同的最终形状(并且在相同位置具有相同的材料)。我将问题简化为2D形状,但在3D空间中扩展是显而易见的。

感谢您的所有回答/评论。

2 个答案:

答案 0 :(得分:1)

如果每个可以缩放轴的构建块可以细分为更小的1x1x1构建块,并且如果以下条件充分描述了构建的结构是否应该与给定模板匹配:

  • 任意细分模板构建块不应导致不匹配
  • 任意“挤出”任何轴对齐的平面(想象在一些轴对齐的平面上切割世界,然后将两半分开,而新物质不断填充最初接触的点之间的间隙)不应该导致不匹配
  • 任何其他差异都会导致不匹配

那么应该可以在时间O(b + t ^ 2)中有效地识别模板结构的构建实例,其中b是构建结构的体素体积,t是(通常非常小;见下文)模板的体素体积。基本思想是将任何构建的结构转换为规范形式,其中任何“挤出范围”被压缩为单个体素的长度。

Atomise然后规范化

首先,将构建结构中的所有构建块雾化为等效的1x1x1构建块形式。压缩挤出范围的下一步与从排序列表中消除重复的算法基本相同,但在3D中:

  • 对于每个轴d(X,Y,Z):
    • 设置j = 1。
    • 对于i从1到轴d的最大值:
      • 在轴d上的co-ord i处的构建结构的平面体素“切片”(例如,如果d是Y,那么所有x和z的体素集(x,i,z)相同于在合作i-1的前一个“切片”?
        • 如果不是,请在co-ord j处的切片顶部复制切片,然后递增j。

这将产生一个建筑结构的规范版本,其中所有相邻的切片都是不同的;通常这个版本会小得多,因为所有“长”特征都折叠到长度1.这里j的作用是指向我们可以放置下一个不相同切片的最早位置。由于j< = i总是,我们永远不必担心覆盖我们尚未处理的切片。另请注意,处理方向的顺序无关紧要,最终结果相同。

应该在开始时将相同的规范化过程应用于每个模板结构作为预处理。现在,两个规范形式(模板和构建结构)可以直接通过蛮力体素比较(基本上像strstr())进行比较,但在长方体内寻找长方体而不是字符串内的字符串)。此时也应尝试任何应视为有效转换的旋转或翻转。

功能和警告

给出模板

X.X
XXX

它会识别出例如以下为匹配,

X.X
X.X   XXX  XX
X.X   XXXXXXX
XXX   XXXXXXX

但不是例如。

X..
X.X
X.X
XXX

但是如果你想要检测这种具有不同长度腿的U形结构,你只需要提供一个额外的模板:

X..
X.X
XXX

此模板将匹配具有不同长度腿的所有U形结构(但 U形结构具有相等长度的腿!)。根据您考虑的旋转,您可能还需要镜像。

AABB相交的结构将无法正确处理。在前面的步骤中,这些可以很容易地分开。

有趣的是,该算法能够识别包含多个连通分量的结构。例如,模板

X.X.X

将识别连续三个相等大小的长方体(或列,如果允许旋转)。

答案 1 :(得分:0)

我会编写一个函数来检查1x1x1区域是否具有特定形状(完整块,半块+旋转,边块+旋转),然后以这种方式定义和检查模式。