Houdini 中文帮助文档

L-System

使用简单的递归规则,创建分形的几何体。

About L-systems

L-systems(Lindenmayer-systems,以艺术家Lindenmayer来命名),允许通过迭代计算来定义复杂的形状。其是使用数学语言,在这个语言中,字符串会要和规则相匹配(规则是重复计算的),最终的计算结果是用于生成几何体。每次计算的结果都会成为下一次迭代计算的基础几何体,给出了错觉上的增长。

L-system SOP可以让你模拟复杂的有机结构,如树木,闪电,雪花,花,以及其它分支对象。

Placing an L-System in the viewer

To… Do this
Place the L-System anywhere in the scene 在场景任意位置方式L-System 1. 点击创建选项卡中的L-System

2. 将鼠标移动到场景视图

Note

你可以按住Alt,将L-System分离构造平面

3. 左键点击场景任意位置,按Enter确认你的选择

如果你直接按Enter,而为点击,H会在原点处放置L-System

Place the L-System at the origin

在原点放置L-System

按住Ctrl,左键点击工具架上的L-System

%image_alt%

默认可以在物体级别的gear下拉菜单中,选择L-System。

L-System Handles

L-System 没有其自身的旋转参数;但是,你可以在物体级别,在视图中使用手柄旋转它,或添加一个Transform节点。

Note

L-system的原点是在树的基部,而非物体的中心。

L-system basics

Fractal properties–分形属性

有几个可以组织树木结构,以及对其外观共享值的因子,其包括:

symmetry –对称

self-similarity –自类似

developmental algorithms —演变算法

使用L-system,我们最关心的是后两者。自类似暗指底层的分形结构,其会提供一个L-system的字符串。碎形与粗糙度描述着自类似,如下:

当每个形状块对象和整体类似时,那么形状和生成的层叠对象就叫做自类似对象。

L-system提供了一个用于描述自类似结构,在时间上增长的语法。L-system规则定义了底层的增长结构(和DNA类似的,定义着生物的增长)。此增长依赖于自类似的准则,提供了对复杂曲面极其简洁的描述。

Rewriting

L-system的核心概念就是重写。 这是通过递归地替换初始状态, 重写几何体,让同样的每个内部端点被替换

1968年,Astrid Lindenmayer 引进了一个字符串 重写机制,称为“L-systems”。 L-systems的语法是独一无二的, 其规则会平行的被运用,同时被给定的“字”所替换。

重写语法的最简单的例子是使用两个“字”或字符串:a和b,(其可能在一个字符串中发生过很多次)。每个字会和 一个重写规则关联。规则a= ab 意味着之后a会被b所替换,规则b =a意味着b会被a所替换。

如果我们以一个字母b为开始,随后,我们会看到某种样式(使用下面的重写规则):

Production rule syntax

L-system的总的规则是:

[left_context<] symbol [>right_context] [:condition]=replacement [:probability]

Where…

left_context 是一个可选的字符串,必须优先于符号之前(用于此规则的匹配)(这句话我压根就没获得什么有用的信息)
symbol 要被替换的符号。如,如果符号时A,在初始字符串中,符号A的发现会被replacement 所替换。
right_context 是一个可选的字符串,必须优在符号之后(用于此规则的匹配)
condition 可选的表达式,对于匹配的规则,必须是真
replacement 替换符号的字符串。
probability 此规则会被执行的几率。如,使用0.8意味着此规则会执行时间的80%.

Tip

你可以在规则中使用->,而非=。其意思是一个标志

Turtle commands

我们可以将此字符串操作系统和一个图形程序(使用位置和朝向角度解释字符串)合并。使用下面的命令, turtle 会在其移动时,跟踪出一个形状。

简单的 turtle 命令例子:

F 向前移动一步,绘制一个线,连接前一个和新的位置
f 向前移动,不绘制线
+ 向右旋转90度
向左旋转90度

在真实的L-system中,+和—命令的角度是可以设置的。

使用这些简单的规则,我们可以得到一个字符串,可以使turtle绘制像L这样的字母。如,假定 turtle是向上朝向的,我们可以使用下面的字符串来创建字母L。

Rewriting turtle command strings

通过在重写规则中迭代运行一个turtle 命令字符,你可以生成异常复杂的几何体。规则中的自参考指数  可以创建非常错综复杂的结构。

自参考是一个非常简单的例子使用初始的字符串A和规则A=F+A 来考虑L-system。规则的意思是:当你看到A,使用F+A替换它。因为其中的替换会触发规则,每个生成会导致字符串以级联效应方式增长 :

