Skip to content

参考

https://youtu.be/0vE8GiXhOWM

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独立于主字符串执行。

imgimg

概率

若同时出现以下两条规则,则出现概率你懂的。

A = XXX :0.25
A = YYY

Rewrite 替换

替换表达式

img

参数

F: 向前移动一步,画一条线连接前一个位置和新位置。
f: 不画线就往前走。
+: 向右旋转 参数面板Values下Angle 度。
-: 向左旋转 参数面板Values下Angle 度。

&:向上俯仰。
^:向下俯仰。
\\:顺时针滚动。
/:逆时针滚动)命令。
imgimgimg
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)是漂亮紫色。

鼠标悬停可以查看参数:

imgimg

样例

img