#procedural-generation #graph-node #constraint #generation #procedural #graph-algorithms #wfc

wave-function-collapse

根据所选算法将节点及其限制转换为折叠后的节点状态

3个不稳定版本

0.2.0 2023年8月16日
0.1.2 2022年12月7日
0.1.0 2022年11月30日

算法类别中排名第1289

每月下载量33

MIT/Apache

355KB
5.5K SLoC

波函数坍缩

根据所选算法将节点及其对其他节点的限制转换为完全折叠的节点状态。这可以用来解决从密集节点图到数独,再到程序生成的游戏元素等各种复杂程度的难题。

特性

  • 基本接口,易于尝试使用
    • 图不需要完全连接
    • 两个节点之间缺少的任何约束都意味着在此状态下,前一个节点对相邻节点没有影响
  • 允许根据问题定制算法
    • 当已知非常少、一个或没有可能的解决方案时,进行所有可能解决方案的完全顺序搜索
      • 可以确定波函数是否不可折叠
    • 当存在许多可能的解决方案时,进行随机搜索以获得更多异质解决方案,但在某些情况下可能永远无法完成
    • 基于模型图像数据的熵传播搜索,可以生成有趣的图像
  • 可以建议每个节点每个状态的不同概率,以允许获得更快的结果或不同的随机结果(取决于使用的算法)
  • 示例显示了如何通过不同的算法解决不同的约束问题
  • 波函数可以保存到文件并从中加载

使用方法

要使用此框架,您首先需要确定以下内容

  • 您的节点状态类型是什么?
    • 枚举,因为只有特定的状态吗?
    • UUID字符串,因为它们可能在编译时未知吗?
    • u64,因为它是数据库中标识符的引用吗?
    • 图像片段结构,它包含重叠的图像像素数据?
  • 您的节点图是什么样的?
    • 它是一个像棋盘一样的平面网格吗?
    • 它是一个像细胞游戏(例如:Minecraft)一样的3D网格吗?
    • 一个二叉有向树?
  • 对于任何特定节点,哪些节点状态允许其相邻节点具有哪些其他节点状态?
    • 节点的直接相邻节点能否与当前节点具有相同的状态?
    • 当节点处于此特殊状态时,是否只有某些状态是可能的?

一旦这些问题得到解答,您就可以构建节点向量以及那些节点引用的用于它们许可关系的节点状态集合向量。请查看相关示例以了解节点和节点状态集合的构建过程。

示例

图像示例

此示例演示了在https://github.com/mxgmn/WaveFunctionCollapse中展示的相同功能。

cargo run --release --example image

数独示例

此示例演示了使用顺序波函数坍缩算法。

cargo run --release --example sudoku

景观示例

此示例演示了使用适应性波函数坍缩算法。

cargo run --release --example landscape

稀疏示例

此示例演示了结合更多稀疏概率使用适应性波函数坍缩算法。

cargo run --release --example sparse

斑马谜题示例

此示例演示了用于像斑马谜题这样的文字问题的顺序波函数坍缩算法。

cargo run --release --example zebra_puzzle

复杂问题

节点之间的共享条件

当您想要表达“当节点1处于状态A且节点2处于状态B时,节点3只能处于状态C”时,您将需要拥有多个相同节点状态的变体,以便我们之前提到的状态“B”相当于“B当节点1是A”。这将允许您为节点2指定,当它在状态“B当节点1是A”时,它将只允许节点3处于状态C。

示例即将到来

依赖关系

~5-14MB
~179K SLoC