NAME
structure-synth - application for creating 3D structures
SYNOPSIS
structure-synth
DESCRIPTION
Structure Synth is an application for creating 3D structures from a set
of user specified rules. The resulting structures can be viewed in the
integrated OpenGL viewer or exported to various formats. The program
was inspired by the CFDG syntax by Chris Coyne, and the Context Free
GUI by Mark Lentczner and John Horigan.
STATES, TRANSFORMATIONS AND ACTIONS
Structure Synth is all about states. A state describes the current
coordinate system and the current coloring mode. The coordinate system
determines the position, orientation and size of all object drawn while
in the current state.
States are modified by transformations. For instance we can move the
coordinate system one unit in the x-direction by applying the
transformation: { x 1 }. Similarly we can rotate the coordinate system
90 degrees about the x-axis by applying:{ rx 90 }. States are
automatically combined while parsing, that is { x 1 x 1 } is equal to {
x 2 }.
States can be combined with rule calls to create actions. { x 2 } box
is an example of a transformation followed by a rule call. ’box’ is a
built-in rule. Not surprisingly, this rule draws a box located at
(0,0,0) -> (1,1,1) in the current coordinate system.
Iterated actions:
It is possible to apply iterated actions, this is done using the
multiplication symbol: for instance 3 * { x 2 } box would be equal to
creating three actions:
{ x 2 } box
{ x 4 } box
{ x 6 } box
Color transformations:
Similar to the spatial transformations it is also possible to transform
the current rendering color. Structure Synth uses HSV (Hue, Saturation
and Value) for representing colors - this is perhaps not as familiar as
the RGB color model, but offers a slightly more intuitive
representation once you get used to it (at least that is what some
people claim - personally I still find it easier think in terms of red,
green and blue components). The color transformations are applied using
the ’hue’, ’saturation’ and ’value’ operators.
The next example demonstrates both iterated actions and color
transformations to draw a nice color cube:
10 * { x 1 hue 36 } 10 * { y 1 sat 0.9 } 10 * { z 1 b 0.9 } box
Here is another example demonstrating different kinds of
transformations:
10 * { x 2 } box
1 * { y 2 } 10 * { x 2 rx 6 } box
1 * { y 4 } 10 * { x 2 hue 9 } box
1 * { y 6 } 10 * { x 2 s 0.9 } box
Built-in rules:
The Box is an example of one the primitives - built-in rules - in
Structure Synth. The other built-in rules are: Sphere, Dot, Grid, Line,
Cylinder, Mesh, CylinderMesh.
MAKING RULES
Custom rules are the key to creating complex and sophisticated
structures. Rules are created using the ’rule’ keyword. A rule can used
the same way as any built-in primitive. The most important aspect of
rules are, that they are able to call themselves. Take a look at the
following example:
R1
rule R1 {
{ x 0.9 rz 6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
Notice that this rule recursively calls itself. It would never
terminate - however Structure Synth has a default maximum recursion
depth of 1000 recursions. This value can be changes using the ’set
maxdepth xxx’ command. Another way to force termination would be using
the ’set maxobjects xxx’ keyword, which makes Structure Synth keep
track of the number of objects drawn.
Adding some randomness:
Now, in order to things interesting, we will probably want to create
something less static - by adding some randomness. In Structure Synth
this is achieved by creating multiple definitions for the same rule:
R1
rule R1 {
{ x 0.9 rz 6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
rule R1 {
{ x 0.9 rz -6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
Notice the ’R1’ rule has two definitions. Now, whenever the Structure
Synth builder needs to call the ’R1’ rule, it will choose one of the
definitions at random.
REFERENCE
Actions:
Termination criteria:
set maxdepth [integer]:
Breaks after [integer] iterations (generations). This will also
serve as a upper recursion limit for all rules.
set maxobjects [integer]:
After [integer] objects have been created, the construction is
terminated.
Other:
set seed [integer]:
Allows you to set the random seed. This makes it possible to
reproduce creations.
set background [color]:
Allows you to set the background color. Colors are specified as
text-strings parsed using Qt’s color parsing, allowing for
standard HTML RGB specifications (e.g. #F00 or #FF0000), but
also SVG keyword names (e.g. red or even lightgoldenrodyellow).
Rule modifiers:
md / maxdepth [integer]:
Rule Retirement.Sets the maximum recursive for the rule. The
rule would not execute any actions after this limit has been
reached.
md / maxdepth [integer] > [rulename]:
Rule Retirement with substitution.Sets the maximum recursive for
the rule. After this limit has been reached [rulename] will be
executed instead this rule.
w / weight [float]:
Ambiguous rules.If several rules are defined with the same name,
a random definition is chosen according to the weight specified
here. If no weight is specified, the default weight of 1 is
used.
Transformations:
Geometrical transformations:
x [float]:
X axis translation. The float argument is the offset measured in
units of the local coordinate system.
y [float]:
Y axis translation. As above.
z [float]:
Z axis translation. As above.
rx [float]:
Rotation about the x axis. The ’float’ argument is the angle
specified in degrees. The rotation axis is centered at the unit
cube in the local coordinate system: that is the rotation axis
contains the line segment from (0, 0.5, 0.5) -> (1, 0.5, 0.5).
ry [float]:
Rotation about the y axis. As above.
rz [float]:
Rotation about the z axis. As above.
s [float]:
Resizes the local coordinate system. Notice that the center for
the resize is located at the center of the unit cube in the
local system (at (0.5,0.5,0.5)).
s [f1] [f2] [f3]:
Resizes the local coordinate system. As above but with separate
scale for each dimension.
m [f1] ... [f9]:
Applies the specified 3x3 rotation matrix to the transformation
matrix for the current state. About the argument order:
[f1],[f2],[f3] defines the first row of the matrix.
fx: Mirrors the local coordinate system about the x-axis. As above
the mirroring planes is centered at the cube.
fy: Mirrors the local coordinate system about the y-axis.
fz: Mirrors the local coordinate system about the z-axis.
Color space transformations:
h / hue [float]:
Adds the ’float’ value to the hue color parameter for the
current state. Hues are measured from 0 to 360 and wraps
cyclicly - i.e. a hue of 400 is equal to a hue of 40.
sat [float]:
Multiplies the ’float’ value with the saturation color parameter
for the current state. Saturation is measured from 0 to 1 and is
clamped to this interval (i.e. values larger then 1 are set to
1).
b / brightness [float]:
Multiples the ’float’ value with the brightness color parameter
for the current state. Brightness is measured from 0 to 1 and is
clamped to this interval. Notice that parameter is sometimes
called ’V’ or ’Value’ (and the color space is often refered to
as HSV).
a / alpha [float]:
Multiplies the ’float’ value with the alpha color parameter for
the current state. Alpha is measured from 0 to 1 and is clamped
to this interval. An alpha value of zero is completely
transparant, and an alpha value of one is completely opaque.
color [color]:
This commands sets the color to an absolut color (most other
transformations are relative modifications on the current
state). Colors are specified as text-strings parsed using Qt’s
color parsing, allowing for standard HTML RGB specifications
(e.g. #F00 or #FF0000), but also SVG keyword names (e.g. red or
even lightgoldenrodyellow).
Drawing primitives:
box: solid box
grid: wireframe box
sphere:
the round thingy (as of now this primitive has some issues -
e.g. ellipsoids are not working.)
line: along x axis, centered in y,z plane.
point: centered in coordinate system.
triangle:
creates a custom polygon. Specify the coordinates as follows:
Triangle[0,0,0;1,0,0;0.5,0.5,0.5]
mesh: prototype mesh
cylinder:
the symmetry axis will be the current x axis. [Not implemented]
tube: polygonal cylinder (will be drawn smoothly as the coordinate
system transforms). [Not implemented]
Preprocessor commands:
#define varname value:
substitutes every occurrence of ’varname’ with ’value’. Value
may contain spaces.
For Context Free / CFDG users:
The EisenScript syntax in Structure Synth has a lot in common with
CFDG.
There are however a few important differences:
Context sensitivity:
A CFDG script can be viewed as a grammar, where the production
rules are independent of their context - or put differently -
when choosing between rules CFDG does not have any knowledge of
the history of system. This ’Context Free’ property of CFDG was
deliberately omitted in EisenScript, simply for pragmatic
reasons: some structures would be difficult to create without
having some way to change the rules after a certain number of
recursions.
The ’startrule’ statement:
in CFDG startrules are explicitly specified. In EisenScript, a
more generic approach is used: statements which can be used in a
rule definition, can also be used at the top-level scope, so in
order to specify a start-rule, just write the name of the rule.
Termination criteria:
in CFDG recursion automatically terminates when the objects
produced are too small to be visible. This is a very elegant
solution, but it is not easy to do in a dynamic 3D world, where
the user can move and zoom with the camera. Several options
exist in Structure Synth for terminating the rendering.
Transformation order:
in CFDG transformations (which CFDG refers to as adjustments) in
curly brackets are not applied in the order of appearence, and
if multiple transformations of the same type are applied, only
the last one is actually carried out. For transformations in
square brackets in CFDG the order on the other hand is
significant. In Structure Synth the transformation order is
always significant: transformations are applied starting from
the right-most one.
EXAMPLE
Below is an EisenScript sample:
/*
Sample Torus.
*/
set maxdepth 100
r1
36 * { x -2 ry 10 } r1
rule r1 maxdepth 10 {
2 * { y -1 } 3 * { rz 15 x 1 b 0.9 h -20 } r2
{ y 1 h 12 a 0.9 rx 36 } r1
}
rule r2 {
{ s 0.9 0.1 1.1 hue 10 } box // a comment
}
rule r2 w 2 {
{ hue 113 sat 19 a 23 s 0.1 0.9 1.1 } box
}
SEE ALSO
http://structuresynth.sourceforge.net/
April 2009 Structure Synth(1)