本节摘要:L-System(文法系统)用改写规则让一串字符迭代"生长"成植物形态:每轮把字母替换成更长的序列, turtle 依字符前进转弯画出枝干。本节调一棵教科书树,拆解规则、角度与年龄参数,再讲它与现代做法(手绘主干+程序化枝叶)的分工。
Houdini 自带 L-System 节点。新建一个,默认规则就是一棵小树苗。只动三个参数观察:
默认规则大致形如(示意):
Premise: A Rule 1: A = F[&FA]//[&FA]////[&FA] Rule 2: F = FF
读法:字母是状态,每轮迭代按规则整体替换。F 前进一步并画枝,[ 保存当前位置压栈,] 弹回,& 绕轴低头,/ 绕轴自旋。Rule 2 让枝每年变长一倍——"年龄"就是迭代轮数,同一文法不同代数,就是同一棵树的不同树龄。

同一规则长出的树整齐得像克隆。两味药:
A = F[&FA]//(0.4)[&FA]——括号前系数表示该分支 40% 概率出现。缺枝、偏冠,树才开始像野外长出来的。山体主线里的用法:L-System 长出 2~3 个基础树形,存成代理模型,交回 3.2 的散布系统按密度撒——树是"文法生长+散布置位"的合成产物,各自只管自己那段。
L-System 擅长自相似重复结构(灌木、蕨类、根系、血管状纹理),但让它长出"有主干的参天大树"很费劲——真实大树的枝干粗细、材质沿高度有强非自相似性。行业现状的分工:
| 方案 | 强项 | 弱项 |
|---|---|---|
| 纯 L-System | 参数即品种,变体无限 | 大树形态难调,控制间接 |
| 手绘/扫描主干 + 程序化小枝叶 | 形态可控、美术友好 | 变体靠散布随机,主干有限 |
| 植被系统类外部工具 | 全流程集成 | 脱离 Houdini 管线 |
务实路线是第三列之外的组合:主干美术出,枝叶文法出,散布 Houdini 出——每种劳动交给最擅长的规则。
⚠️ 常见坑:L-System 输出的是折线枝干,直接渲染又硬又素。记得接 Skin/ Sweep 出圆柱枝、再在末端实例化叶片,并把 pscale 沿 @curveu 递减(3.1 的老朋友)。
💡 关键直觉:L-System 教会你的不是"树怎么长",而是改写规则=生长。这个思想在道路网生成(第 4 章)、河流分叉、雷电形状里全都通用。
几何技术集齐了。第 4 章把山体放进真正的地形系统:高度场。
L-System 的威力在"重写规则极短、结果极繁",自己写第一条规则前先看懂翻译表。龟图解释器逐符号执行:F 前进画枝、+/- 转向、[ 压栈分枝、] 弹栈回溯。经典灌木一条规则就够了:
公理: X 规则: X -> F[+X][-X]FX (每次重写 X 都裂出三分枝) F -> FF (老枝继续伸长) 角度 δ=25.7°, 迭代6次 => 逼真灌木 变异: 规则概率化 X -> F[+X]FX (60%) / F[-X]FX (40%) => 同一语法生成个体差异 —— 随机性进入语法的正确方式
// L-System 输出后处理: 按深度与年龄算粗细(管道体积分支律) int depth = i@depth; f@radius = ch("base_r") * pow(0.68, depth); // 每级收缩~2/3 f@len_scale = fit01(rand(@ptnum+chi("seed")), 0.85, 1.15); // 蒙皮时用 Sweep 的 radius=@radius, 再加重力下垂: v@P.y -= ch("droop") * depth * depth; // 老枝下垂
后处理三条律(半径衰减、长度抖动、光向下垂)是把"数学树"变成"生命树"的最低配置;叶级贴图与风场摆动留给第五章动力学回收。至此植被管线的骨架完整:语法生结构、参数生个体、生态规则(第二章散布密度场)生群落。
关于 L-Systems 的能力边界也要如实交代:经典 L-System 是无记忆的并行重写,天然适合枝干结构,但叶片朝向、向光弯曲、与环境的交互(避让、攀附)都在它的原生语义之外,需要后处理阶段补齐。因此成熟的植被管线总是"L-System 生骨架、VEX 加生态、散布管群落"的三段接力;试图把全部生物逻辑塞进一套语法规则的项目,最后都会得到一个不可调的怪物。语法管生成,参数管个体,生态管群落——三段各自的修改频率不同,分离它们就是分离变化率,这是全部工程设计的古老智慧在植被上的投影。
再补充一个季节与状态参数的设计提醒:交付级植被资产至少要有"季相"维度——同一语法树在不同参数下呈现春夏秋冬(叶色 ramp、密度系数、下垂角度)。实现上把季相作为顶层参数向下贯穿:密度场乘 seasonal_density、叶色 ramp 由 season 驱动、枝条 droop 随积雪量增加。美术侧只需拖一个 0 到 1 的季节滑杆;这个滑杆背后是整条管线的参数贯通性检验——如果拖不动,说明管线里有硬编码的季节假设,正好借此暴露清理。