此会生成一个增长列表(重复的前向移动,转弯命令)。使用小于90度的转弯,足够的迭代次数L-system会生成近似弧形或圆形的对象。 你可以使用这种行为来卷一张纸或卷曲蝎子的尾巴。 或者,你可以随机化转角,并创建一个波浪线,可以使用它制作闪电效果。

(千万不要混淆 turtle 字符串命令F +A和数学中的F+A。在L-system环境中,+表示转弯,而非相加。

另一个例子:下面的这个图形叫做 二次科赫岛 :

初始字符串 F-F-F-F
重写规则 F = F-F+F+FF-F-F+F
Angle角度 90

turtle 会生成下面的三个对象:
%image_alt% %image_alt% %image_alt%

Branches

目前为止,所描述的系统会生成一个连续的线。要描述树木之类的东西,我们需要用另一种方法来创建分支。

在L-systems中,您你可以使用方括号( [和 ] ) 创建分支。任何你在方括号内放置的 turtle 命令会从主字符串中分离出来执行。

例如, turtle 命令F [+F] F [+F] [-F]可解释为:

往前走。

分叉,向右转,然后向前走。

往前走。

分叉,向右转,然后向前走。

分叉,向左转,然后向前走。

这将创建如下的图形:

另一个例子:字符串命令 F F F[+][F][+ F]-FF 将创建如下的图形:

3D

到目前为止所描述的系统可以生成平面几何体。

要以3D方式移动 turtle ,可以使用 &、^ 、\ 、/ 命令。

例如,初始的前提是:FFFA 和规则:rule= “[&FFFA] (&FFFA)/ / / / / / / /(&FFFA) 。

此会创建下面的3D形状

%image_alt%

%image_alt%

%image_alt%

%image_alt%

%image_alt%

此规则会在每个迭代中创建三个分支。pitch up 命令会从垂直中分割处分支。 roll 命令会使分支沿着不同方向向外。  (注意,在每个分支末端,确保有新的拷贝规则会从分支端点生长出来)。

命令会使F 命令在每次计算中长度减半,会使分支渐渐萎缩消失。

Use multiple L-system rules

在前一节中,我们使用了rule= “[&FFFA]/ / / /(&FFFA)/ / / /(&FFFA) 。

显然,此规则很冗余。因为L-systems是何字符串替换有关的,我们可以简单地使用新的字符串替来重复替换,然后给那个符号创建一个新的规则。

Rule 1 A= ” [B] //// [B] //// [B]
Rule 2 B= &FFFA

因为分支是在一个地方定义的,如果你想改变分支结构,你只需要编辑一个字符串。

注意,双规则系统会花费两倍的计算生成同样的结果。

因此,无论是在每个迭代中,按扩展A来增长的规则:A= ” [&FFFA] //// [&FFFA] //// [&FFFA] ,而单一的规则:以,而双规则A= ” [B] //// [B] //// [B]和B= &FFFA   会通过使用” [B] //// [B] //// [B]替换A, &FFFA替换B来完成。

Turtle 命令集:

F(l,w,s,d) 向前移动距离L,宽度W,使用s横截面,d细分数量。
H(l,w,s,d) 向前移动一半的长度,距离L,宽度W,使用s横截面,d细分数量。
G(l,w,s,d) 向前移动,但不记录顶点位置,距离L,宽度W,使用s横截面,d细分数量。
f(l,w,s,d) 向前移动距离L,宽度W,使用s横截面,d细分数量。
h(l,w,s,d) 向前移动一半的长度,距离L,宽度W,使用s横截面,d细分数量。
J(s,x,a,b,c) K(s,x,a,b,c) M(s,x,a,b,c) 在缩放,重定向几何体后,在turtle的位置处,从叶的输入端J,K,M拷贝几何体。几何体会被s参数缩放,钳制到a-c之间。如果给定的参数存储,相对的叶参数也设置了,才会有钳制。x参数不会被使用,且应当被设为0.记住,叶输入端点的矢量属性会影响turtle 的移动。
T(g) 运用重力。此角度值沿着Y轴负方向。改变的数量会被g支配。默认的变化是使用重力参数。
+(a) Turn right adegrees. Default Angle. 右转a角度,默认角度
-(a) 左转a角度,默认角度
&(a) 上仰a角度,默认角度。
^(a) 下俯a角度,默认角度。
\(a) 顺时针旋转a角度,默认角度。
/(a) 逆时针旋转a角度,默认角度。
| 旋转180度。
* 滚动180度。
~(a) 上仰/滚动/转动随机数量的角度,最大a角度
“(s) 使用s倍增当前长度。默认步幅尺寸缩放
!(s) 使用s倍增当前厚度。默认厚度缩放
;(s) 使用s倍增当前角度。默认角度缩放
_(s) 使用s倍细分前长度。默认步幅尺寸缩放
?(s) 使用s细分当前宽度。默认厚度缩放
@(s) 使用s细分当前角度。默认角度缩放
‘(u) 按u值递增颜色索引值U。默认UV Increment的第一个参数
#(v) 按v值递增颜色索引值V。默认UV Increment的第二个参数
% 切掉剩余的枝干
$(x,y,z) 旋转 turtle ,使向上矢量为(0,1,0)。
[ 开启一个分支
] 结束一个分支
{ 开启一个多边形
. 创建一个多边形顶点
} 封闭一个多边形
g(i) 创建新的Primitive组,之后的几何体会被添加到其上,i是组的前缀。
a(attrib, v1, v2, v3) This creates a point attribute of the name attrib. It is then set to the value v1, v2, v3for the remainder of the points on this branch, or until another a command resets it. v2 and v3 are optional. If they are not present, an attribute of fewer floats will be created. The created attribute is always of float type and with zero defaults. For example, the rulea(“Cd”, 1, 0, 1)added to the start of the premise will make the L-system a nice pugnacious purple.

Use modeled geometry in an L-system

Houdini可以让你在turtle’的位置处,使用特定命令,创建一个几何体的副本。你可以使用此在一个L-system灌木丛上创建叶子,花。

连接几何体的输出端到你想要的L-system节点的输入端。

在 turtle 命令中,使用相应的命令( J , K ,或M)来嵌入几何体。

Input Turtle command
1 J
2 K
3 M

Example

如果你连接一个叶子曲面到L-system的Input1,花连接到Input2,你可以使用下面的来创建一个带有叶子和花的灌木。

Premise A
Rule 1 A= [&FA [fK]] ///// [&FA [fJ]] /////// [&FA [fJ]]
Rule 2 F= S/////
Rule 3 S= F

Advanced L-systems information

标志变量

每个标志都有5个用户自定义的变量和其相关。你可以在表达式中引用或指定这些变量。匹配标志的变量会被实例替换,而被替换的变量会被指定为一个对象。

如,规则 A(i, j)=A(i+1, j-1) 中,其会使用一个新的A替换每个A,在A中,第一个参数i是递增的,第二个参数j是递减的。

指定到几何体标志的参数(如F,+,!)会被解释为几何体。如规则:F(i, j) = F(0.5*i, 2*j) 会再次使用新的F替换每个F,新F包含修改后的参数。除了这些,新F会将长度划分为一半,宽度加倍。

Tip

前一规则中的变量也可以被规则的条件,或几率所引用。如,规则:A(i):i<5 = A(i+1) A(i+1) 会5次加倍每个A的最大值。

随着时间控制长度

要创建一个在每次迭代计算中向前行进x百分比长度的L-System,你需要提前使用一个数值,然后在规则中,通过你想要的百分比来倍增它。

Premise前提条件 A(1)
Rule规则 A(i)= F(i)A(i*0.5)

这里,i是在A被预计算之前被缩放的。重要的部分是前提条件:你需要一个起始值,以便能够缩放它。

使用Stamp()函数修改输入几何体上的变量

第三个参数(JKM)命令会被传输到连接的几何体上。

Tip

你可以使用此技巧来解决只能在一个L-System上连接三个几何体的限制。

创建所有你想要的不同的模型(如两种不同的树叶),连接它们到Switch节点上。设置Switch节点的Select Input参数为:

stamp(“/path/to/lsystem”, “lsys”,0).

连接Switch节点到L-System节点的J输入端。现在你可以使用J(,,leaf_number)嵌入20种叶子中的任何一种。

Example

创建一个Circle节点,设置细分数量为:stamp(“/path/to/lsystem”, “lsys”, 3).

因为,默认细分值为3(表达式中的第二个值),此会创建一个三角形。

连接Circle节点的输出端到L-System节点的J输入端。

在L-System的规则中,你可以使用J(,,number) 将number值传输给J几何体。如J(,,4)会生成一个四边形,J(,,5)生成一个5边形。

在L-System中创建一个组

g命令会将所有几何体放到一个组中。

组的名称是由Funcs选项卡上设置的前缀和一个数字组成的。默认前缀是lsys,产生的组名称会像这样:lsys1。你可以以参数方式将数值指定给g命令。

如,g[F]会将F中的几何体放入到组中。否则默认的索引值会相应递增。

当前组是和分支相关的,所以可以使用像这样的gF [ gFF ] F将第一个和最后一个F放入组0中,中间的分支放入组1中。

要从其父组中排除一个分支,使用g(-1).

Edge rewriting

在植物算法中,很多案例都是使用一个叫边重写的技术,其和左右子脚本相关。典型例子如下:

Generations 10
Angle 90
Premise F(l)
Rule 1 F(l) = F(l)+F(r)+
Rule 2 F(r)=-F(l)-F(r)

但是,Houdini不支持F(1)和F(r)语法。你可以使用标志变量符修改规则。

对于F图形标志,前四个参数是长度,宽度,管道细分数,管道段数。最后一个参数是用户定义的。我们可以定义最后一个参数,0表示左侧,1表示右侧。

Generations 10
Angle 90
Premise F(1,1,3,3,0)
Rule 1 F(i,j,k,l,m) :m=0 = F(i,j,k,l,0)+F(i,j,k,l,1)+
Rule 2 F(i,j,k,l,m) :m=1 =-F(i,j,k,l,0)-F(i,j,k,l,1)

两次生成后,其会产生:Fl+Fr+-Fl-Fr  。其和这个字符串F+F+-F-F没有任何区别。

另外一种方法是使用两个新的变量,并且在最后一个步幅上使用条件语句将其转为F。

b ch(“generations”)
Premise l
Rule 1 l:t<b=l+r+
Rule 2 r:t<b=-l-r
Rule 3 l=F
Rule 4 r=F

其会产生下面的输出结果:

Generation String
0 l
1 F
2 F+F+
3 F+F++-F-F+

Limit L-system growth inside a shape

L-system节点的metal-test输入端可以让你生成一些规则,其会在L-system达到一定的边形态时,停止增长,就像修剪后的灌木效果。

创建一个变形球,或合并后的变形球,其定义一个体积,L-system只能在这个体积内生长。

连接变形球节点到L-system节点的meta-test输入端。

使用条件语句(:)来测试。

Example

Premise FA
Rule 1 A: in(x,y,z) = F [+FA] -FA : 80
Rule 2 A: ! in(x,y,z) = A%

L-system 会检查下一次的增长是否在变形球的边界框内,如果不在,他会裁切掉当前的分支。

规则1会执行80%的时间(分支在变形球边界框内的时间)。

当分支不在变形球边界框内时,会执行规则2.        %命令会结束分支的创建。

Note

如果L-system的起点不在变形球的封套内,它会保持不变。一旦你设置好了L-system和变形球,确保一起变换它们,这样L-system不会突然的移动到变形球外部。

Arrange geometry instances with L-systems

L-System对于排列模型几何体是一个强大的工具。通过将一个L-system作为Cop SOP节点的模板输入端,你可以将模型副本放置到L-system的每个点上。

如,你可以使用基本的L-system中的弧度范围将一系列球体以圆弧,或圆方式排列。这可以让你参数化的控制球体弧线的间隔。

Further reading

如果你对创建L-system兴趣很深,你应当找到这本书:

The Algorithmic Beauty of Plants by Przemyslaw Prusinkiewicz and Aristid Lindenmayer (1996, Springer-Verlag, New York. Phone 212.460.1500. ISBN: 0-387-94676-4)

它的主题是关于一些定义性东西。包含了很多L-system案例的思想以及理论(关于创建真实植物生长的)。

Speed up calculations

有时候使用单个L-system构建像整颗树这样的模型会导出碰撞分辨率的计算变成单线程的。Wire Solver节点会查找可被独立解算的线物体,然后细分成可用的核心数量。一个大的L-system意味着其不可能将其细分成很多小的工作单位。

试着使用Wire Glue Constraint DOP节点将点约束在L-system上(在分支连接在树根的位置处),将点约束到它的世界空间中。此会导致Wire Solver查看分离的枝干,把它看成不同的块,这样就可被独立解算了。因为被约束的点不会移动,枝干的任何运动都不会影响其它枝干。如果可能,减少线物体上的点也可以加快计算。

Parameters

Geometry

Type 当turtle 移动时,要创建的几何体类型。

Tip

你可以使用一个Polywire SOP从L-system中创建管状体路径

Skeleton Draw polylines. 绘制多边形线
Tube Draw tubes. 绘制Tube
Generations 重计算规则的次数。如果你指定一个小数点值,以及开启了Continuous angles或Continuous length 选项,Houdini会使用最后一次替换对象缩放生成的几何体
Start Position 此是用于turtle的起始点位置。
Random Scale 如果非0,会随机的缩放所有被F指定的,以及其它类似turtle函数指定的长度。
Random Seed 用于随机数量生成器的种子值
Continuous Angles 如果设置了,被上一次迭代计算旋转的角度会e币此数量值缩放。
Continuous Length 如果设置了,被上一次迭代计算长度值会被此数量值缩放。
Continuous Width 如果设置了,被上一次迭代计算宽度值会被此数量值缩放。
Apply Color 如果设置了,L-system会在每个点上输出颜色属性。沿着值会通过查找图像文件中UV位置处的颜色信息来获取。当前UV会随着 ‘  和 #操作发生改变。
Image File 用于运用颜色操作的图像文件。图像文件会被函数选项卡下的pic()表达式使用。
UV Increment 此定义默认的UV递增值。
Point Attributes 如果类型是骨骼,此才可用。开启此项,会导致很多点属性被创建,用于跟踪每个点是如何生成的。

width 已经生成的tube的宽度。
segs tube上段的数量
div tube会被细分该数量的段数
lage 从根到树上的垂直递增值。此会被Tube的Vertical Increment 参数所影响。它和arc类似,但是不是基于边的长度。
arc 从根到此点的弧长长度
up 此点处turtle的向上矢量
gen 会创建此点的迭代次数

Tube

Rows 将tube细分为的行数量。值为3会使tube被扫描为三角形
Cols 将tube细分为的列数量。值为4,意味着一个F会创建4个横截面。
Tension tube扫描到目标点处的弯曲度
Branch Blend 新枝继承旧枝方向的程度
Thickness 默认的tube的宽度
Thickness Scale !操作对厚度的影响程度
Apply Tube Texture Coordinates 如果勾选,tube会生成UV纹理坐标
Vertical Increment 每个Tube会递增V纹理坐标的数量

Values

Step Size 一个移动的默认尺寸,如F命令
Step Size Scale 被“命令使用的数量
Angle 用于一个角度的默认角度,如/命令。此也可以是表达式中的变量
Angle Scale ;命令所使用的数量
Variable b 表达式变量b的数值
Variable c 表达式变量c的数值
Variable d 表达式变量d的数值
Gravity T命令中,趋向性的数量。也可以是表达式变量T的值
Number Of Variables 此multiparm允许指定任意数量的表达式变量
Variable Name 表达式变量的名称
Variable Value 表达式变量的数值

Funcs

Pic Image File pic()表达式函数所使用的图像文件
Group Prefix 被g命令使用的前缀
Channel Prefix 被 chan() 函数使用的前缀
Leaf Param A 这是stamp参数的名称,用于stamp处理叶子。stamp值来源于J,K、M 操作。 其可以使用stamp()函数向上游读取。
Leaf Param B 这是stamp参数的名称,用于stamp处理叶子。stamp值来源于J,K、M 操作。 其可以使用stamp()函数向上游读取。
Leaf Param C 这是stamp参数的名称,用于stamp处理叶子。stamp值来源于J,K、M 操作。 其可以使用stamp()函数向上游读取。

Rules

Read Rules From File 如果设置了此,规则会被忽略,而是从一个规则文件读取规则。
Write Rule Parameters to File 此会输出当前规则到一个规则文件中
Rule File 用作规则源文件的文件名。
Context Ignore This is a list of symbols. They will be ignored when trying to determine contexts.
Context Includes Siblings By default, the context of each branch only includes the symbols in that branch. Any sub-branches or parent branches will be skipped over. Given the rule A>B=F, A[B]will not resolve as B is in a sub-branch.A[Q]B will resolve because the [Q] is ignored. If you change the Context Ignore to have [], this effect is removed and A[Q]Bwill not resolve but A[B] will. The Context Includes Siblings flag restores the pre-Houdini 10 behavior of context of sibling branches being included. For example,[A]Q[B] will resolve if this flag is set, but not resolve if it is not set.
Premise L-system的初始状态。此是在0迭代计算时,L-system的状态。
Rule # 运用到L-system上的规则。运用切换会禁用规则,从生成程序中移除它。

Inputs

Leaf J,K & M 此几何体会被J, K &、M规则所使用
Meta Test Input 此几何体会被in() 函数所使用,定义边界区域

Local variables

a 角度参数的数值
b b参数的数值
c c参数的数值
d d参数的数值
g 当前规则的年龄,初始为0
i 当前L-system字符串命令的偏移(规则会在偏移处被应用)
t 迭代计算数量
x, y, z 空间中turtle 的位置
A 从根到当前点处的弧长
L 在点处长度的递增值
T 重力参数值
U 颜色贴图的U值
V 颜色贴图的V值
W 在当前点处的宽度
点击分享到: