Strings in P3D_DESC.TXT


                        P3D DESCRIPTION AND DEFINITIONS
by
Joel Welling
15 January 1993 18:03
Copyright (C) 1993 Pittsburgh Supercomputing Center, Carnegie Mellon Universit
Permission is granted to duplicate and distribute this document
without fee, so long as the above copyright notice is preserved in
all copies.
1. Introduction
The Pittsburgh Supercomputing Center 3D Metafile (P3D) is intended to serve
as a storage format for three dimensional models. The goal of the project is
to develop a representation that will be compact, portable, and flexible, and
can be created and examined or modified by a variety of software packages on a
variety of platforms. Although P3D is extensible to allow all the
functionality of model languages intended for photorealistic rendering (e.g.
Pixar's proposed Renderman standard), it is not intended for the production of
photorealistic images, or even to insure that different renderers will produce
identical images from a given P3D model. Rather, it is designed to provide a
format for the storage and transport of models which can be viewed on a variety
of platforms with a variety of rendering capabilities.
In order to provide maximum flexibility, it was decided that P3D would be a
complete programming language. This allows it to be used in the same fashion
as Postscript, with the creating application determining the structure of the
metafile based on its internal view of the model. Lisp provides a well- known
language which can be interpreted or compiled and is well-suited to describing
the directed acyclic graphs (DAGs) common in three dimensional modelling.
Hence, it was decided that P3D would be written as a set of extensions to
Common Lisp.
This document makes no attempt to describe Common Lisp itself. For details
on that language, see any of a number of texts, for example "Common Lisp - the
Language" by Guy Steele Jr. (Digital Press 1984). In practice, current
implementations of P3D (as of May 1989) run on a subset of Common Lisp called
Alisp. For details on this lisp, see Chris Nuuja's document on Alisp. This
provides a basis for P3D that can be easily distributed, plus some benefits in
security, at some cost in functionality.
2. Overview
A P3D model consists of graphical objects, called 'gobs' for short. These
objects may be primitives like spheres or triangle lists, or they may be built
up of simpler objects. The internal structure of a gob may (and probably will)
be a directed acyclic graph or DAG, the internal nodes of which are also gobs
and the leaf nodes of which are gobs consisting of geometrical primitives.
P3D supports sphere, cylinder, torus, polygon, polyline, polymarker, triangle
list, generalized mesh, spline surface, and text geometrical primitives. In
addition, light sources are treated as geometrical primitives and occupy leaf
nodes of the DAG.
Gobs are defined either by involking a function which returns a primitive
gob, or by listing the 'children' and possibly the attributes the new gob is to
have. A gob can be saved either by binding it to a name (for example, via a
lisp 'setq' function) or by including it directly into the list of children of
another gob. Color, material type, and backface cullability are examples of
attributes which might be associated with a gob.
P3D also defines primitive structures needed to support simple geometrical
and graphical entities like points, vectors, vertices, colors, and materials.
There is a structure used to represent a camera, which can be used within the
metafile to define a point of view. Transformations are represented as four by
four lisp matrices.
Rendering of a given view is triggered by the 'snap' function, which takes
two gobs and a camera structure as parameters. One gob supplies the
geometrical primitives, while the other supplies the lights; they can in fact
both be instances of the same gob. The camera structure defines the viewing
parameters. One of two possible actions may be triggered to perform rendering,
depending on the functionality of the underlieing renderer. If the renderer
cannot support a hierarchical geometry, the geometry DAG may be traversed
within the Lisp itself so that calls to the renderer are only made when
geometric primitives are found. If the renderer will support a hierarchical
geometry database, a call to the renderer can be made as each gob is defined,
so that at rendering time the DAG traversal is done entirely within the
renderer.
When the rendering process begins, a certain set of default attributes for
the model are assumed. As the DAG is traversed, each new gob may have
attributes or transformations associated with it. A gob's attributes are added
to those in effect above it on the DAG, superceeding the previous values of
attributes of the same type. Transformations are multiplied together in such a
way that at any given level a local coordinate system exists, and the
transformation from that coordinate system to the coordinate system of the
top-level gob (where rendering began) is the product of all the transformations
in between. Thus, for example, any gob can set a color to be inherited by its
children; if no gob farther down the DAG resets the color (and the vertices
used have no color of their own) geometrical primitives below that gob will
ultimately be drawn with the color given. Likewise, a transformation
associated with any gob can be used to change the ultimate position at which
the structures below it in the DAG will be drawn.
Any gob may be instanced arbitrarily many times in the geometry DAG; each
instance will inherit attributes and transformations independently from its
parents. Note that the DAG must remain acyclic or severe problems may result.
It is the programmer's responsibility to make sure that no gob is its own
decendent.
3. Syntax Rules and Special Conventions
The syntax of P3D is exactly that of Lisp. Each P3D metafile should begin
with the Lisp comment:
;P3D nnn
left justified on the first line of the metafile, where nnn is the release
number of the P3D specification to which the metafile conforms (for example,
2.1). This serves to identify the metafile as P3D rather than arbitrary lisp
code.
4. Coordinate Conventions and Orientation Rules
P3D assumes that all coordinate systems are right-handed. For example, if
the x axis of a coordinate system points to the right of a viewer and the y
axis points up, the z axis will point toward the viewer. The signs of
rotations are also assumed positive in the right-handed direction. For
example, a positive rotation of 90 degrees about the z axis will move a vector
initially pointing along the x axis into alignment with the y axis.
Coordinate transformations are represented by four by four matrices, as
follows:
rotation:
[ R11 R12 R13 0 ]
[ R21 R22 R23 0 ]
[ R31 R32 R33 0 ]
[ 0 0 0 1 ]
translation:
[ 1 0 0 Tx ]
[ 0 1 0 Ty ]
[ 0 0 1 Tz ]
[ 0 0 0 1 ]
scale:
[ Sx 0 0 0 ]
[ 0 Sy 0 0 ]
[ 0 0 Sz 0 ]
[ 0 0 0 1 ]
where R11 through R33 are appropriate rotation components, Tx, Ty, and Tz are
translation components in the x, y, and z directions respectively, and Sx, Sy,
and Sz are scaling factors in the x, y, and z directions respectively. With
these conventions, a point in three dimensional space will be represented by a
column vector, the first three components of which are the x, y, and z
coordinates of the point and the fourth component of which is always unity.
Transforming that point to a new coordinate system then corresponds to left
multiplying the column vector by the appropriate transformation matrix.
Note that it is never necessary to explicitly construct these transformation
matrices. P3D provides functions that construct them, as described in the
section on Geometric Transformations below.
The 'front' face of a polygon is also determined by a right hand rule. For
example, the front face of the triangle with vertices ( 0, 0, 0), ( 1, 0, 0),
and (0, 1, 0) is the face on the z>0 side. If the vertices of a polygon have
local normals (see below), and those normals are inconsistant with the facing
direction of the polygon as derived from the right hand rule, unpredictable
results may occur on rendering. Polygon facing may be used for backface
culling.
All text is drawn in a plane, the orientation of which is specified by the
'u' and 'v' vectors provided in the text primitive. The front face of the text
is derived by applying the right hand rule to these two vectors. If the 'u'
vector lies in the x direction and the 'v' vector lies in the y direction, the
front face of the text will be on the positive z side.
5. Memory Management Rules
The programmer need not worry about freeing memory associated with most P3D
structures, as the normal garbage collection mechanisms of Lisp will handle the
task. This is not always possible for gobs, however, as a gob may have
associated with it data structures in the renderer, and those data structures
must be freed when the gob is freed. Thus, several special functions are
needed to handle the memory management of gobs.
A gob is freed if and only if the following conditions apply. It must have
no parents which have not been freed, it must not be 'held' (see below), and it
or its last surviving parent must be explicitly freed. Functions to hold and
release a gob, and to free it, are described in the section on Geometrical
Objects below. It is important to use these functions when destroying a gob
which is no longer needed, so that memory within the renderer will be
reclaimed.
6. Primitive Objects
6.1. Point
The structure used to hold the coordinates of a point in 3-space is defined
as follows:
(defstruct point
(x 0.0) ;x coordinate
(y 0.0) ;y coordinate
(z 0.0)) ;z coordinate
It can be created via the function 'make-point', which can take the options
':x', ':y', and ':z', all of which are floating point numbers defaulting to
0.0. For example,
(setq origin (make-point))
is the definition of the standard symbol 'origin'.
6.2. Vector
The structure used to hold a vector in 3-space is defined as follows:
(defstruct vector
(x 0.0) ;x coordinate
(y 0.0) ;y coordinate
(z 0.0)) ;z coordinate
It can be created via the function 'make-vector', which can take the options
':x', ':y', and ':z', all of which are floating point numbers defaulting to
0.0. For example,
(setq x-vec (make-vector :x 1.0 :y 0.0 :z 0.0))
is the definition of the standard symbol 'x-vec'.
6.3. Color
The structure used to hold a color is defined as follows:
(defstruct color
(r 0.8) ;red intensity
(g 0.8) ;green intensity
(b 0.8) ;blue intensity
(a 1.0)) ;opacity
It can be created via the function 'make-color', which can take the options
':r' for red intensity, ':g' for green intensity, ':b' for blue intensity, and
':a' for opacity (sometimes called the alpha channel). All of these values are
assumed to be floating point values in the range 0.0 to 1.0 inclusive, with 0.0
being no intensity in that color or complete transparency. The defaults are
0.8 for each of the red, green, and blue values, and 1.0 or complete opacity
for the alpha value. For example,
(setq red (make-color :r 1.0 :g 0.0 :b 0.0))
is the definition of the standard symbol 'red'.
6.4. Vertex
The structure used to hold a vertex (a position in 3 dimensional space,
possibly with an associated color and/or normal vector) is defined as a struct
containing at least the following fields:
(defstruct vertex
(x 0.0) ;x coordinate
(y 0.0) ;y coordinate
(z 0.0) ;z coordinate
(clr nil) ;local color
(normal nil)) ;local surface normal
It can be created via the function 'make-vertex', which can take the options
':x' for x coordinate, ':y' for y coordinate, ':z' for z coordinate (these
three being floating point numbers), ':clr' (a color, as returned by
'make-color') for local color, and ':normal' (a vector, as returned by
'make-vector') for local surface normal. The coordinate values default to 0.0,
so the default location is the origin. The local color defaults to nil, so
that the vertex will be drawn with a color inherited from its parents in the
DAG. The local normal also defaults to nil; the renderer will attempt to
calculate a normal by interpolating the orientations of adjacent polygons if
this is the case. For example,
(setq red-origin (make-vertex :clr red))
will define a vertex located at the origin with a color of 'red' (as defined
above) and no normal.
6.5. Material
The structure used to hold a material (a set of properties used with
attributes like color to determine the appearance of an object) is represented
as a structure with at least the following fields:
Field Type Meaning
:ka float ambient light weighting factor
:kd float diffuse light weighting factor
:ks float specular light weighting factor
:exp float specular exponent
:reflect float reflection coefficient
:refract float index of refraction
:energy color energy density (for radiosity)
Other structure fields may exist, but they are maintained by P3D and should not
be modified by the programmer. A material should always be created with the
'def-material' function.
( def-material :ka ka-value :kd kd-value :ks ks-value
:exp exp-value :reflect reflect-value
:refract refract-value :energy energy-color )
parameters:
:ka ka-value (optional): ambient light
weighting factor
:kd kd-value (optional): diffuse light
weighting factor
:ks ks-value (optional): specular light
weighting factor
:exp exp-value (optional): specular exponent
:reflect reflect-value (optional):
reflection coefficient
:refract refract-value (optional):
index of refraction
:energy energy-color (optional): energy
density for radiosity
returns: material with the given characteristics
All the keyword-field pairs are optional. Fields which are not specified are
assigned specific default values; see the specification of the 'default-
material' predefined symbol at the end of this document for the default values
of each field.
A material can be used to describe the way light interacts with an object,
and thus its appearance. For example,
(setq aluminum-material (def-material
:ka 0.25 :kd 0.25 :ks 0.75 :exp 6.0 :reflect 0.75))
is the definition of the standard material symbol 'aluminum-material'. This
material is quite reflective, but has a relatively low specular exponent, so it
will appear shiny but not polished.
6.6. Camera
The structure used to hold a camera is defined as follows:
(defstruct camera
(lookfrom origin) ;eye point
(lookat origin) ;point to look at
(up y-vec) ;view's 'up' direction
(fovea 56.0) ;view included angle
(hither -0.01) ;hither clipping distance
(yon -100.0) ;yon clipping distance
(background black)) ;background color
Camera structs are used to define viewing characteristics for rendering. It is
created via the function 'make-camera', which can take the following options:
Option Type Meaning
:lookfrom point location of camera
:lookat point location at which camera is to point
:up vector direction from bottom to top of view
:fovea float camera opening angle in degrees
:hither float distance to hither clipping plane
:yon float distance to yon clipping plane
:background color background color
Both the lookat and lookfrom points default to the origin, so at least one
must be set to produce a valid camera. The camera's 'up' direction defaults to
the y direction. The fovea angle defaults to 56 degrees, and the hither and
yon distances default to -0.01 and -100.0 respectively. (Note that because the
coordinate system of the camera is required to be right-handed, the ':lookat'
point will lie in the negative z direction from the origin, so the hither and
yon clipping distances must be negative). The background color defaults to
black.
The following example defines a camera at the coordinates (0.0, 0.0, 20.0)
looking at the origin, with all other characteristics left at their defaults.
(setq this-camera (make-camera
:lookat origin
:lookfrom (make-point :z 20.0)))
7. Geometric Transformations
P3D provides functions to generate transformation matrices, as described in
the Coordinate Conventions section above. The functions are:
( make-translate Tx Ty Tz )
parameters:
Tx, Ty, Tz: floating point numbers giving distance
to translate in the x, y, and z directions
respectively.
returns:
a transformation matrix encoding the translation
( make-rotate axis angle )
parameters:
axis: vector providing the axis about which to rotate
angle: angle in degrees of the rotation
returns:
a transformation matrix encoding the rotation
( make-scale Sx Sy Sz )
parameters:
Sx, Sy, Sz: floating point numbers giving factors by
which to scale the x, y, and z directions
respectively
returns:
a transformation matrix encoding the scaling
( make-identity )
parameters: none
returns: a transformation matrix encoding the identity
transformation
( compose-transform trans1 trans2 )
parameters:
trans1, trans2: transformation matrices
returns: trans1 x trans2 (remember that subsequent
transformations should left multiply existing
transformations)
( compose-transforms trans1 trans2 trans3 ... transn )
parameters:
trans1 ... transn: transformation matrices
returns: trans1 x trans2 x ... x transn (remember that
subsequent transformations should left multiply
existing transformations). compose-transforms
is somewhat slower than compose-transform.
8. Geometrical Object (Gob)
A gob is represented as a structure with at least the following options:
Option Type Meaning
:attr assoc-list attribute-value pairs for this gob
:transform transformation coordinate transformation
:children list list of gobs to be children
Other structure slots may exist, but they are maintained by P3D and should not
be modified by the programmer. All of the fields default to nil.
A gob should always be created with 'def-gob', or with one of the geometrical
primitive generators (see below). If 'def-gob' is used, the definition should
include a ':children' option or the gob will have no decendents in the DAG and
thus be useless.
( def-gob :attr attrlist
:transform transformation
:children childlist )
parameters:
:children childlist (required): list of
children of this gob
:transform transformation (optional): coordinate
transformation for this gob
:attr attrlist (optional): association list of
attribute and value pairs for this gob
returns: gob with the given children, coordinate
transformation, and attributes
If old_gob_1 and old_gob_2 are previously created gobs, the following will
create a gob called new_gob which includes a coordinate transformation, and has
the two other gobs as children.
(setq new_gob (def-gob :transform (make-translate 1.0 0.0 0.0)
:children (list old-gob-1 old-gob 2)))
As described in the Memory Management section above, a gob can be 'held' to
guarantee that it will not be freed, and 'unheld' to permit reclaimation of its
memory. The 'hold-gob' and 'unhold-gob' functions have the following syntax:
( hold-gob gob )
parameters:
gob: gob to be held
returns: T
( unhold-gob gob )
parameters:
gob: gob to be released
returns: Nil
Applying 'hold-gob' to a gob which is already held is a null operation, as is
applying 'unhold-gob' to a gob which is not held.
A gob which is not held and which has no parents can be freed with
'free-gob'. This function causes memory associated with the gob in the
renderer to be freed; any future reference to the gob will be an error. The
children of the freed gob are checked to see if they have any other parents
(which have not themselves been freed); an orphaned child which is not itself
held is also freed. The syntax of free-gob is as follows:
( free-gob gob )
parameters:
gob: gob to be freed.
returns: Nil.
9. Attributes
Attributes are data other than geometrical data which is used in rendering.
Each gob can have associated with it a list of attribute-value pairs; this list
is stored in the gob's ':attr' slot. Attributes are inherited down the
geometry DAG, in such a way that a value for a given attribute on a gob which
is a close parent of a geometrical primitive (see below) will supersede a value
assigned that attribute farther up the DAG.
A gob's attributes are stored in an association list, of the sort searched by
the Common Lisp 'assoc' function. Association lists are of the form:
( (attr1 . val1) (attr2 . val2) (attr3 . val3) ... )
The following attributes are currently supported by P3D:
Attribute Value Default Meaning
'color color opaque white default color below this gob
'backcull T or nil nil enable backface culling
'text-height float 1.0 character height for capital
X character
'text-font string "simplex_roman" font in which text will
be written
'text-stroke-width-fraction
float 0.15 strokes with which text is
drawn will be this
fraction of text-height
'text-thickness-fraction
float 0.1 if the text has thickness
(perpendicular to u and v),
it will be this fraction
of text-height
'material material default-material material type for this gob
and its children
Any given renderer may ignore some of these attributes.
Because the DAG traversal process may reverse the order of attribute-value
pairs within a gob, the attribute list for a given gob should have only one
occurance of a given attribute.
The following example creates a gob with an attribute list setting a default
color of blue and enabling backface culling:
(setq sample_gob (def-gob
:attr (list (cons 'color blue)
'(backcull . T))
:children (list old_gob_1 old_gob_2)))
10. Geometrical Primitives
P3D defines a number of functions which return geometrical primitive gobs.
These gobs are leaf nodes in the rendering DAG; they have no children. These
primitives are rendered with the attributes inherited from their parents,
except in those cases where the vertices of the primitive specify the attribute
explicitly (e.g. color). The funcions which generate primitives are:
( sphere )
parameters: none
returns: gob containing a sphere of radius 1, centered at
the origin
( cylinder )
parameters: none
returns: gob containing a cylinder of radius 1, with the
symmetry axis aligned with the z axis. The cylinder
ends are at z= 0.0 and z= 1.0 .
( torus bigradius smallradius )
parameters:
bigradius: float specifying major radius of torus
smallradius: float specifying minor radius of torus
returns: gob containing a torus with the given major and
minor radii, with the hole in the torus running
along the z axis.
( polyline v1 v2 v3 ... vn )
parameters:
v1 ... vn: vertices to be connected by the polyline.
There must be at least two vertices.
returns: gob containing a polyline connecting the given
vertices. The polyline is not closed; i.e. vn is
not connected to v1.
( polymarker v1 v2 v3 ... vn )
parameters:
v1 ... vn: vertices at which markers are to be
drawn. There must be at least one vertex.
returns: gob containing a polymarker, the markers of which
are at the given vertices. The markers are of the
current marker type. Depending on the renderer,
the marker drawn may or may not be subject to
geometric transformations. For example, a marker
might be of constant size, or might scale with
the projection of the model.
( polygon v1 v2 v3 ... vn )
parameters:
v1 ... vn: vertices to form the perimiter of the
polygon. There must be at least three vertices.
returns: gob containing a polygon with the given vertices.
The polygon is closed automatically; i.e. v1 need not
equal vn.
comments: The appearance of non-planar polygons may vary
from renderer to renderer.
( triangle v1 v2 v3 ... vn )
parameters:
v1 ... vn: vertices to be used to form the triangle
strip.
returns: gob containing a triangle strip composed of the given
vertices. The strip is a series of triangles, each
defined by an adjacent set of three vertices from the
vertex list. Thus, the first triangle is composed
of v1, v2, and v3; the second of v2, v3, and v4; and
so on. The 'front' face of a triangle strip is
determined by the right hand rule for odd numbered
triangles, and a left hand rule for even numbered
triangles.
( mesh vlist flist )
parameters:
vlist: list of vertices included in the mesh
flist: list of lists of vertices, one list per
polygonal facet.
returns: gob containing a generalized mesh composed of the
given facets, which are polygons the corners of which
are in the given list of vertices.
comments: The vertices in the facet lists should be the same
vertices as those in the vertex list, not simply
different vertices at the same coordinate location.
For example, if v1, v2, v3, and v4 are vertices, the
following is a valid mesh:
(mesh (list v1 v2 v3 v4)
(list (list v1 v2 v3) (list v2 v3 v4) ) )
( bezier v1 v2 v3 ... v16 )
parameters:
v1 to v16: The control vertices of a 4 by 4 bicubic
Bezier patch.
returns: gob containing a 4 by 4 bicubic Bezier patch,
defined by the control vertices as follows:
*-------*--------*--------*
|v1 |v2 |v3 |v4
| | | |
| | | |
*-------*--------*--------*
|v5 |v6 |v7 |v8
| | | |
| | | |
*-------*--------*--------*
|v9 |v10 |v11 |v12
| | | |
| | | |
*-------*--------*--------*
v13 v14 v15 v16
The 'up' surface of the patch is defined by the
right hand rule circulating in the v1-v4-v16-v13
order, so that the above illustration's 'up'
direction is into the page.
comments: The patch passes through the corner vertices;
the other vertices define the shape of the spline
surface. The treatment of color and normal
information associated with the vertices is
renderer dependent.
( text point uvec vvec string )
parameters:
point: point in 3D space at which the text is to
be written.
uvec: vector in 3D space specifying the u axis
of the plane in which the text is to be drawn
vvec: vector in 3D space specifying the v axis
of the plane in which the text is to be drawn
string: character string to be written.
returns: gob containing a written character string. The
writing plane and other attributes are determined
by the inherited values of the appropriate 'text-'
attributes. The text is drawn starting at the given
point, in a plane the orientation of which is given
by the u and v vectors.
11. Lights
P3D provides two function which return light sources. These light sources
are gobs which serves as a leaf node of a DAG; they have no children. Light
sources can provide directional illumination, or can provide ambient background
light which illuminates all surfaces regardless of orientation. The functions
which produce these lights are:
( light location lightcolor )
parameters:
location: point in 3D space at which to place the
light source. (Note that some renderers will retreat
the light to infinity along the line from the origin
of the current coordinate system through the given
point).
lightcolor: color of the light to be emitted from
this source.
returns: gob containing a directional light source specified
by the given parameters.
( ambient lightcolor )
parameters:
lightcolor: color of the light to be emitted from
this source.
returns: gob containing an ambient light source of the given
color.
For example, the following defines a white light source at the coordinates (1,
0, 0) and binds it to the symbol 'new_light'.
(setq new_light (light (make-point :x 1.0 )
(make-color :r 1.0 :g 1.0 :b 1.0)))
12. Rendering
Once a geometry DAG and a DAG containing light sources has been constructed,
and a camera structure has been defined, the P3D 'snap' function can be used to
initiate rendering. (It is possible for a single dag containing both
geometrical primitives and light sources to be used for both the lighting and
geometry DAGs). The snap function has the following format:
( snap object lights acamera )
parameters:
object: gob containing the model to be rendered
lights: gob containing light sources
acamera: camera struct defining the field of view
returns: 'T
The exact action of 'snap' will depend on the renderer being used. For
example, a slow renderer might render the single given frame, while a dynamic
renderer might render the object continuously, allowing the point of view to be
changed via a knob box, until control was returned to the P3D interpreter.
13. Predefined Symbols
P3D predefines some symbols for commonly used constructs for convenience's
sake. The predefined symbols include the following:
Symbol Meaning Definition
origin point at origin (make-point :x 0.0 :y 0.0 :z 0.0)
x-vec x unit vector (make-vector :x 1.0)
y-vec y unit vector (make-vector :y 1.0)
z-vec z unit vector (make-vector :z 1.0)
white color white (make-color :r 1.0 :g 1.0 :b 1.0)
black color black (make-color :r 0.0 :g 0.0 :b 0.0)
red color red (make-color :r 1.0 :g 0.0 :b 0.0)
green color green (make-color :r 0.0 :g 1.0 :b 0.0)
blue color blue (make-color :r 0.0 :g 0.0 :b 1.0)
yellow color yellow (make-color :r 0.0 :g 1.0 :b 1.0)
cyan color cyan (make-color :r 1.0 :g 0.0 :b 1.0)
magenta color magenta (make-color :r 1.0 :g 1.0 :b 0.0)
null-transform identity transform (make-identity)
default-material default material (def-material :ka 0.8 :kd 0.8
:ks 0.3 :exp 30.0
:reflect 0.1 :refract 1.0
:energy black)
dull-material material type with (def-material :ka 0.9 :kd 0.9
low reflectivity :ks 0.1 :exp 5.0
:reflect 0.1 :refract 1.0
:energy black)
shiny-material glossy material (def-material :ka 0.5 :kd 0.5
type :ks 0.5 :exp 50.0
:reflect 0.3 :refract 1.0
:energy black)
metallic-material metallic material (def-material :ka 0.1 :kd 0.1
type, like chrome :ks 0.9 :exp 100.0
:reflect 0.7 :refract 1.0
:energy black)
matte-material material type with (def-material :ka 1.0 :kd 1.0
no reflectivity :ks 0.0 :exp 0.0
:reflect 0.0 :refract 1.0
:energy black)
aluminum-material aluminum (def-material :ka 0.25 :kd 0.25
:ks 0.75 :exp 6.0
:reflect 0.75 :refract 1.0
:energy black)
Table of Contents
1. Introduction 1
2. Overview 1
3. Syntax Rules and Special Conventions 1
4. Coordinate Conventions and Orientation Rules 1
5. Memory Management Rules 1
6. Primitive Objects 1
6.1. Point 1
6.2. Vector 2
6.3. Color 2
6.4. Vertex 2
6.5. Material 2
6.6. Camera 2
7. Geometric Transformations 2
8. Geometrical Object (Gob) 3
9. Attributes 3
10. Geometrical Primitives 3
11. Lights 4
12. Rendering 4
13. Predefined Symbols 4