MarkovJunior项目语法详解:从网格创建到规则应用
概述
MarkovJunior是一个基于马尔可夫链的生成系统,通过定义网格、规则和节点来创建复杂的生成式内容。本文将深入解析该系统的核心语法元素,帮助开发者掌握其工作原理。
网格(Grid)系统
网格是MarkovJunior中最基础的构建块,所有生成操作都在网格上进行。网格创建有两种主要方式:
- 根网格创建:作为整个生成过程的起点
- 派生网格创建:通过
wfc
或map
节点创建
网格属性详解
-
values属性:定义网格可能包含的值集合。例如
values="BRGUY"
表示网格可以包含黑色(B)、红色(R)、绿色(G)、蓝色(U)和黄色(Y)值,初始值为黑色。 -
folder属性:指定规则文件的查找目录。例如
folder="DungeonGrowth"
会从DungeonGrowth目录加载规则。 -
origin属性(仅根网格):布尔值属性,默认为False。当设置为True时,会在网格中心创建一个像素点,其值为values属性中的第二个值。例如
values="YRBAN" origin="True"
会创建一个黄色背景的网格,中心有一个红点。
对称性(Symmetry)控制
对称性是生成过程中的重要概念,可以显著影响最终结果的美观性和一致性。
- 默认行为:系统默认使用最大对称性组
- 自定义对称性:通过
symmetry
属性指定特定的对称模式。例如在花朵生成中,可以限制规则仅沿x轴镜像,确保花朵垂直生长而非侧向生长。
规则(Rules)系统
规则定义了网格状态如何转换,是生成过程的核心机制。
规则定义方式
-
直接定义:
in="BBB/BWB"
:定义规则的输入部分out="RR DA FR"
:定义规则的输出部分- 斜杠
/
分隔y轴,空格分隔z轴
-
文件加载:
fin="filename"
:从文件加载输入fout="filename"
:从文件加载输出file="filename"
:加载包含输入和输出的完整规则
规则属性
- p属性:规则应用概率,默认为1.0。例如可以设置只有25%的天花板位置会转换为光源。
- legend属性:当从文件加载规则时必须指定,按扫描线顺序列出使用的值。
规则节点(Rulenodes)类型
MarkovJunior提供三种主要规则节点,用于控制规则的执行方式:
-
one节点(存在节点):
- 只要存在匹配的规则就执行
- 适用于"至少存在一个"的场景
-
all节点(全称节点):
- 对所有匹配的规则都执行
- 适用于"全部应用"的场景
-
prl节点(并行节点):
- 类似all节点,但规则独立应用,不考虑重叠
- 性能更高,在无冲突场景下结果与all节点相同
steps属性:限制节点执行步数,例如steps="60"
限制最多执行60步。
联合(Unions)机制
联合允许将多个规则组合使用,创建更复杂的生成行为。典型应用包括:
- 组合不同生长方向的规则
- 创建多阶段生成过程
- 实现条件性规则应用
推理(Inference)系统
推理是MarkovJunior的高级功能,允许对生成过程施加约束。
观察元素(observe)
通过observe
元素定义约束条件:
value
:当前值from
:立即转换为什么值to
:最终应该转换为什么值
例如:
<observe value="W" to="BR"/>
:白色方块最终应变为黑色或红色<observe value="I" from="B" to="W"/>
:靛蓝方块先变黑,最终变白
搜索模式
- 贪婪模式(search=false):按规则传播场贪婪执行
- 搜索模式(search=true):使用规则传播场作为启发式搜索状态图
搜索参数:
limit
:限制搜索状态数depthCoefficient
:在广度优先和深度优先搜索间插值temperature
:控制目标跟随严格程度
特殊节点类型
映射(Map)节点
用于网格转换和映射操作,典型应用包括:
- 迷宫生成
- 几何变换
- 空间划分
路径(Path)节点
专为路径相关操作设计,可用于:
- 迷宫填充
- 电路生成
- 地下城布局
卷积(Convolution)节点
实现基于邻域的转换规则,常见用途:
- 细胞自动机(如生命游戏)
- 洞穴生成
- 连通区域处理
高级生成技术
波函数坍缩(WFC)
两种主要模式:
- 平铺WFC:基于预定义平铺的生成
- 重叠WFC:基于样本模式的生成
应用场景包括:
- 建筑生成
- 表面纹理
- 复杂结构创建
卷积链(ConvChain)
基于马尔可夫链的生成技术,适用于:
- 迷宫变体
- 有机结构
- 程序化内容混合
常见问题解答
Q:如何创建循环或重复序列?
A:将sequence
节点嵌套在markov
节点或其他sequence
节点内。目前不支持计数器,替代方案是重复执行序列直到满足某个条件。
最佳实践建议
- 渐进式开发:从简单规则开始,逐步增加复杂度
- 对称性利用:合理使用对称性提高生成质量
- 性能优化:在无冲突场景下优先使用prl节点
- 约束设计:谨慎使用推理系统,避免过度约束
- 模块化:将复杂规则分解为多个简单规则组合
通过掌握这些语法元素和概念,开发者可以充分利用MarkovJunior创建各种复杂的程序化生成内容。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考