L-System
Version 1.00
Synopsis:
L-System is a 3DS Max object plugin built on the core algorithms from
an old DOS program called, LParser, originally written by Laurens Lapre.
The technology is based upon the work of P. Prusinkiewicz and A. Lindenmayer
(Lindenmayer is the "L" in L-Systems) and is a really interesting way to
investigate simulated plant growth and self similar fractals. The plugin
can be used to create and edit a universe of plants and animals as well
as some very interesting shapes and geometries.
Motivation:
We needed to be able to animate plant growth. Unfortunately,
the plugin wasn't done it time and wasn't used.
Installation:
Just
put this plugin in your 3DS Max plugin path or use the "Configure Paths"
dialog to add the location of the plugin to your plugin path. See
the Max docs for more help. The object can be found in the create
panel, with the geometry button selected, by selecting "Blur's Objects"
from the sub-category dropdown list.
Usage:
Basic Concepts:
-
The L-System is the recursive growth model that makes up the L-System Object
(geometry).
-
The L-String is defined by "rules" in a small text file (ls-file) and contains
the Turtle Commands for the growth of the L-System.
-
The Turtle Commands are 3D commands like, Move, Rotate, Draw, etc. and
are represented as characters in the L-String.
-
The Turtle is this imaginary object in 3D space that moves and draws the
elements of the L-System based upon the Turtle Commands in the L-String.
-
Each Turtle Draw Command creates a building block that makes up the geometry
of the L-System object.
-
The "rules" in the ls-file are recursively evaluated to automatically generate
the L-String.
-
You never deal directly with the L-String. You only deal with the
"rules" in the ls-file and the L-System Object.
-
At it's easiest level, you just open ls-files and spin spinners to play
with the growth of the objects :-)
Create:
In the Create Panel, Click the L-System button, and in any viewport,
drag to define the size of the object.
Parameters:
Size:
Animatable - controls the size of the object. This isn't the
overall size (like a bounding box) because the eventual size of the object
is really determined by how much it grows. This just gives you a
scaling parameter that you can work with if you want.
Recursion:
Animatable - this is your growth control. In a tree L-System
that is written properly, this parameter can be animated to make the tree
grow from a seedling to an old tree.
Basic Angle:
Animatable - the L-System has a base angle that is used and modified
over and over again in the interpretation of the L-String. The angle
parameter can be used to coil and uncoil an L-System object.
Thickness:
Animatable - Thickness is, of course, how thick the object is.
The value is a percentage of the height of the basic building block.
Min Thickness:
Animatable - in the L-System object, object's can scale down as they
grow - this paramter keeps the pieces from getting thiner than you may
want.
Seed:
The L-System can be told to grow in random directions. This parameter
is the seed for those random values. Using it, you can create one
tree L-System, and turn it into a forest of similar, but unique trees.
Generate Closed Form:
The building blocks of the L-System can either be individual blocks
(an open form) or strung together as cylinders (a closed form).
Open:
Opens and evaluates a new L-String. There are several example
L-Strings included from the original LParser distribution.
Edit:
Edit opens an editor window so you can work with and evaluate L-Strings.
Generate UVW Mapping:
Not implemented. Mapping coords are not applied, by default to
the object.
Notes on the Editor:
-
This is not finished - if you use the Open Button in the UI, the Editor
doesn't update properly.
-
L-Strings in the Editor do not update the scene geometry until you select
Evaluate (either the button or the menu.)
-
The editor lets you load and save L-Strings, but the L-System in the scene
does not update until you evaluate the L-String.
-
The L-Parser engine does not allow white space in the L-Strings.
-
The first 3 non-comment/whitespace lines in the L-String are the default
recursion, angle, and thickness. These reset the UI's values when
you evaluate.
-
The current, supported L-String Syntax is as follows:
L-System Turtle Commands
|
Drawing commands |
when {} structure command is
active |
F |
move forward and draw full length |
record vertex |
F(x) |
move x forward and draw |
record vertex |
Z |
move forward and draw half length |
record vertex |
Z(x) |
move x forward and draw |
record vertex |
Note: |
F = F(100) = Z(100)
Z = F(50) = Z(50) |
|
|
Movement commands |
when {} structure command is
active |
f |
move forward with full length |
record vertex |
f(x) |
record vertex |
move x forward |
z |
move forward with half length |
record vertex |
z(x) |
move x forward |
record vertex |
g |
move forward with full length |
don't record vertex |
g(x) |
move x forward |
don't record vertex |
. |
don't move |
record vertex |
|
|
|
Orientation commands |
+ |
turn left (counter clockwise) around
the turtle's local X vector |
+(x) |
turn x degrees left (counter clockwise) around the turtle's
local X vector |
- |
turn right (clockwise) around the turtle's
local X vector |
-(x) |
turn x degrees right (clockwise) around the turtle's local
X vector |
& |
pitch right (clockwise) around the turtle's
local Y vector |
&(x) |
pitch x degrees right (clockwise) around the turtle's local
Y vector |
^ |
pitch left (counter clockwise) around
the turtle's local Y vector |
^(x) |
pitch x degrees left (counter clockwise) around the turtle's
local Y vector |
< |
roll left (counter clockwise) around
the turtle's forward (Z) vector |
<(x) |
roll x degrees left (counter clockwise) around the turtle's
forward (Z) vector |
> |
roll right (clockwise) around the turtle's
forward (Z) vector |
>(x) |
roll x degrees right (clockwise) around the turtle's forward
(Z) vector |
|
|
|
Special Orientation
commands |
|
| |
turn 180 degrees around X vector
- ie. turn around and face backwards. |
% |
roll 180 degrees around the turtle's forward (Z) vector |
$ |
roll until horizontal - (not sure this
works properly) |
~ |
turn/pitch/roll in a random direction |
~(x) |
turn/pitch/roll in a random direction
with a maximum of x degrees |
t |
correction for gravity with 0.2 |
t(x) |
correction for gravity with x |
|
|
|
Structure commands |
|
[ |
push current state (size, position, alignment)
of the turtle onto the stack |
] |
pop current state (size, position, alignment) of the turtle
off of the stack |
{ |
begin polygon drawing mode. Draws
one face at a time. |
} |
end polygon drawing mode. |
|
|
|
Size/Angle/Thickness
commands |
|
" |
increment the turtle's current size (length)
with 1.1 |
' |
decrement the turtle's current size (length) with 0.9 |
"(x) |
multiply the turtle's current size (length)
with x (same as '(x)) |
; |
increment the turtle's current default rotation angle with
1.1 |
: |
decrement the turtle's current default
rotation angle with 0.9 |
:(x) |
multiply the turtle's current default rotation angle with
x (same as ;(x)) |
? |
increment the turtle's current thickness
with 1.4 |
! |
decrement the turtle's current thickness with 0.7 |
?(x) |
multiply the turtle's current thickness
with x (same as !(x)) |
|
|
|
Additional commands |
|
c |
increment material id (color index) |
c(x) |
set material id to x |
@ |
end of object description |
|
Reference Material:
To
Be Done:
Lots of stuff. There a still a lot of bugs in this and I have
a wishlist that's a mile long. If anyone is interested in continuing
development on this, let me know. I am considering open sourcing
this and attempting a collaberative development on it, but I want to be
sure there is some interest first. I think it's a really cool project
and would like to continue with the generosity of the those that originated
the basics of the plugin. NOTE: a few of the ls-files cause
problems - some crash the plugin. These ls-files have been included,
but have been renamed to *.ls.dead so that they won't be accidentally loaded.
General:
The
usual disclaimers apply - Blur studio cannot support or guarantee this
thing in any way. Its gratis - enjoy. If you have any comments or questions,
direct them to blurbeta@blur.com - If we have the time, we'll do what we
can. See also: the
license agreement.
our
generic readme, this
plugin's current bug list.
You
may not distribute this without permission from blur studio.
If
you use it, your company has cool T-Shirts, and your looking for a way
to show your gratitude, send a shirt or two to:
R&D
at Blur Studio, Inc.
1130
Abbot Kinney Blvd.
Venice,
CA 90291
software@blur.com
Scott
Kirvan - Blur.
Last
Modified : 09/29/99