3.4 过程化植被与 L-Systems


3.4 过程化植被与 L-Systems

本节摘要:L-System(文法系统)用改写规则让一串字符迭代"生长"成植物形态:每轮把字母替换成更长的序列, turtle 依字符前进转弯画出枝干。本节调一棵教科书树,拆解规则、角度与年龄参数,再讲它与现代做法(手绘主干+程序化枝叶)的分工。

实验:调一棵 L-System 树

Houdini 自带 L-System 节点。新建一个,默认规则就是一棵小树苗。只动三个参数观察:

  1. Angle(分支角)从 25° 改到 18° 再到 40°——树形分别变挺拔和开张;
  2. Step size——每一节枝的长度,决定整体比例;
  3. Generations(迭代轮数)从 3 加到 5——枝的级数翻倍,点数指数增长(小心:7 代以上普通机器就吃力)。

默认规则大致形如(示意):

Premise: A Rule 1: A = F[&FA]//[&FA]////[&FA] Rule 2: F = FF

读法:字母是状态,每轮迭代按规则整体替换。F 前进一步并画枝,[ 保存当前位置压栈,] 弹回,& 绕轴低头,/ 绕轴自旋。Rule 2 让枝每年变长一倍——"年龄"就是迭代轮数,同一文法不同代数,就是同一棵树的不同树龄。

图 3.4-1 字符串如何长成树

图 3.4-1 字符串如何长成树

让树"活"起来:随机与加权

同一规则长出的树整齐得像克隆。两味药:

  • LSystem 节点自带随机扰动参数(变异幅度),枝角每支带少量偏差;
  • 规则里写概率分支A = F[&FA]//(0.4)[&FA]——括号前系数表示该分支 40% 概率出现。缺枝、偏冠,树才开始像野外长出来的。

山体主线里的用法:L-System 长出 2~3 个基础树形,存成代理模型,交回 3.2 的散布系统按密度撒——树是"文法生长+散布置位"的合成产物,各自只管自己那段。

L-System 的边界与现代分工

L-System 擅长自相似重复结构(灌木、蕨类、根系、血管状纹理),但让它长出"有主干的参天大树"很费劲——真实大树的枝干粗细、材质沿高度有强非自相似性。行业现状的分工:

方案 强项 弱项
纯 L-System 参数即品种,变体无限 大树形态难调,控制间接
手绘/扫描主干 + 程序化小枝叶 形态可控、美术友好 变体靠散布随机,主干有限
植被系统类外部工具 全流程集成 脱离 Houdini 管线

务实路线是第三列之外的组合:主干美术出,枝叶文法出,散布 Houdini 出——每种劳动交给最擅长的规则。

⚠️ 常见坑:L-System 输出的是折线枝干,直接渲染又硬又素。记得接 Skin/ Sweep 出圆柱枝、再在末端实例化叶片,并把 pscale 沿 @curveu 递减(3.1 的老朋友)。

💡 关键直觉:L-System 教会你的不是"树怎么长",而是改写规则=生长。这个思想在道路网生成(第 4 章)、河流分叉、雷电形状里全都通用。

本节要点回顾

  • 文法三件套:Premise 起始串、Rule 改写规则、Generations 年龄;
  • turtle 符号:F 前进、[] 压弹栈、& / 控姿态,串起来即枝干;
  • 指数爆炸:代数与点数是指数关系,小心 Generations;
  • 概率分支+角度扰动是去克隆感的关键;
  • 现代分工:主干美术、枝叶文法、置位散布。

几何技术集齐了。第 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 的季节滑杆;这个滑杆背后是整条管线的参数贯通性检验——如果拖不动,说明管线里有硬编码的季节假设,正好借此暴露清理。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U