我目前正在开发第三人称建筑游戏(作为bacheleor论文)。我需要识别构造的模式,我可以将相应的结构标记为某个建筑物(因此玩家可以开始使用该建筑物)。
我有以下规则:
问题定义: 网格2x2中的4个基本大小(1,1,1)的立方体应该等于1 框大小(2,2,1),因此所有可能的变体(主要是旋转不同)都可以被评估为有效的模式构造。
我希望我的模式最多可达 30x30x30 基本大小的倍数。
例如,我想识别这样的结构:(目前手动放置在水平) 大小为21x21x22,由多个对象构成。
作为限制,我将从精确点开始边界模式搜索(假设该结构为控制台)。电流限制常数约为 50x50x50 基本立方体的倍数。 (限制可能会根据此处的答案进行更改。)
我搜索了20多个小时,结果只是从2D图像中识别3D结构或在2D中识别精确结构的论文。
我的问题是随着 K(每个 X,Y,Z)的增长,结构的数量会逐渐增加,这应该被接受为正确的模式构造。
问题:我应该使用什么算法(+ heurestic)?
以下3个图像包含结构的可视化,这被视为图像4处的模式的正确变体,因此应该找到并接受它们。
所有这些都具有相同的最终形状(并且在相同位置具有相同的材料)。我将问题简化为2D形状,但在3D空间中扩展是显而易见的。
感谢您的所有回答/评论。
答案 0 :(得分:1)
如果每个可以缩放轴的构建块可以细分为更小的1x1x1构建块,并且如果以下条件充分描述了构建的结构是否应该与给定模板匹配:
那么应该可以在时间O(b + t ^ 2)中有效地识别模板结构的构建实例,其中b是构建结构的体素体积,t是(通常非常小;见下文)模板的体素体积。基本思想是将任何构建的结构转换为规范形式,其中任何“挤出范围”被压缩为单个体素的长度。
首先,将构建结构中的所有构建块雾化为等效的1x1x1构建块形式。压缩挤出范围的下一步与从排序列表中消除重复的算法基本相同,但在3D中:
这将产生一个建筑结构的规范版本,其中所有相邻的切片都是不同的;通常这个版本会小得多,因为所有“长”特征都折叠到长度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区域是否具有特定形状(完整块,半块+旋转,边块+旋转),然后以这种方式定义和检查模式。