home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ray Tracing Box
/
RAY_CD.mdf
/
raytrace
/
rtag
/
rtag.doc
< prev
next >
Wrap
Text File
|
1993-07-08
|
95KB
|
2,083 lines
R T A G
Ray Tracing Animation Generator
A "shareware" program
Phillip H. Sherrod
Member, Association of Shareware Professionals (ASP)
RTAG is a program to facilitate the generation of ray
traced animations. RTAG is not a ray tracing program;
rather, it enables you to generate the appropriate
position of objects to produce an animation using the ray
tracing program of your choice. RTAG compiles a
programming language designed for animation generation.
This programming language contains full arithmetic
expressions, conditional control, looping, I/O, and a rich
set of library functions including spline path generation.
The output of RTAG is a set of files that can be used to
drive ray tracing programs such as POV-Ray, or other ray
tracers, to produce an image for each frame.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Ray Tracing Driver Files . . . . . . . . . . . . . . . . . 1
1.2 Files Produced by RTAG . . . . . . . . . . . . . . . . . . 3
1.3 Auxiliary Programs . . . . . . . . . . . . . . . . . . . . 4
2. Running RTAG . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1 Command Line Options . . . . . . . . . . . . . . . . . . . 6
2.2 The RTAG Animation Control File . . . . . . . . . . . . . . 7
2.3 Arithmetic and Logical Expressions . . . . . . . . . . . . 8
2.3.1 Numeric Constants . . . . . . . . . . . . . . . . . . . 9
2.3.2 Built-in Constant . . . . . . . . . . . . . . . . . . . 10
2.4 Built in Functions . . . . . . . . . . . . . . . . . . . . 10
2.4.1 Notes on the SPLINE and LINEAR Functions . . . . . . . 13
3. The Animation Control Language . . . . . . . . . . . . . . . . 15
3.1 Comments . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Basic Statement Syntax . . . . . . . . . . . . . . . . . . 15
3.3 Declaration of Variables (The VAR Statatement) . . . . . . 15
3.4 Output File Declarations . . . . . . . . . . . . . . . . . 17
3.5 Assignment Statement . . . . . . . . . . . . . . . . . . . 18
3.6 IF Statement . . . . . . . . . . . . . . . . . . . . . . . 18
3.7 WHILE Statement . . . . . . . . . . . . . . . . . . . . . . 19
3.8 DO Statement . . . . . . . . . . . . . . . . . . . . . . . 19
3.9 FOR Statement . . . . . . . . . . . . . . . . . . . . . . . 20
3.10 BREAK Statement . . . . . . . . . . . . . . . . . . . . . 20
3.11 CONTINUE Statement . . . . . . . . . . . . . . . . . . . . 21
3.12 STOP Statement . . . . . . . . . . . . . . . . . . . . . . 21
3.13 WRITE Statements . . . . . . . . . . . . . . . . . . . . . 21
3.14 SUBCHAR Statement . . . . . . . . . . . . . . . . . . . . 22
3.15 NEXTFRAME Statement . . . . . . . . . . . . . . . . . . . 23
3.16 EPILOG Statement . . . . . . . . . . . . . . . . . . . . . 23
3.17 Self-continuing Batch Files . . . . . . . . . . . . . . . 23
3.18 Auxiliary Data Files . . . . . . . . . . . . . . . . . . . 24
3.18.1 Opening a File for Reading . . . . . . . . . . . . . . 24
3.18.2 Creating an Output File . . . . . . . . . . . . . . . 24
3.18.3 Closing an Auxiliary File . . . . . . . . . . . . . . 25
3.18.4 Reading from an Auxiliary File . . . . . . . . . . . . 25
3.18.5 Writing to an Auxiliary File . . . . . . . . . . . . . 26
3.19 Notes About The System Variables . . . . . . . . . . . . . 26
4. Animation And Time Control . . . . . . . . . . . . . . . . . . 28
5. Example Animations . . . . . . . . . . . . . . . . . . . . . . 29
6. Use And Distribution of RTAG . . . . . . . . . . . . . . . . . 30
6.1 Disclaimer . . . . . . . . . . . . . . . . . . . . . . . . 31
i
Contents ii
7. Other Software . . . . . . . . . . . . . . . . . . . . . . . . 32
7.1 Mathplot -- Mathematical Function Plotting Program . . . . 32
7.2 Nonlin -- Linear & Nonlinear Statistical Regression . . . . 32
7.3 TSX-32 -- Multi-User Operating System . . . . . . . . . . . 33
8. Software Order Form . . . . . . . . . . . . . . . . . . . . 35
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Chapter 1
Introduction
An animation is composed of a sequence of individual images,
called "frames," which are displayed rapidly to give the illusion
of motion. Anyone who sets out to create an animation must deal
with two design issues: (1) the generation of the basic scene
(objects, colors, lights, etc.), and (2) the changing position of
the objects between frames. RTAG deals with the second of these
issues -- object motion. The first issue, basic scene design and
rendering, is carred out by the ray tracing program of your choice
(POV-Ray, Polyray, BOB, etc.).
RTAG reads an animation control file that you create and generates
one or more files that automate the rendering of individual frames
and the construction of the animation sequence. The animation
control file is the focus of this manual.
RTAG implements an animation language with a syntax similar to C.
Although simple in comparison to full featured languages such as C
and Pascal, the RTAG language is far from trivial. It provides
full arithmetic and logical expressions, control statements (IF),
loop statement (FOR, WHILE, and DO), a rich set of library
functions (trig, log, roots, spline, etc.), and statements for
writing commands to the output files which will be used to
generate the frames. Using the RTAG language you can perform
realistic simulations of physical processes such as accelerations,
falling objects, and interactions between objects. RTAG also can
be used as a general purpose programming language.
1.1 Ray Tracing Driver Files
The basic purpose of RTAG is to produce a set of files which will
cause ray tracing programs such as POV-Ray, Polyray, Vivid, BOB,
and other ray tracers to generate the sequence of frames for an
animation.
All ray tracers accept some sort of scene description file in
which you specify the position of objects, colors, textures,
camera angle, etc. With rare exeception, one run of a ray tracer
with one scene description produces one image file. In order to
produce an animation you must run the ray tracer once for each
frame and vary the position of the objects and/or camera between
frames to produce the illusion of motion. This means that the
scene description file must be different for each frame.
1
Chapter 1. Introduction 2
Fortunately, all good ray tracers provide a facility for including
one or more external files while processing the scene description.
In the case of POV-Ray this is accomplished with the "#include"
statement. Other tracers have similar statements. Using this
facility you can have a common scene description file and place
only the commands to describe the positions of moving objects in a
separate file that is included in the scene. For example,
consider this simple POV-Ray scene description file:
#include "colors.inc"
#include "shapes.inc"
#include "move.inc"
camera {
location <.5 1 -22> direction <0 0 1.5>
up <0 1 0> right <1.33 0 0> look_at <0 4 0>
}
object { light_source { <6 15 -4> color White} }
object {
sphere { <xpos ypos 0> .5}
texture { color red .9 green 0 blue .1 ambient .8 }
}
This scene has a camera, a single light source, and a ball. The
position of the ball is specified as "<xpos ypos 0>" but note that
xpos and ypos are not defined in the file. Rather, the values of
xpos and ypos are defined in a separate file named "move.inc" that
in included in this scene. Typical statements in move.inc are as
follows:
#declare xpos = 3
#declare ypos = 4
To simulate motion of the ball you would prepare a separate
move.inc file for each frame with slightly altered values for xpos
and ypos. Since there will be an include file for each frame,
they are typically given names containing the frame numbers such
as "MOVE001.INC", "MOVE002.INC", etc. A primary purpose of RTAG
is to automate the generation of these include files.
In addition to a scene description file and a separate include
file for each frame, you also need a DOS batch file to cause the
ray tracing program to be run for each frame. RTAG also helps you
produce this file.
For each frame, the batch file will contain commands to perform
the following operations: (1) make the appropriate include file
the current include file for the next image generation; (2)
execute the ray tracing program which will generate an image based
on frame-dependent data in the current include file; (3)
additional commands to delete intermediate files or pack together
the frame files. Typical commands written to the batch file for a
frame are:
COPY MOVE001.INC MOVE.INC
POVRAY +iMOVE.POV +oMOVE.TGA
Chapter 1. Introduction 3
Rather than having RTAG produce a separate include file for each
frame (which can end up being a lot of files), it is also possible
to write commands to the batch file to cause the include file to
be created just before it is needed by the ray tracing program.
To do this, use the DOS ECHO command with the ">" redirection
operator to create the file and the ">>" operator to add
additional commands to the file. The following is an example of
commands that create an include file named MOVE.INC, write two
commands into it, and then call POV-Ray to render the image:
ECHO #declare xpos = 2.5 > move.inc
ECHO #declare ypos = 8.6 >> move.inc
POVRAY +iMOVE.POV +oMOVE.TGA
Note that the ">" redirection operator creates a new file so it
should be used with the first ECHO command for each frame. The
">>" redirection operator appends to the end of a file so it
should be used for additional ECHO commands for the frame.
To summarize, there are two methods for producing the include file
for a frame: (1) have RTAG generate a separate file with a unique
name that is copied (or renamed) to the name used by the #include
statement; or (2) use ECHO commands in the batch file to generate
the include file just before invoking the ray tracing program for
the frame.
1.2 Files Produced by RTAG
Include files -- If you wish to have RTAG generate a separate
include file for each frame, you must use an OFILE command to
declare the file name. The name must include one or more '#'
characters which are replaced by the frame number to generate
the actual include file name. The NEXTFRAME statement
increments the frame number and opens the next include file
being created. OWRITE commands are used to write information
to the currently open include file.
If you create the include file by writing ECHO commands to the
batch file, then you will NOT use the OFILE and OWRITE
statements which cause RTAG to generate a separate include
file for each frame.
Batch file -- This is a DOS batch (.BAT) file containing the
commands to perform the following operations for each frame:
1. make the appropriate include file the current include file
for the next image generation (or generate the include
file);
2. execute the ray tracing program which will generate an
image based on frame-dependent data in the current include
file;
Chapter 1. Introduction 4
3. additional commands to delete intermediate files or pack
together the frame files. Use BWRITE statements in your
control file to write to the batch file. The BFILE
statement declares the name of the batch file. This file
is not created unless you use the BFILE and BWRITE
commands.
Auxiliary files -- RTAG includes statements for opening, creating,
reading from, and writing to auxiliary files. Auxiliary input
files can be used to transfer animation data from other
programs to RTAG. One use of an auxiliary output file is to
store the names of the generated targa or GIF files so that a
subsequent program such as DTA can read this file to determine
which files to string together in the final animation file.
Listing file -- This file has the same name as the animation
control file but an extension of ".LST". It contains the same
output displayed by RTAG on the screen during an animation
generation run. You can use PRINT statements within your
control file to write output to the screen and the listing
file.
1.3 Auxiliary Programs
RTAG is one component in the set of programs needed to produce and
display an animation. In addition to RTAG you will need the
following programs:
Ray Tracing Program -- There are several excellent ray tracing
programs available as freeware or shareware. Three programs
with which I am familiar are POV-Ray (freeware) by Drew Wells
and the POV team (CompuServe 73767,1244); Polyray (shareware)
by Alexander R. Enzmann (CompuServe 70323,2461); and BOB by
Christopher Watkins, Stephen Coy, and Mark Finlay (included
with the excellent book "Photorealism and Ray Tracing in C").
GIF generator -- Most ray tracing programs output "targa" files
which contain higher resolution images than usually can be
displayed. These targa files must be converted into GIF or
other image formats before they can be displayed. One fine
freeware program for doing this is Piclab by Lee Daniel
Crocker and the Stone Soup Group (CompuServe 73407,2030).
Scene viewer -- When designing a scene you will need a program to
display the TGA or GIF file for an individual frame of the
animation. There are many programs available to do this. A
popular shareware choice is CSHOW by Bob Berry (CompuServe
76555,167).
Animation sequencer -- Once the individual frame images have been
generated, they must be combined into a single file that can
be displayed rapidly. A shareware program which I use for
this is DTA by David K. Mason (CompuServe 76546,1321). DTA
reads the targa or GIF files produced by the ray tracer and
Chapter 1. Introduction 5
produces a .FLI (flick) file that can be displayed as an
animation.
Animation display -- This program reads the finished animation
file and displays it on your screen. A popular shareware
program for displaying .FLI files is PLAY.EXE by Trilobyte
(CompuServe 72330,3276).
These programs, and many others related to ray tracing and
animation, are available in the libraries of the CompuServe
GRAPHDEV forum. This is also an excellent place for posting
messages or getting help regarding ray tracing and animation.
Two bulletin boards which specialize in graphics development are
"You Can Call Me Ray," 708-358-5611; and "The Graphics
Alternative," 510-524-2780.
Chapter 2
Running RTAG
Once you create an RTAG control file, you can use RTAG to compile
and execute it by issuing a DOS command of the form:
RTAG control_file [option1] [option2]...
where "control_file" is the name of the control file. If no file
extension is specified, ".RTA" is used by default.
2.1 Command Line Options
Following the control file name you may specify the options
described below. If more than one option is provided, they must
be separated by spaces. The option letters are not case
sensitive. Values specified with command line options override
the corresponding values specified in the control file.
/B=file -- Specifies the name of the batch file. The batch file
name can also be specified using a BFILE statement in your
control file. The default extension is ".BAT".
/F=number -- Specifies the first frame that is to produce output.
Output generated with the BWRITE and OWRITE functions is
discarded for frames prior to this number. The default value
is 1.
/L=number -- Specifies the last frame that is to produce output.
Output generated with the BWRITE and OWRITE functions is
discarded for frames following this number. By default, there
is no last frame (i.e., all frames are output).
/N -- Specifies that no output is to be written to the batch and
include files. This is useful when you are debugging an
animation control file and want to test it without generating
the output files. Output generated by PRINTF and WRITE
functions always is written, even if this option is specified.
/O=file -- Specifies the name of the include files generated
during the run. Include file names must include the string
'###' (1 to 5 '#' characters) which is replaced by the frame
number. The output file names can also be specified by an
OFILE statement in your control file. The default extension
is ".INC".
6
Chapter 2. Running RTAG 7
/P -- Causes the entire control file to be listed on the screen
and written to the listing file. Normally only error messages
and output generated by PRINTF statements are displayed.
/S=number -- Specifies the number of steps between frames whose
output is to be generated. Output is discarded for frames
between the step frames if a value other than 1 is specified.
The default value is 1. If stepping is enabled, the first
frame is generated and then frames are skipped up to
first+step. The sequence continues with subsequent frames.
This option is useful for producing an abbreviated set of
frames for evaluation and debugging purposes.
/T -- Specifies that each source statement is to be displayed
before it is executed. This is useful for debugging purposes.
2.2 The RTAG Animation Control File
RTAG reads an animation control file that you create, compiles the
commands, and executes the resulting program. The commands in the
control file are formed from the RTAG animation language which is
described in the sections that follow. However, before getting
into a detailed discussion of the animation language, let's look
at a simple example to get a feeling for the language. This
example is a complete RTAG command file which will generate the
appropriate commands to move an object on a spline path that
passes through a specified set of x,y,z coordinates:
Chapter 2. Running RTAG 8
// Simple animation example.
// Declare variables
var lastframe = 60; // Generate 60 frames
var x,y,z;
// Declare files
bfile "move"; // Batch file MOVE.BAT
// Begin main animation loop to generate 60 frames.
while (curframe < lastframe) {
// Begin the next frame (this increments curframe)
nextframe;
// Use spline function to compute x,y,z position.
x = spline(curframe, 1,-8, 20,0, 40,5, 60,8);
y = spline(curframe, 1,1, 20,5, 40,5, 60,1);
z = spline(curframe, 1,0, 20,4, 40,6, 60,10);
// Report the position
printf("At frame `curframe`, x=`x`, y=`y`, z=`z`\n");
// Write commands to the batch file.
// These commands create a move.inc include file.
bwrite("ECHO #declare xpos = `x` > move.inc\n");
bwrite("ECHO #declare ypos = `y` >> move.inc\n");
bwrite("ECHO #declare zpos = `z` >> move.inc\n");
// Generate command to render the image.
bwrite("call render move move`###`\n");
}
// Write batch command that runs DTA to build the animation.
epilog;
bwrite("call dta move\n");
2.3 Arithmetic and Logical Expressions
Much of the power of RTAG comes from its ability to perform
mathematical calculations. This is important for any type of
animation generation, but is especially critical for physical
system simulations. This section explains the arithmetic
operators and built in functions that may be used in arithmetic
expressions.
The following arithmetic operators may be used in expressions:
++ add 1 to a variable
-- subtract 1 from a variable
+ addition
- subtraction or unary minus
* multiplication
/ division
% modulo
** or ^ exponentiation
The "++" and "--" operators may be used either immediately before
or after a variable name. If they are used before the name, the
increment or decrement is performed before the value of the
variable is used in the expression. If they are used after the
name, the value of the variable before being modified is used in
Chapter 2. Running RTAG 9
the expression and then the increment or decrement takes place.
For example, the sequence:
a = 3;
b = 3;
x = ++a;
y = b++;
assigns the value 4 to x and 3 to y. At the end of the sequence,
both a and b have the value 4.
The following assignment operators can be used in expressions:
variable = expression; // Assign expression to variable
variable += expression; // Add expression to variable
variable -= expression; // Subtract expression from variable
variable *= expression; // Multiply variable by expression
variable /= expression; // Divide variable by expression
The following operators compare two values and produce a value of
1 if the comparison is true, or 0 if the comparison is false:
== Equal
!= Not equal
<= Less than or equal
>= Greater than or equal
< Less than
> Greater than
The following logical operators may be used:
! Logical NOT (negates true and false)
&& AND
|| OR
There are two other special operators: "[]" (square brackets)
which enclose subscripts on arrays, and "," (comma) which is used
to specify left-to-right, sequential evaluation of a list of
expressions.
Operator precedence, in decreasing order, is as follows:
subscript, unary minus, logical NOT, ++ and --, exponentation,
multiplication, division and modulo, addition and subtraction,
relational (comparison), logical (AND and OR), assignment, comma.
Parentheses may be used to group terms.
2.3.1 Numeric Constants
Numeric constants may be written in their natural form (1, 0, 1.5,
.0003, etc.) or in exponential form, n.nnnEppp, where n.nnn is the
base value and ppp is the power of ten by which the base is
multiplied. For example, the number 1.5E4 is equivalent to 15000.
All numbers are treated as "floating point" values, regardless of
whether a decimal point is specified or not. As a convenience for
entering time values, if a value contains one or more colons, the
Chapter 2. Running RTAG 10
portion to the left of the colon is multiplied by 60. For
example, 1:00 is equivalent to 60; 1:00:00 is equivalent to 3600.
2.3.2 Built-in Constant
The symbolic name "PI" is equivalent to the value of pi,
3.14159... You may write PI using either upper or lower case.
2.4 Built in Functions
The following functions are built into RTAG and may be used in
expressions:
ABS(x) -- Absolute value of x.
ACOS(x) -- Arc cosine of x. Angles are measured in degrees.
ASIN(x) -- Arc sine of x. Angles are measured in degrees.
ATAN(x) -- Arc tangent of x. Angles are measured in degrees.
CEIL(x) -- Ceiling of x (an equivalent name for this function is
INT). Returns the smallest integer that is at least as large
as x. For example, CEIL(1.5)=2; CEIL(4)=4; CEIL(-2.6)=-2.
CLOSE(file) -- Close the specified file.
COS(x) -- Cosine of x. Angles are measured in degrees.
COSH(x) -- Hyperbolic cosine of x.
COT(x) -- Cotangent of x. (COT(x) = 1/TAN(x)). Angle in degrees.
CREATE("file name") -- Create a new auxiliary data file. The
value returned by this function is a file number that can be
used with subsequent WRITE functions. See the description of
auxiliary file I/O for additional information.
CSC(X) -- Cosecant of x. (CSC(x) = 1/SIN(x)). Angle in degrees.
DEG(x) -- Converts an angle, x, measured in radians to the
equivalent number of degrees.
EXP(x) -- e (base of natural logarithms) raised to the x power.
FAC(x) -- x factorial (x!). The FAC function is computed using
the GAMMA function (FAC(x)=GAMMA(x+1)) so non-integer argument
values may be computed.
FLOOR(x) -- Floor of x. Returns the largest integer that is less
than or equal to x. For example, FLOOR(2.5)=2; FLOOR(4)=4;
FLOOR(-3.6)=-4.
Chapter 2. Running RTAG 11
GAMMA(x) -- Gamma function. Note, GAMMA(x+1) = x! (x factorial).
INT(x) -- Ceiling of x (an equivalent name for this function is
CEIL). Returns the smallest integer that is at least as large
as x. For example, INT(1.5)=2; INT(4)=4; INT(-2.6)=-2.
LINEAR(t, t1,x1, t2,x2, ... tn,xn) -- Perform linear
interpolation between a set of points. If the value of a
function is x1 at some point t1, x2 at t2, etc., this function
determines the value at some arbitrary point, t, where t falls
in the range (t1,tn). The first argument to the LINEAR
function is the value t at which the interpolation is to be
performed. The remaining arguments are (ti,xi) data pairs.
For example, consider the function LINEAR(t, 0,0, 1,6, 2,4).
This specifies that when t is 0, the value of the function is
0, when t is 1, the value is 6, and when t is 2 the value is
4. If this function is called with a t value of 0.5, the
returned value of the function will be 3. If the function is
called with a t value of 1.5, the returned value will be 5.
You can use expressions as arguments to this function. For
example, the following function invocation is valid: LINEAR(t,
starttime,basex, starttime+3,midx, endtime,midx*2). If the
function is called with a t value that is outside the range
(t1,tn) (i.e., beyond either end point), then the nearest end
point and the second closest point are used to extrapolate to
the specified t value. See also the description of the SPLINE
function.
LOG(x) -- Natural logarithm of x.
LOG10(x) -- Base 10 logarithm of x.
MAX(x1,x2) -- Maximum value of x1 or x2.
MIN(x1,x2) -- Minimum value of x1 or x2.
MOD(x1,x2) -- x1 modulo x2. The MOD function calculates the
floating-point remainder, f, of x1/(i*x2) such that x1=i*x2+f,
where i is an integer; f has the same sign as x1, and the
absolute value of f is less than the absolute value of x2.
The % operator perform the same operation.
MOREDATA(file) -- This function checks to see if there is another
data record available in the external file whose file number
is specified as the argument. If there is a record available,
this function returns the value true (1), if not, it returns
false (0). This function does not consume any data in the
file, you must use the READ statement to actually read the
next record. You can call MOREDATA any number of times
without disturbing the next record in the file. See the
section on auxiliary file I/O for additional information.
NPD(x,mean,std) -- Normal probability distribution of x with
specified mean and standard deviation. X is in units of
standard deviations from the mean.
Chapter 2. Running RTAG 12
OPEN("file name") -- Open an existing file for reading. The value
returned by this function is a file number that can be used
with subsequent READ functions. See the description of
auxiliary file I/O for additional information.
PAREA(x) -- Area under the normal probability distribution curve
from -infinity to x. (i.e., integral from -infinity to x of
NORMAL(x)).
PRINTF("format"[,expression1,expression2,...]) -- Evaluate the
expressions (if any) and write the values with the specified
formatting string to the console and the listing file.
PULSE(a,x,b) -- Pulse function. If the value of x is less than a
or greater than b, the value of the function is 0. If x is
greater than or equal to a and less than or equal to b, the
value of the function is 1. In other words, it is 1 for the
domain (a,b) and zero elsewhere. If you need a function that
is zero in the domain (a,b) and 1 elsewhere, use the
expression (1-PULSE(a,x,b)).
RAD(x) -- Converts an angle measured in degrees to the equivalent
number of radians.
RANDOM() -- Returns a random value uniformly distributed in the
range 0 to 1. You can use the srand system variable to
specify a starting seed.
READ(file,variable1,variable2,...) -- Read one line from the
specified file, scan the input line for values, and assign the
values to the specified variables.
ROUND(x) -- Rounds x to the nearest integer. For example,
ROUND(1.1)=1; ROUND(1.8)=2; ROUND(-2.8)=-3;
SEC(x) -- Secant of x. (SEC(x) = 1/COS(x)). Angle in degrees.
SEL(a1,a2,v1,v2) -- If a1 is less than a2 then the value of the
function is v1. If a1 is greater than or equal to a2, then
the value of the function is v2.
SIN(x) -- Sine of x. Angles are measured in degrees.
SINH(x) -- Hyperbolic sine of x.
SPLINE(t, t1,x1, t2,x2, ... tn,xn) -- Perform a cubic spline
interpolation between a set of points. A spline is a smooth
path (continuous first and second derivatives) that passes
through a set of points. The SPLINE function is very useful
in animations because it allows you to easily construct a
smooth path for the motion of some object (or the camera).
If the value of a function is x1 at some point t1, x2 at t2,
etc., this function determines the value at some arbitrary
point, t, where t falls in the range (t1,tn). The first
Chapter 2. Running RTAG 13
argument to the SPLINE function is the value t at which the
interpolation is to be performed. The remaining arguments are
(ti,xi) data pairs. You can use expressions as arguments to
this function. For example, the following function invocation
is valid: SPLINE(t, starttime,basex, starttime+3,midx,
endtime,midx*2). If the function is called with a t value
that is outside the range (t1,tn) (i.e., beyond either end
point), then the value of the function at the nearest end
point and the slope of the function at that point are used to
extrapolate in a linear fashion to the specified t value. See
also the description of the LINEAR function.
SQRT(x) -- Square root of x.
STEP(a,x) -- Step function. If x is less than a, the value of the
function is 0. If x is greater than or equal to a, the value
of the function is 1. If you need a function which is 1 up to
a certain value and then 0 beyond that value, use the
expression STEP(x,a).
TAN(x) -- Tangent of x. Angles are measured in degrees.
TANH(x) -- Hyperbolic tangent of x.
WRITE(file,"format"[,expression1,expression2,...]) -- Evaluate the
expressions (if any) and write the values with the specified
formatting string to auxiliary output file whose file number
is specified as the first argument.
2.4.1 Notes on the SPLINE and LINEAR Functions
RTAG includes two library functions for performing interpolation:
LINEAR and SPLINE. If you have two pairs of values, (t1,x1) and
(t2,x2), these functions determine the value of x that corresponds
to some value of t between t1 and t2. If you have more than two
pairs, the function determines the value of x that is on the
segment that spans the specified value of t.
The function parameters, t and x, can represent any type of value.
However, in animations t is usually a time value or frame number,
and x is a position (either in the X, Y, or Z dimension). If you
want an object to follow a path through a set of three dimensional
points, you have to use three statements, each with an
interpolation function. For example, if at frame 1 you want an
object to be at (-8,0,-3), frame 20 to be at (0,5,-1), frame 40 to
be at (2,2,0), and frame 60 to be at (7,4,2), then you could use
the following statements:
while (curframe <= 60) {
nextframe;
x = spline(curframe, 1,-8, 20,0, 40,2, 60,7);
y = spline(curframe, 1,0, 20,5, 40,2, 60,4);
z = spline(curframe, 1,-3, 20,-1, 40,0, 60,2);
<< other statements >>
}
Chapter 2. Running RTAG 14
The spline function will force the object to be at the specified
x,y,z coordinate at frames 1, 20, 40, and 60, and will generate
intermediate positions between these frames.
While the method explained above of specifying absolute frame
numbers works well, you will have to change the values in the
function specification if you change the total number of frames in
the animation. A better approach is to use the percentage of the
total animation as the control values and use the expression
(100*(curframe-1)/(lastframe-1)) to specify the position along the
path. Note that the a value must be specified for lastframe. The
following program illustrates this approach:
var x,y,z,position;
var lastframe = 50; // Animation will have 50 frames
while (curframe < lastframe) {
nextframe; // This increments curframe
position = 100*(curframe-1)/(lastframe-1);
x = spline(position, 0,-8, 40,0, 60,2, 100,7);
y = spline(curframe, 0,0, 40,5, 60,2, 100,4);
z = spline(curframe, 0,-3, 40,-1, 60,0, 100,2);
statements to output position >>
}
If the path described by a spline function completes a closed
circuit, a smoother transition can be accomplished by specifying
an extra point beyond either end which matches the next point on
the path. The following statements illustrate this for forming a
roughly circular path (a better way to do this would be to use sin
and cos functions):
position = 100*(curframe-1)/(lastframe-1);
x = spline(position, -20,0.3, 0,1.0, 20,0.3, 40,-0.8,
60,-0.8, 80,0.3, 100,1.0, 120,0.3);
y = spline(position, -20,-1.0, 0,0.0, 20,1.0, 40,0.6,
60,-0.6, 80,-1.0, 100,0.0, 120,1.0);
Note that the first point specified (-20) and the last point (120)
will never be reached since the value of position ranges from 0 to
100. However, because the spline function depends not only on the
current position but also on the points on either side, specifying
these points smooths out the transition near the end points. This
trick does not apply to spline curves that are not closed on
themselves.
Chapter 3
The Animation Control Language
The RTAG animation control language is similar to other modern
programming languages such as C. It provides the tools you need
to easily perform animation simulations and generate the necessary
output files to drive the ray tracing and auxiliary programs.
3.1 Comments
The beginning of a comment is denoted with "//" (two consecutive
slash characters). Everything from the "//" sequence to the end
of the line is treated as a comment. Comments may be on lines by
themselves or on the ends of other statements. You can also
specify a comment by beginning the comment with the "/*" character
sequence. All characters following this are treated as comments
up to the matching "*/" sequence. The following lines illustrate
both types of comments:
// Begin main simulation loop
y = y + timestep * yvelocity; // Advance y position
/*
* This is a comment.
*/
z = y / 5; /* This is a comment too */
3.2 Basic Statement Syntax
The RTAG language has a syntax that is very similar to C:
statements are terminated with a semicolon, and brace characters
("{" and "}") are used to group statements.
3.3 Declaration of Variables (The VAR Statatement)
All variables used in your animation control file must be declared
before they are used. This is done using the VAR statement which
may optionally assign an initial value to the variable. If no
initial value is specified, 0 is used by default. VAR is a
declarative statement: that is, it declares the existance of the
variable and assigns an initial value, it does not reassign the
value to the variable if the VAR statement appears in a loop.
15
Chapter 3. The Animation Control Language 16
Variable names may be up to 30 characters long. They ARE case
sensitive. Keywords (FOR, WHILE, VAR, etc.) and library function
names (SIN, COS, ABS, etc.) are NOT case sensitive. All variables
are double precision (64 bit) floating point values.
The syntax of the VAR statement is:
VAR variable1[=value], variable2[=value], ...;
You may use as many VAR statements as you need. The following are
examples of this statement:
var x, y, speed = 5;
var Acceleration = 2.5;
In addition to simple scalar variables, RTAG also allows you to
use one-dimensional array variables. To declare an array
variable, follow the name of the variable with the number of
elements enclosed in square brackets. For example, the following
command declares a variable named speeds that will have 20 values:
var speeds[20];
If you wish to assign initial values to an array, enclose the list
of values in braces. For example,
var xpos[3] = {1.2, 2.7, 4.6};
Subscripts follow the C convention of being 0 based. That is, the
first element of an array is referenced using a subscript value of
0. For example, if the variable x is declared with three elements
(var x[3]) then the elements would be referenced as x[0], x[1],
and x[2]. The expression x[3] would NOT be valid.
In addition to your own variables, RTAG provides several system
variables. If you do not provide VAR statements for these
variables, they are defined automatically at the start of a run
and RTAG assigns their values.
Variable Default Meaning
---------- ------- -------------------------------------------
curframe 0 The current frame number. Set by NEXTFRAME.
firstframe 1 The first frame that will generate output.
lastframe 999999 The last frame that will generate output.
stepinc 1 The step increment between frames.
srand 1 Seed for random number generator.
These variables may be used in your animation control file just
like ordinary variables. If you want to set different default
values for firstframe, lastframe, stepinc or srand, use a VAR
statement and specify an initial value. For example, the
following commands would cause frames 20 through 40 to be output:
var firstframe = 20;
var lastframe = 40;
Chapter 3. The Animation Control Language 17
The default values, or the values specified by VAR statements, can
be overridden by qualifiers on the command line. /F sets
firstframe, /L sets lastframe, and /S sets stepinc.
The srand system variable is used to set a starting "seed" value
for the RANDOM() function. The default value for srand is 1. For
a given starting seed value, the pseudorandom sequence is always
the same.
3.4 Output File Declarations
RTAG is capable of producing multiple files during each run. Most
of these files are optional and will only be produced if you
include the appropriate statements in your control file.
The listing file is always produced. It has the same name as the
animation control file but with an extension of ".LST".
Most RTAG runs will produce a batch file to drive the ray tracing
program. The batch file may contain commands to generate the
appropriate include file for each frame or you may choose to have
RTAG generate the full set of include files separate from the
batch file. If you wish to generate a batch file you must place a
command of the following form in your control file:
BFILE "name";
where 'name' is the name of the batch file. The default extension
is ".BAT". Note that the file name must be enclosed on quote
marks.
The batch file normally contains a set of commands to render each
frame. Typically, the commands for each frame perform the
following actions:
1. Generate an include file with object position information.
2. Run the ray tracer using the current include file.
The BWRITE function is used to write to the batch file. The batch
file is optional and is generated only if you use a BFILE
statement.
If you wish to have RTAG generate a set of include files, you must
use the following command to declare the names of the files:
OFILE "name";
If the OFILE statement is used, one output file is generated for
each frame. The output file name must include a string of one to
seven '#' characters. These characters are replaced by the
current frame number when the file is opened. For example,
consider the following command:
Chapter 3. The Animation Control Language 18
ofile "bounc###.inc";
Then for frame 27 the name of the created file will be
BOUNC027.INC. The default extension is ".INC".
The NEXTFRAME command closes the current output file, increments
the frame number, and opens the next output file (assuming the
OFILE statement was specified). The last output file is closed
when the program stops. The OWRITE function writes lines to the
currently open output file.
RTAG can also create or read from auxiliary data files. This is
described in a subsequent section.
3.5 Assignment Statement
The assignment statement is an executable statement that evaluates
an expression and assigns its value to a variable. The syntax for
an assignment statement is:
variable = expression; // Assign expression to variable
variable += expression; // Add expression to variable
variable -= expression; // Subtract expression from variable
variable *= expression; // Multiply variable by expression
variable /= expression; // Divide variable by expression
where "variable" is a previously declared variable which may be
subscripted and "expression" is a valid arithmetic or logical
expression following the rules explained earlier. If the
expression involves a relational comparison operator (e.g., <, >,
>=, etc.) or a logical operation (&&, ||, !), the value 1 is used
for true and 0 for false.
3.6 IF Statement
The form of the IF statement is:
IF (expression) statement1 [ELSE statement2]
If the expression is true (not zero) statement1 is executed, if
the expression is false (0) and the ELSE clause is specified,
statement2 is executed. The ELSE clause and the second set of
controlled statements are optional. You may control groups of
statements by enclosing them in braces. The following are
examples of valid IF statements:
if (x > bigx) bigx = x;
Chapter 3. The Animation Control Language 19
if (x <= 10) {
y = linear(x, 0,0, 10,6);
z = .5 * x;
} else {
y = y + yspeed * timestep;
z = .3 * x;
}
3.7 WHILE Statement
The WHILE statement loops until the controlling expression becomes
false (0) or a BREAK statement is executed within the loop. The
form of the WHILE statement is:
WHILE (expression) {
<< controlled statements >>
}
Each time around the loop the expression is evaluated. If it is
true (non zero) the controlled statements are executed and then
the process repeats until the expression becomes false. If a
BREAK statement is executed within the loop, execution of the loop
terminates and control is transferred to the first statement
beyond the end of the loop. If a CONTINUE statement is executed
in the loop, control is transferred to the conditional test at the
top of the loop. The following is an example of a WHILE
statement:
while (x < 5) {
x = x + xmove;
y = y + ymove;
}
3.8 DO Statement
The DO statement is very similar to the WHILE statement except the
control expression is evaluated at the end of the loop rather than
the beginning. This causes the loop always to be executed at
least once. The form of the DO statement is:
DO {
<< controlled statements >>
WHILE (expression);
For each iteration of the loop the controlled statements are
executed and then the conditional expression is evaluated. If it
is true (non-zero) control transfers to the first controlled
statement at the top of the loop. A BREAK statement may be used
to terminate the loop before the conditional expression is
evaluated. A CONTINUE statement can be used to cause control to
be transferred from within the loop to the point where the
conditional expression is evaluated. The following is an example
of a DO statement:
Chapter 3. The Animation Control Language 20
do {
read(infile,lastflag,x[numpoints++]);
} while (!lastflag);
3.9 FOR Statement
The FOR statement is a looping control statement similar to the
WHILE statement; however, the FOR statement also allows you to
specify initialization expressions that are executed once at the
beginning of the loop, and loop-end expressions that are executed
at the end of each loop cycle. The form of the FOR statement is:
FOR (expression1; expression2; expression3) statement
Execution of a FOR statement proceeds as follows:
1. Evaluate expression1. Typically this expression will include
assignment operators ("=") to set initial values for loop
variables. If you need more than one initial expression,
specify them as a list separated by commas.
2. Evaluate expression2. If its value is false (0) terminate the
FOR statement and transfer control to the statement that
follows the controlled statement. If expression2 is true,
proceed to the next step.
3. Execute the controlled statement. If more than one statement
is to be controlled, enclose them with brace characters ("{"
"}").
4. Evaluate expression3. This expression will typically contain
operators such as "++", "+=", "--", or "-=" to modify the
value of a loop variable.
5. Transfer control to step 2, where expression2 is once again
evaluated.
The following is an example of a FOR statement:
for (time=starttime; time<endtime; time+=timestep) {
<< controlled statements >>
}
3.10 BREAK Statement
The BREAK statement can be used in FOR, WHILE, and DO loops to
terminate the loop and cause control to transfer to the statement
beyond the end of the loop. The following is an example of a
BREAK statement:
Chapter 3. The Animation Control Language 21
time = 0;
x = 0;
while (time < endtime) {
x += delta * xspeed;
if (x > 10) break;
}
3.11 CONTINUE Statement
The CONTINUE statement can be used in FOR, WHILE, and DO loops to
terminate the current iteration and begin the next one. When
CONTINUE is executed in a WHILE or DO statement, control is
transferred to the point in the loop where the loop control
expression is evaluated. When CONTINUE is executed in a FOR
statement, control is transferred to the bottom of the loop where
expression3 is evaluated (which normally augments the values of
the loop variables for the next iteration).
3.12 STOP Statement
The STOP statement terminates the execution of RTAG and closes all
output files. An implicit STOP occurs if you "fall through" the
bottom of your animation control file. The following is an
example of the STOP statement:
while (curframe < 60) {
<< controlled statements >>
if (xposition1 >= xposition2) stop;
}
3.13 WRITE Statements
RTAG has three functions for writing output to standard files.
These functions and the files they write to are as follows:
PRINTF -- Listing file (also displayed on screen).
OWRITE -- Output file (OFILE).
BWRITE -- Batch file (BFILE).
Since the form for these functions is the same (except for the
keyword), the PRINTF statement will be used in the illustrations.
The form of the function is:
printf("string"[,expression1, expression2,...])
where "string" is a quoted text string that may including variable
and expression replacement operators. You can cause the current
value of a variable to be substituted into a string by inserting
the variable name in the string enclosed by "`" characters. Note,
this is not the apostrophe, it is the accent character that is on
Chapter 3. The Animation Control Language 22
the same key as the tilde on most keyboards. You can use the
SUBCHAR statement (see below) to change the character used to mark
a variable value substitution. For example, the following
statement prints the values of the xpos and ypos variables:
printf("X position is `xpos`, and Y position is `ypos`\n");
When this statement is executed `xpos` and `ypos` are replaced by
the current values of the xpos and ypos variables.
Following the C model, control characters are placed in the string
by prededing the character with a backslash. The following table
indicates each of the valid control sequences:
\a -- Bell character (0x07).
\b -- Backspace (0x08).
\f -- Form feed (0x0C);
\n -- End of print line (carriage-return, line-feed).
\r -- Carriage return only.
\" -- Quote character.
\\ -- Literal backslash character (i.e., replace "\\" with "\").
\xddd -- Hexadecimal value 0xddd.
If the sequence `###` (1 to 7 '#' characters enclosed by "`"
characters) appears in the string, the pound signs are replaced by
the current frame number with leading zeros. If the sequence
`+++` (1 to 7 '+' characters) appears in the string, the plus
signs are replaced by a value equal to the current frame number
plus 1. In addition, the strings `ofile` and `bfile` are replaced
by the names of the output file, and batch file respectively. The
string `file` is replaced by the name of the input animation
command file with any device, directory, and extension removed.
You can also substitute the values of expressions. To do this,
use the C programming notation "%w.dlf" where 'w' is the overall
field width and 'd' is the number of decimal places. For example,
the following statement prints the value of an expression:
printf("The diagonal distance is %5.1lf\n", sqrt(xd^2 + yd^2));
3.14 SUBCHAR Statement
The SUBCHAR statement specifies which character is to be used in
write strings to enclose the names of variables whose values are
to be substituted in the string. The default character is "`" --
the accent character which is usually on the same key as the tilde
character. The form of the statement is:
Chapter 3. The Animation Control Language 23
SUBCHAR "char";
where "char" is a single character that must be included in quote
marks. For example, the following statement declares dollar sign
to be the substitution marker character:
subchar "$";
3.15 NEXTFRAME Statement
The NEXTFRAME statement performs the following actions: (1) close
the currently open output file, if any; (2) increment the current
frame number (and curframe variable); (3) if an OFILE statement
was used, open a new output file with the current frame number
substituted for the "###" characters in the file name.
You must execute a NEXTFRAME statement before you can use an
OWRITE function. PRINT, BWRITE and WRITE functions can be
executed before the first NEXTFRAME command. The last output file
is closed when your program stops.
3.16 EPILOG Statement
The EPILOG statement (which may also be spelled EPILOGUE) informs
RTAG that the last frame has been completed and that subsequent
BWRITE function calls are unconditionally to generate output
regardless of the setting of the firstframe, lastframe, and
stepinc values. Otherwise BWRITE functions do not generate output
if they occur after the last frame, or between frames if stepinc
is not 1. Commonly statements using the BWRITE function are used
after EPILOG to write some "end-of-all-frames" termination
statements to the batch file, such as commands to run DTA to build
the animation sequence.
3.17 Self-continuing Batch Files
Because so much computer time is required to create ray traced
animations, it is sometimes necessary to produce the frames using
a series of runs rather than in a single run. Using RTAG it is
easy to produce BAT files that automatically will restart with the
first frame that does not exist. This is done by generating "IF
EXIST...GOTO" commands as part of the batch file. For each frame
you cause the BAT file to check if the TGA file exists; if so,
control skips to the test for the next file. The following is a
skeleton of an RTAG program to generate these statements. Note
the use of the `###` sequence to substitute the current frame
number and the `+++` sequence to substitute the next frame number.
Chapter 3. The Animation Control Language 24
while (curframe < lastframe) {
nextframe;
bwrite(":do`###`\n");
bwrite("if exist tour`###`.tga goto do`+++`\n");
<< other commands to write info for this frame >>
}
epilog;
bwrite(":do`+++`\n");
bwrite("call dodta TOUR /S8\n");
The commands written to the BAT file for each frame have the
following form:
:do001
if exist tour001.tga goto do002
<< commands to generate frame 1 >>
:do002
if exist tour002.tga goto do003
<< commands to generate frame 2 >>
:do003
3.18 Auxiliary Data Files
RTAG provides functions to open, close, read from, and write to
auxiliary data files. This is useful if some other program has
computed object positions or other data that affects the
animation.
Up to 30 auxiliary data files can be open at once. The files are
identified by numbers (also called file "handles") that are
assigned by RTAG at the time that the file is opened. The file
numbers can be reused by closing and reopening files. You must
use the VAR statement to declare variables to hold the file
numbers.
3.18.1 Opening a File for Reading
The form of the statement used to open an existing file for
reading is:
variable = open("file name");
where 'variable' is a varible you have previously declared with a
VAR statement. When RTAG opens the file it generates a unique
file number and assignes it to the variable on the left of the
equal sign. This file number can be used subsequently in READ
functions. An example of this statement is
infile = open("spiral.dat");
Chapter 3. The Animation Control Language 25
3.18.2 Creating an Output File
The form of the statement used to create an auxiliary output file
is
variable = create("file name");
When RTAG creates the file it assignes a unique file number to the
specified variable. This file number can be used subsequently in
WRITE functions. An example of this statement is
outfile = create("trace.dat");
3.18.3 Closing an Auxiliary File
The function used to close an auxiliary file is:
close(file)
where 'file' is a variable that has a file number. For example:
close(outfile);
Any open files are closed automatically when your program
terminates.
3.18.4 Reading from an Auxiliary File
You may read data from an open auxiliary file by using a READ
function of the following form:
read(file,variable1,variable2,...);
Where 'file' is a file number assigned by a previously executed
OPEN function. Each READ function call reads the next line of
data from the file and assigns numeric values to the list of
variables you specify. There must be at least as many data values
on the line as the number of variables specified with the READ
function (additional values are ignored). The data values may be
separated by spaces, tabs, and/or commas. Numeric values may be
specified in the same form as numbers within an RTAG animation
control file (natural, exponential, or dd:dd:dd).
The MOREDATA function can be used to control how many records are
read from the file. The value of MOREDATA(file) is true (1) if
there is another, unread, record available in the file; its value
is false (0) if there is no more data available in the file.
MOREDATA does not consume any data, it just checks for the
availability of data. The following statements would read all
data in a file and generate a frame file for each record:
Chapter 3. The Animation Control Language 26
var f,xpos,ypos;
f = open("indata.dat");
while (moredata(f)) {
nextframe;
read(f,xpos,ypos);
owrite("#declare xpos=`xpos`\n");
owrite("#declare ypos=`ypos`\n");
}
3.18.5 Writing to an Auxiliary File
The form of the function used to write to an auxiliary file is:
WRITE(file,"string"[,expression1,expression2,...]);
where 'file' is a variable containing a file number assigned by a
previously executed CREATE function. "string" is a quoted string
of the same form as described for the PRINT, OWRITE and BWRITE
functions. The string may include variable and expression
replacement operators. Expression1, expression2, etc. are
optional expressions whose values are to be substituted into the
string where "%w.dlf" sequences occur. The following statements
illustrate the use of the WRITE function:
var f,x,y;
f = create("sine.out");
for (x=0; x<360; x+=2) {
y = sin(x);
write(f,"x=`x`, y=`y`\n");
}
close(f);
3.19 Notes About The System Variables
There are four system variables that affect frame generation:
curframe, firstframe, lastframe, and stepinc. Curframe has the
current frame number. Its initial value is 0 before the first
frame is started. The NEXTFRAME statement closes the output file
(OFILE) if it is open, increments the value of curframe by 1, and
opens a new output file (if an OFILE statement was specified).
The following loop would be appropriate to generate an animation
with 60 frames:
while (curframe < 60) {
nextframe;
<< commands to generate frame >>
}
By default, firstframe has a value of 1, lastframe has a value of
999999, and stepinc has a value of 1. There are two ways to
assign different values to these variables: the VAR statement or
with command line options (/F, /L, and /S). The main reason for
setting firstframe and stepinc to something other than 1 is to
make an abbreviated animation which will give you an idea of how
Chapter 3. The Animation Control Language 27
objects will move without spending the time rending all of the
images for a full animation. The following example shows a
command file that will generate images for frames 10 through 60,
stepping 5 between the frames:
var firstframe = 10;
var lastframe = 60;
var stepinc = 5;
while (curframe < lastframe) {
nextframe;
<< commands to generate frame >>
}
The effect of setting firstframe to something other than 1 may be
different than what you expect. The current frame number
(curframe) ALWAYS starts at 0 and increments by 1. If firstframe
is set to something other than 1, the OWRITE and BWRITE functions
have no effect until the frame number reaches the firstframe value
(i.e., when executed they do not write anything to a file). The
reason that firstframe works like this is that when performing a
simulation the state of the system usually depends on previous
iterations (e.g., the position of a falling ball depends on how
long it has been dropping and whether it has already hit the
floor). Because of this it is necessary to start at the beginning
each time. However, by cancelling the actions of the OWRITE and
BWRITE functions prior to firstframe, you can save the expense of
rendering frames before the one of interest.
There are two exceptions to this rule. BWRITE functions always
generate output before the first execution of the NEXTFRAME
statement regardless of the value of firstframe, lastframe, and
stepinc. This is done so that initialization statements can be
generated before the frame generation iteration begins. BWRITE
functions also always generate output after the execution of an
EPILOG statement. This is done so that you can write cleanup and
termination commands to the batch and auxiliary files. PRINTF and
WRITE functions generate output regardless of the value of
firstframe.
The effect of stepinc is similar to firstframe. The NEXTFRAME
statement ALWAYS increments the frame number by 1. If stepinc is
not 1, OWRITE and BWRITE functions are disabled between the steps.
BWRITE always generates output before the execution of the first
NEXTFRAME statement and after execution of an EPILOG statement.
Chapter 4
Animation And Time Control
Time is an essential component of any animation. Except for
special effects, time advances by a constant amount between
frames. Most RTAG animation control files will have an outer loop
advancing through either frames or time. For simple animations it
is usually easier to loop through frames, calculating the
simulated time as a function of the frame number. For example,
the following statements would move an object along a sinusoidal
(wavey) path using the frame number as an argument to the SIN
function:
while (curframe < 60) {
nextframe;
x = -6 + (curframe / 5);
y = 3 * sin(curframe * 12);
<< other statements to generate output >>
}
This approach works well for simple animations where the position
of the objects can be calculated as a direct function of the frame
number. However, for more complex animations, especially those
involving acceleration and interactions between objects, it may be
necessary to perform the simulation with smaller time steps than
the time between frames. In other words, the outer loop should
advance the simulation time and frames should be generated at
periodic intervals to take "snapshots" of the objects. The
following statements illustrate this approach:
for (time=0; time<endtime; time+=timestep) {
// Calculate updated positions of objects
x = x + xspeed * timestep;
y = y + yspeed * timestep;
<< other statements to compute object positions >>
// See if it is time to generate a frame
if (time >= frametime) {
// Generate a frame
nextframe;
<< statements to write to files >>
// Calculate when next frame should be generated
frametime = frametime + sampletime;
}
}
28
Chapter 5
Example Animations
The RTAG distribution comes with several example files which are
explained below. For each example there is an ".RTA" animation
command file and a ".POV" POV-Ray scene description file.
TOUR -- There is a simulated "city" (would you believe a village
with high rise buildings?). The camera begins from the
distance, sweeps down and along "Main Street", circles a dome
structure at the end, and then climbs while still keeping the
buildings in view as it moves away. The SPLINE function is
used both to control the position of the camera and also the
location that the camera is looking at. This 120-frame
animation takes about 6 hours to render in 320x200 size with
anti-aliasing turned on running on a 486/33 using POV-Ray.
BOUNC -- Bouncing ball simulation. A ball rolls down a ramp,
falls, bounces twice, and ends up in landing in a can. This
is a good example of a simulation where time is advanced in
small steps and frames are generated periodically as
"snapshots" of the scene. The position of the ball is
calculated using elementary physics: The speed of an
accelerating object at the end of a time interval is equal to
its speed at the beginning plus the acceleration multiplied by
the time interval. The position at the end of an interval is
equal to the position at the start of the interval plus the
speed multiplied by the time interval. An animation with 60
to 70 frames seems to work best with this example.
ORBIT -- Orbital simulation. Three planets move in elliptical
orbits around a sun. One of the planets has a moon in a
circular orbit. The orbital speeds of the planets follow
Kepler's laws. If you look closely you can see the shadow as
one planet eclipes another. The 200 frame sequence takes
about 4 hours to render on a 386/25 with coprocessor.
29
Chapter 6
Use And Distribution of RTAG
You are welcome to make copies of this program and pass them on to
friends or post this program on bulletin boards or distribute it
via disk catalog services provided the entire RTAG distribution is
included in its original, unmodified form. A distribution fee may
be charged for the cost of the diskette, shipping and handling.
However, RTAG may not be sold, or incorporated in another product
that is sold, without the permission of Phillip H. Sherrod.
Vendors are encouraged to contact the author to get the most
recent version of RTAG.
As a shareware product, you are granted a no-cost, trial period of
30 days during which you may evaluate RTAG. If you find RTAG to
be useful, educational, and/or entertaining, and continue to use
it beyond the 30 day trial period, you are required to compensate
the author by sending the registration form printed at the end of
this document (and in REGISTER.DOC) with the appropriate
registration fee to help cover the development and support of
RTAG.
In return for registering, you will be authorized to continue
using RTAG beyond the trial period and you will receive the most
recent version of the program, a laser-printed, bound manual, and
three months of support via telephone, mail, or CompuServe. Your
registration fee will be refunded if you encounter a serious bug
that cannot be corrected.
You are welcome to contact the author:
Phillip H. Sherrod
4410 Gerald Place
Nashville, TN 37205-3806 USA
615-292-2881 (evenings)
CompuServe: 76166,2640
Internet: 76166.2640@compuserve.com
Both the RTAG program and documentation are copyright (c) 1993 by
Phillip H. Sherrod. You are not authorized to modify the
program. "RTAG" is a trademark.
This program is produced by a member of the Association of
Shareware Professionals (ASP). ASP wants to make sure that the
shareware principle works for you. If you are unable to resolve a
shareware-related problem with an ASP member by contacting the
30
Chapter 6. Use And Distribution of RTAG 31
member directly, ASP may be able to help. The ASP Ombudsman can
help you resolve a dispute or problem with an ASP member, but does
not provide technical support for members' products. Please write
to the ASP Ombudsman at 545 Grover Road, Muskegon, MI 49442 or
send a CompuServe message via CompuServe Mail to ASP Ombudsman
7007,3536.
6.1 Disclaimer
RTAG is provided "as is" without warranty of any kind, either
expressed or implied. This program may contain "bugs" and
inaccuracies, and its results should not be assumed to be correct
unless they are verified by independent means. The author assumes
no responsibility for the use of RTAG and will not be responsible
for any damage resulting from its use.
Chapter 7
Other Software
If you like RTAG, you should check out the following programs by
the same author.
7.1 Mathplot -- Mathematical Function Plotting Program
Mathplot allows you to specify complicated mathematical functions
using ordinary algebraic expressions and immediately plot them.
Four types of functions may be specified: cartesian (Y=f(X));
parametric cartesian (Y=f(T) and X=f(T)); polar (Radius=f(Angle));
and parametric polar (Radius=f(T) and Angle=f(T)). Up to four
functions may be plotted simultaneously. Scaling is automatic.
Options are available to control axis display and labeling as well
as grid lines. Hard copy output may be generated as well as
screen display. Mathplot is an ideal tool for engineers,
scientists, math and science teachers, and anyone else who needs
to quickly visualize mathematical functions.
7.2 Nonlin -- Linear & Nonlinear Statistical Regression
Nonlin performs linear and nonlinear statistical regression
analysis. What is regression analysis? Regression analysis is a
mathematical technique for determining the best values of
parameters to fit an equation to a set of data points. For
example, you might want to develop an equation of the form
price = p0 + p1*age + p2*miles
to predict the price of a used car based on its age and the number
of miles driven. With Nonlin you can collect data from car ads
and then perform the analysis using the following set of commands:
VARIABLES PRICE,AGE,MILES
PARAMETERS P0,P1,P2
FUNCTION PRICE = P0 + P1*AGE + P2*MILES
DATA
Nonlin will analyze the data and determine the best values of the
parameters P0, P1, and P2 to fit the data values.
Ordinary linear regression programs can only determine parameter
values for linear (straight line) equations. Nonlin, on the other
32
Chapter 7. Other Software 33
hand, can handle multivariate, linear, polynomial, and general
nonlinear equations. For example, using Nonlin you can easily
determine the best values for the parameters Offset, Amplitude,
and Frequency for an equation of the form:
Y = Offset + Amplitude * sin(Frequency * X)
Nonlin uses the same expression evaluator as Mathplot so you can
model complicated equations using the full set of operators and
library functions available in Mathplot.
Nonlin comes with a 48 page manual that explains regression
analysis and gives many examples. Nonlin is in use at many
universities and research labs around the world.
7.3 TSX-32 -- Multi-User Operating System
If you have a need for a multi-user, multi-tasking operating
system, you should look into TSX-32. TSX-32 is a full-featured,
high performance, multi-user operating system for the 386 and 486
that provides both 32-bit and 16-bit program support. With
facilities such as multitasking and multisessions, networking,
virtual memory, X-Windows, background batch queues, data caching,
file access control, real-time, and dial-in support, TSX-32
provides a solid environment for a wide range of applications.
A two user, shareware version of TSX-32 called TSX-Lite is also
available.
TSX is particularly valuable for ray tracing and animation
generation which can take a long time to run. These jobs can
execute as background "batch" jobs while you perform interactive
operations with virtually no degredation from the batch execution.
TSX-32 is not a limited, 16-bit, multi-DOS add-on. Rather, it is
a complete 32-bit operating system which makes full use of the
hardware's potential, including protected mode execution, virtual
memory, and demand paging. TSX-32 sites range from small systems
with 2-3 terminals to large installations with more than 100
terminals on a single 486.
In addition to supporting most popular 16-bit DOS programs, TSX-32
also provides a 32-bit "flat" address space with both Phar Lap and
DPMI compatible modes of execution.
Since the DOS file structure is standard for TSX-32, you can
directly read and write DOS disks. And, you can run DOS part of
the time and TSX-32 the rest of the time on the same computer.
TSX-32 allows each user to control up to 10 sessions. Programs
can also "fork" subtasks for multi-threaded applications. The
patented Adaptive Scheduling Algorithm provides consistently good
response time under varying conditions.
Chapter 7. Other Software 34
The TSX-32 network option provides industry standard TCP/IP
networking through Ethernet and serial lines. Programs can access
files on remote machines as easily as on their own machine. The
SET HOST command allows a user on one machine to log onto another
computer in the network. FTP, Telnet, and NFS are available for
interoperability with other systems.
TSX-32 is, quite simply, the best and most powerful operating
system available for the 386 and 486. For additional information
contact:
S&H Computer Systems, Inc.
1027 17th Avenue South
Nashville, TN 37212 USA
615-327-3670 (voice)
615-321-5929 (fax)
CompuServe: 71333,27
Internet: 71333.27@compuserve.com
===============================================================
Software Order Form
===============================================================
Name ______________________________________________________
Address ___________________________________________________
City _______________________ State _______ Zip ___________
Country ____________________
Telephone _________________________________________________
CompuServe account (optional) _____________________________
RTAG version ______________________________________________
Bulletin board where you found RTAG _______________________
Comments __________________________________________________
Check the boxes which indicate your order type:
___ I wish to register RTAG ($20).
___ I wish to order Mathplot ($20).
___ I wish to order Nonlin ($25)
Add $5 to the total amount of the order if the software is being
shipped out of the United States.
In return for registering, you will receive the most recent
version of the program, a laser-printed, bound copy of the manual,
and three months of telephone or CompuServe support. Your
registration fee will be refunded if you find a serious bug that
cannot be corrected.
Distribution disk choice (check one):
3.50" HD (1.4 MB) ______
5.25" HD (1.2 MB) ______
5.25" DD (360 KB) ______
Send this form with the amount indicated to the author:
Phillip H. Sherrod
4410 Gerald Place
Nashville, TN 37205-3806 USA
615-292-2881 (evenings)
CompuServe: 76166,2640
Internet: 76166.2640@compuserve.com
Index 36
ABS function, 10 FLOOR function, 10
ACOS function, 10 FOR statement, 20
AND operator, 9 GAMMA function, 11
Arithmetic operators, 8 GRAPHDEV forum, 5
Array variables, 16 IF statement, 18
ASIN function, 10 #include statement, 1
ASP, 30 INT function, 11
Assignment operator, 18 Internet, 34
Assignment operators, 9 /L option, 6, 17
ATAN function, 10 lastframe variable, 16, 26
Auxiliary data files, 24 LINEAR function, 11, 13
/B option, 6 Listing file, 17
Batch file, 17 LOG function, 11
Batch jobs, 33 LOG10 function, 11
Berry, Bob, 4 Logical operators, 9
BFILE statement, 17 Mason, David K., 4
BOB, 4 Mathplot, 32
BOUNC.POV example, 29 MAX function, 11
BREAK statement, 19, 20 MIN function, 11
Bulletin boards, 5 MOD function, 11
BWRITE function, 17, 21, 27 MOREDATA function, 11, 25
CEIL function, 10 Multi-user operating system,
CLOSE function, 10, 25 33
Comments, 15 /N option, 6
Comparison operators, 9 Networking, 34
CompuServe, 34 NEXTFRAME statement, 18, 23,
Constants, 9 26, 27
CONTINUE statement, 19, 21 Nonlin, 32
Copyright notice, 30 Nonlinear regression, 32
COS function, 10 NOT operator, 9
Cosecant function, 10 NPD function, 11
COSH function, 10 Numeric constants, 9
COT function, 10 /O option, 6
Coy, Stephen, 4 OFILE statement, 17, 23, 26
CREATE function, 10, 25, 26 OPEN function, 12, 24
Crocker, Daniel, 4 Operators
CSC function, 10 arithmetic, 8
CSHOW, 4 assignment, 9
curframe variable, 16, 26 comparison, 9
Curve fitting, 32 logical, 9
DEG function, 10 precedence of, 9
Disclaimer, 31 OR operator, 9
DO statement, 19 ORBIT.POV example, 29
DPMI support, 33 Order form, 35
DTA, 4 OWRITE function, 21, 27
Enzmann, Alexander R., 4 /P option, 7
EPILOG statement, 23, 27 PAREA function, 12
Example animations, 29 PI constant, 10
EXP function, 10 Piclab, 4
Exponential, 10 PLAY.EXE, 5
/F option, 6, 17 Polyray, 4
FAC function, 10 POV-Ray, 4
Finlay, Mark, 4 Precedence of operators, 9
firstframe variable, 16, 26 PRINTF function, 12, 21, 27
FLI file, 4 PULSE function, 12
Index 37
RAD function, 12
RANDOM function, 12, 17
READ function, 12, 25
Real-time, 33
Redirection operator, 3
Registering RTAG, 30
Registration form, 35
Regression analysis, 32
Relational operators, 9
ROUND function, 12
/S option, 7, 17
S&H Computer Systems, Inc.,
34
SEC function, 12
SEL function, 12
Sherrod, Phillip H., 30
SIN function, 12
SINH function, 12
SPLINE function, 12, 13, 14
SQRT function, 13
srand variable, 16, 17
STEP function, 13
stepinc variable, 16, 26, 27
Stone Soup Group, 4
STOP statement, 21
SUBCHAR statement, 22
Subscripts, 16
Syntax, 15
/T option, 7
TAN function, 13
TANH function, 13
Targa files, 4
TCP/IP, 34
Time control, 28
TOUR.POV example, 29
Trilobyte, 5
TSX-32, 33
TSX-Lite, 33
VAR statement, 15
Warranty, 31
Watkins, Christopher, 4
Wells, Drew, 4
WHILE statement, 19
WRITE function, 13, 26, 27
X windows, 33