参考
http://127.0.0.1:48626/nodes/sop/lsystem.html
L-System
L-system 规则的一般形式为:
字符串[:条件] = [左分支]字符串[右分支][:概率][:概率]
A = "[&FFFA] //// [&FFFA] /// [&FFFA] [&FFFA]
F(l,w) = F(l * 2,w * 3)
计算顺序
先覆写,最后展开。
举例:
Premise: F(1,1) A
Rule 1: A = F(1,1) [F(1,1) A]
Rule 2: F(l,w) = F(0, w)上题将会产生下列结果:
Iter 0:
1. F(0.5,1) A
Iter 1:
1. F(0,1) A # 做 R2 的替换
2. F(0,1) F(1,1) [F(1,1) A] # 再展开A分支
使用方括号 [] 创建分支。
放在方括号内的任何L-System命令都由一个新的L-System独立于主字符串执行。


概率
若同时出现以下两条规则,则出现概率你懂的。
A = XXX :0.25
A = YYYRewrite 替换
替换表达式

参数
F: 向前移动一步,画一条线连接前一个位置和新位置。
f: 不画线就往前走。
+: 向右旋转 参数面板Values下Angle 度。
-: 向左旋转 参数面板Values下Angle 度。
&:向上俯仰。
^:向下俯仰。
\\:顺时针滚动。
/:逆时针滚动)命令。


F(l, w, s, d)
F:向前移动(创建几何体)
l:距离
w:宽度
s:竖向分割数
d:横向分割数动 态 参 数,可以让树枝树叶多样化!
"(s) 用当前长度乘以s。
!(s) 用当前厚度乘s。
;(s) 用当前角度乘s。
_(s) 对当前长度除s。
?(s) 对当前宽度除s。
@(s) 对当前角度除s。
~(a) 随机俯仰/滚动/旋转数到一个度,最大是a度。生成模型
J、K、M三个输入
可以使用Switch扩展输入:将Switch连接至J或K或M,将其Input设为'stamp("../lsystem1/", "lsys", 0)',然后在 Rewrite 那边使用语法 R(L,0,X)把X换成Switch的12345。d和c角度是啥,在哪调,
H(lwsd) 向前移动 F 的一半。
T(g) 应用重力。
+(a) 右转a度。
-(a) 左转a度。
&(a) 向下Pitch a度。
^(a) 向上Pitch a度。
\\(a) 顺时针旋转a度。
/(a) 逆时针旋转a度。
| 转180度。
* 滚180度。
~(a) 随机俯仰/滚动/旋转数到一个度,最大是a度。
'(u) 颜色索引U自增u个单位,u是UV Increment第一个变量。
#(v) 颜色索引V自增v个单位,v是UV Increment第二个变量。
% 把树枝的剩余部分剪掉
$(x,y,z) 将turtle旋转 使其上方向为 (0,1,0),将turtle指向点(x,y,z)的方向。默认的行为只是定位,而不是改变方向。
[ 分支开始
] 分支结束
{ 四边形开始
. 创建一个四边形顶点
} 四边形结束
g(i) 创建一个新的图元组,后续的几何体将被添加到该组中。组名由“组前缀”后跟数字‹i›组成。若未指定参数,则默认创建一个具有当前组号的组,并使当前组号递增。
a(attrib, v1, v2, v3) v2和v3是可选的,创建一个带有attrib属性的点,该分支剩余的点都会有这个attrib直到另一个指令重置它。默认值总是float 0,比如("Cd", 1, 0, 1)是漂亮紫色。鼠标悬停可以查看参数:


样例

