Legal information
Installation
Quick start
Parameters:
BASIC
obj_pos
TraceLevel
SceneStartClock
SourceID
PreviewMode
MainColor
SmokeDens
TIME SIMULATION
FramesElapsed
SplineFile
SplineClockStart
SplineClockStop
TRAIL SPECIFIC
SmokeDelay
TrailLength
SIZE SPECIFIC
InitialSize
MaxSizeInc
MaxFinalSize
EMISSION SPECIFIC
InitEmiss
MinEmiss
MaxEmiss
Trend
APPEARANCE SPECIFIC
Roughness
MinSamples
StartTurb
TurbIncRate
CastShadows
WIND, ROTATION & ASCENSION
ConstAscendRate
MaxRandAscend
WindDirection
WindStrength
ConstRotation
MaxRandRot
DanceStrength
DanceRate
EFFECTS
RotationCenter
SmokeMass
EXTRA
SecondaryColor
1. SmokeGen is postcardware and thus free to use, copy and modify, provided that you send a postcard to the address specified below. Try to find a postcard with a motive that's as typical for your hometown(or area) as possible! :-)
2. SmokeGen may not be sold or used commercially without permission by the author.
Send your postcard to:
Mikael Carneholm, SA4
IDA
Högskolan i Borås
Allégatan 1
501 90 BORÅS
SWEDEN
POV-Ray(tm) and Persistence of Vision(tm) are registered trademarks of the POV-Ray Team(tm)
Extract all the files contained in the root of the zipped file to one of the directories (folders)
in your POV-Ray
library path (as for example, the default include directory). If you
don´t know what they
are, open your POVRAY.INI. If you have a PC running Windows95/98 or
WindowsNT, they
probably look something like this:
Library_Path=C:\POV-Ray for Windows\include
If you want to try the examples, also extract the example files with
their full paths
to a directory of your choice (if using pkunzip in DOS mode, type "pkunzip
-d smokegen.zip" to extract with full paths).
The most basic usage is to just declare one variable, called obj_pos and thereafter include the SmokeGen.inc file.
Example:
#declare obj_pos=<0,0,clock*20>;
#include "SmokeGen.inc"
That´s it! The SmokeGen include file (and POV-Ray) takes care
of the rest, and smoke will
follow the car, airplane, rocket etc.
The variable obj_pos is the postition of the object that is generating
the smoke. I.e, if
you have an object that you want to animate, declare some clock dependant
conditions that
control the value of the variable, and then make your object translate
with that value.
This way, the smoke "derives" the position from the object automatically.
Example:
#if( (clock>=0) & (clock<0.5))
#declare obj_pos=<0,0,clock*20>;
#end
#if( (clock>=0.5) & (clock<1.0))
#declare obj_pos=<0,clock*20,10>;
#end
.
.
object
{
your_object //previously declared in
the file
translate obj_pos
}
#include "SmokeGen.inc"
NOTE: The main thing is, obj_pos must be declared before SmokeGen is included.
obj_pos
Type: Vector
This is the most important variable in SmokeGen, as it controls:
1. If a smokesource is active
2. Where it is located
As long as obj_pos is declared, smoke will be generated at (from) that
position. Once generated, it will live as long as the parameters tells
it (and SmokeGen.inc is included). Example:
#if(clock<0.5)
#declare obj_pos=<5,0,0>;
#end
#include "SmokeGen.inc"
This will create a smoke source that is active at position <5,0,0> while clock is less than 0.5. After this, the smoke will live on and ascend, rotate etc. as long the parameters allows it to exist.
TraceLevel (Previously
called MxTrLvl)
Type: Integer
A little "bug" in POV-Ray is the black artifacts that can appear when
light passes though
many media objects along its way. This phenomenon is illustrated below.
To correct this, use this variable to get rid of the artifacts. This
may vary from scene to
scene depending on how many objects the camera looks "through", but
if you at some
point have [n] smoke elements with smoke
density [m] along an imaginary straight line
from the camera, you will need a trace level of [2*n*m+1].
Note: It's not necessary to do this calculation. If you get black artifacts
in your scene, just
increase TraceLevel until the artifacts disappear.
Example of insufficient TraceLevel
(Black artifacts visible)
Problem solved by increasing TraceLevel
(No more visible artifacts)
SceneStartClock
Type: Numerical
This value is used to re-write the files that SmokeGen reads/writes,
and it´s important
that you give this variable the same value as the Initial_Clock (+KI).
If you don´t,
you may experience "ghost smoke" from previous runs.
SourceID
Type: Integer
When doing an animation you may want the smoke from one source to drift
away in one direction, smoke from another to to drift away in the opposite
direction and a third should stop generating smoke halfway through the
animation(while not stopping the smoke already generated by that source
from drifting away in the same direction as previously). To do this, SmokeGen
must know which smoke from what source to affect when you call it. This
is done by declaring different source ID:s for different sources, and including
SmokeGen once for each source in the scene.
Also note that the first source doesn´t need to be ID:d, as it is always considered as source 1.
PreviewMode
Type: Integer
Since media (previously called halo) can take long time to render,
there are 2 preview
modes that renders the elements as:
1. spheres with gradient pigments ("wireframes")
2. spheres with plain pigments
If you need to see the rotation of the smoke, use mode 1. If not, use
mode 2. (Mode 0 is
"real" mode, with smoke rendered using media.)
[PreviewMode=0]
[PreviewMode=1]
[PreviewMode=2]
MainColor
Type: Vector
This vector describes the main color of the smoke, the one that is
emitted with the intensity
of the emission value. Any 3-dimensional color vector will do, except
<0,0,0> that will produce invisible smoke.
Note: To achieve black smoke, use <-1, -1, -1>
[MainColor=<0,0,1>]
[MainColor=<0,1,1>]
[MainColor=Red]
SmokeDens
Type: Integer
Accepted values: 1-10
To control the density of the smoke, increase/decrease the value of
this variable. (Note the relation SmokeDens<->TraceLevel, described
in TraceLevel.)
Also note that when increasing density, the rendering time increases
about the same amount....
[SmokeDens=1]
[SmokeDens=5]
FramesElapsed
Type: Integer
To simulate elapsed time, you can use this variable to generate smoke
that has been created during x amount of time (n number of frames). This
means, if you set FramesElapsed=10, you will see 11 smoke elements on the
first frame (10 elements created by the previous frames).
There are two "modes" when using time simulation:
Mode 1 is the "static source" mode, i.e obj_pos is constant during all "frames", and wind and other translating effects is used to achieve some sort of smoke pillar.
Mode 2 is the "spline trail" mode, where a spline file is used to define the positions through time (useful when animating an object that moves along a spile curve). Note: currently, this mode requires that splines are defined using Chris Colefax's Spline generator include. The segment of the curve that should be "filled" is defined by SplineClockStart and SplineClockStop, going from SplineClockStart to SplineClockStop with a density of [FramesElapsed] number of elements.
To use mode 1, just declare FramesElapsed and leave out either one of
SplineFile, SplineClockStart, SplineClockStop.
To use mode 2, declare SplineFile, SplineClockStart and SplineClockStop
as well as FramesElapsed.
SplineFile
Type: String
This variable tells SmokeGen the name of the file that defines your
spline curve. This file has to be of the type that is used by Chris
Colefax's Spline
generator include, i.e, it has to return the vector spline_pos in order
to work. (An example would be SplineFile="MySpline.spl")
SplineClockStart
Type: Float
SplineClockStart defines where on the spline curve the elements starts
to be generated - to use the very start of the curve, use SplineClockStart=0.
SplineClockStop
Type: Float
SplineClockStop defines where on the spline curve the elements stops
to be generated - to use the very end of the curve, use SplineClockStart=1.
SmokeDelay
Type: Integer
SmokeDelay determines the position in the position history where the
smoke starts appearing. Generally, smoke appears a bit behind the object,
not
right where it is "at the moment". Use this variable to determine the
distance.
TrailLength
Type: Integer
This can be used to cut off a trail at a desired length. Below are
two animations showing the difference between using TrailLength and not
using TrailLength.
[NoTrailLength used]
[TrailLength=10]
InitialSize
Type: Numerical
Determines the initial size(radius) of each smoke element.
MaxSizeInc
Type: Numerical
Determines how much each element can grow from frame to frame, in pov
units. For example: with MaxSizeInc set to 0.5, an element with a size
of 0.5 at frame one will at most have a size of 1.0 at frame two.
MaxFinalSize
Type: Numerical
Constrains how much the elements can grow. When an element reaches
this size, it will no longer grow with the amount determined by MaxSizeInc.
Emission is the property that is refered to as opacity in some programs. Formula is [E=InitEmiss+Trend*FrameCount]
InitEmiss
Type: Numerical
This variable controls the initial emission(opacity)
of the smoke. See the images below for demonstration.
[InitEmiss=0.5]
[InitEmiss=1.0]
[InitEmiss=2.0]
[InitEmiss=5.0]
MinEmiss
Type: Numerical
This variable determines the minimum emission an element can
reach, when using Trend to alter the emission over
time. (If MinEmiss is set to 0, the elements will fade out totally) Below
are two example animations that demonstrates the difference between MinEmiss=0.5
and MinEmiss=0.
NOTE: MinEmiss must be less than InitEmiss for Trend to have effect.
MaxEmiss
Type: Numerical
This variable works like MinEmiss, just the
other way around. It controls the maximum emission an element can
reach, when using Trend to alter the emission of the
elements over time.
NOTE: MaxEmiss must be more than InitEmiss for Trend to have effect.
Trend
Type: Numerical
The Trend variable determines the development of the emission over
time. A positive value makes the emission increase, while a negative value
makes the emission decrease. An example: if Trend=0.1, the emission will
increase by 0.1 units/frame. Likewise, if Trend= -0.1, the emission will
decrease by 0.1 units/frame.
[Trend=0.1] (Positive)
[Trend=-0.1] (Negative)
Roughness (Previously
called Pulverization)
Type: Integer
Accepted values: 1-10
This variable can be used to change the appearance on the rough/fine
scale, as illustrated below. This is useful specially when using SmokeGen
for generating other effects than smoke.
[Roughness=10]
[Roughness=1]
MinSamples
Type: Integer
Especially when the smoke elements are scaled high, a certain level
of "grainyness" starts to appear. This is due to the minimum number of
samples that is set default in SmokeGen. To avoid this, increase the value
of MinSamples (default value is 1).
Note: The larger number of samples, the slower the rendering. Thus, do not set this larger than default if not necessary.
[MinSamples=low]
[MinSamples increased]
StartTurb
Type: Numerical
Use this variable to control the initial turbulence in the elements,
that is, the turbulence right after the element has been created. Below
are some illustrations of various degrees of turbulence:
[0]
[0.5]
[1.0]
[1.5]
[2.0]
[2.5]
[3.0]
[3.5]
TurbIncRate
Type: Numerical
TurbIncRate controls how fast the turbulence increases over time. [TurbIncRate=0.1]
makes the turbulence increase 0.1 units/frame. Turbulence is important
to get that realistic modularization of the smoke (=twisting&fading
at the same time).
This can be an alternative(or complement) to using Trend
to achieve a fading effect.
[Usage of TurbIncRate to achieve a fading effect]
CastShadows
Type: Boolean
The smoke can be made to cast shadows or not. [CastShadows=true]
or [CastShadows=1] will make the smoke cast shadows, while [CastShadows=false]
or [CastShadows=0] will turn shadows off.
[CastShadows=true]
[CastShadows=false]
ConstAscendRate
Type: Numerical
This variable controls the constant movement of the elements in the
Y axis. For example, [ConstAscendRate=0.3] means each
element will be translated 0.3 units per frame in the positive Y direction.
To get a realistic smoke effect, add some random movement as well by using
MaxRandAscend.
MaxRandAscend
Type: Numerical
MaxRandAscend controls the random ascension of the elements. For example,
[MaxRandAscend=0.2]
means
that the maximum random translation in the positive Y direction will be
0.2. Normally, MaxRandAscend should be used in addition to ConstAscendRate
as a "spice" to achieve a more realistic behaviour of the smoke.
WindDirection
Type:Vector
This vector describes the direction of a (constant) wind that it blowing
in your scene and thus affecting the smoke. Following this package you
should find the file "DefWinds" containing 8 pre-declared winddirections
(N,NE,E,SE,S,SW,W,NW), made with the definition Z+ =North, X+ =East, Z-
=South and X- =West.
NOTE: For the wind to have effect, a WindStrength
has to be declared.
Example 1: (using the default winds)
#include "DefWinds"
#declare WindDirection=N;
Example 2: (declaring your own wind direction)
#declare WindDirection=<0.3, 0, 0.8>;
[Without wind]
[With wind]
WindStrength
Type:Numerical
For a WindDirection to have effect, a
WindStrength also has to be declared. For example, if you declare WindDirection=N
(which equals <0,0,1>) and give WindStrength the value of 0.3, the total
wind will be blowing with <0,0,0.3> units/frame.
Formula is [total wind=WindDirection*WindStrength]
ConstRotation
Type: Numerical
This variable controls the constant rotation of the smoke. The value
determines the number of degrees each element rotates each frame, i.e [ConstRotation=5]
gives 5 degrees rotation per frame. Rotation is useful both for smoke after
moving vehicles and for smoke from static objects. The rotation is done
about the normal between the elements(see illustration below)
Below are two animations that show the same scene, one where rotation
is used and one where no rotation is used.
(Note: Both scenes use MaxSizeInc to achieve a slight growing effect,
which is what makes the smoke "live" in the no-rotation scene.)
MaxRandRot
Type: Numerical
Apart from using constant rotation, some
random rotation can also be used. Type of rotation is the same as for the
constant type, i.e degrees per frame about the normal between the elements.
General info: New to version 1.2, is DanceStrength and
DanceRate that can be used to create a wriggling, winding effect.
The effect depends on the WindDir
vector, i.e the "dancing" will be in the (+/-)WindDir direction.
DanceStrength
Type: Numerical
DanceStrength determines the width of the oscillation, in POV units.
Be careful though, as the distance accumulates for each full oscillation
cycle. Good starting values could be 0.001 to 0.01 (dependant on scene
scaling of course).
[DanceStrength=0.006]
[DanceStrength=0.012]
DanceRate
Type: Numerical
DanceRate controls the time between each oscillation peak, i.e the
number of peaks during a period of time. A high value thus gives
a slow oscillation, while a low value gives a quick oscillation.
[DanceRate=10]
[DanceRate=1]
RotationCenter
Type: Vector
RotationCenter defines the point that the object
is rotating about. For example, if you declare a cube at <0,0,0>, rotate
it about <0,0,0> and then translate that object to <0,3,1> it will
appear to be rotating about <0,3,1>. Thus, declare RotationCenter as
<0,3,1>.
SmokeMass
Type: Numerical
To control how far away the smoke will be thrown, use SmokeMass. A
higher value gives long distances, while a low value gives short distances.
Note: The distance is depending on how fast the object is rotating, as
well. Formula is [angle*mass]
[Low SmokeMass]
[Higher SmokeMass]
SecondaryColor
Type: Vector
As an option, the secondary color of the media
contained within the elements can be controlled by SecondaryColor.
[SecondaryColor=<0,0,1>]
Glossary:
Smoke element: A sphere that is used
as a container for the media.
© Copyright Mikael Carneholm 1999