EMAIL: p_chan@shaw.ca
NAME: Philip Chan
TOPIC: Surrealism
COPYRIGHT: I SUBMIT TO THE STANDARD RAYTRACING COMPETITION COPYRIGHT.
TITLE: Birthday in the Clouds
COUNTRY: Canada
WEBPAGE: www.ucalgary.ca/~phichan/index.html
RENDERER USED: POV-Ray 3.5 (Windows)
TOOLS USED: Sheaffer Calligraphy Set
            HP ScanJet 5100C
            Adobe Photoshop LE 5.0
RENDER TIME: 5m 6s parse + 1h 42m 18s trace
HARDWARE USED: Athlon 1700+ XP, 256 Mb DDR RAM
               upgraded to Athlon 2400+ XP in mid August
IMAGE DESCRIPTION:
The "definition" of surrealism I'm working with is:
"Surrealist works can have a realistic, though irrational style, precisely
describing dreamlike fantasies..."
        -Michael Delahunt (http://www.artlex.com/ArtLex/s/surrealism.html)

This image attempts to place objects with a realistic feel into a dreamlike
environment.

DESCRIPTION OF HOW THIS IMAGE WAS CREATED:

This image departs from my usual techniques in that I didn't make as heavy use
of CSG with primitives as in my other submissions.  Instead of mostly using
primitives, this image made use of sphere_sweeps for parts of the candles, the
metal hooks for the balloons, and the strings.  Isosurfaces were used for the
blue icing on the cake.

In addition, the text on the cake was made using a calligraphy pen, scanned
into Photoshop, and edited for use as a height field.  This is also the most
"algorithmic" image I've made in the sense that I made use of a lot of while
loops in the code to place objects (both for the regularly placed objects and
the "randomly" placed objects), including a random placement algorithm for the
sprinkles with collision detection.

A more detailed and technical description of individual components follows:

Sprinkles:

The sprinkles themselves are simple CSG.  The placement algorithm selects a
random rotation and translation values and applies them to a 15 point
representation of the sprinkle object using the vrotate function.  The
distance from these points to the centre of the cake (y axis) is slightly
greater than the radius of the cake plus the thickness of a sprinkle.  The
trace function is then used to determine where the points would intersect with
the cake object.  If the distance from the intersection point to the y axis is
greater than a set threshold, then a collision occurred, and a new set of
rotation and translation values are generated.  If no collision occurs, the
sprinkle is added to the cake object used in the trace function (i.e. the Cake
object is redeclared in the loop as the union of itself and the sprinkle).

The colours are selected randomly in the algorithm, and sprinkles are only
placed on the front half of the cake to save time and memory.

Cake Decorations:

The text was written with a calligraphy pen and then scanned.  The brightness
and contrast of the scanned image was first adjusted to remove "ink flow" and
scanning defects, with the final result being a white on black image.  A bunch
of blur more filters were then applied to make the text fade from white to
black at the edges, thus generating a smooth edges for the text in the final
height field.

The flowers are merged, stretched spheres.  Placement information (scaling and
translation) for the flowers are stored in an array to make the code easier to
tweak.  Rotation is randomly determined in the placement loop.

The rainbow is made from seven torus sections.  Everything uses a similar
texture (slightly bumpy, specular highlight, semi-transparent), but because of
the shape of the rainbow, I couldn't get the highlighting to look the same as
the flowers or text.  I ended up using a light group to try to get better
results.

Blue Icing:

Isosurfaces based on the concept of wrapping a sine wave into a circle.
Imagine a cylinder.  Now vary the radius of that cylinder with the amplitude
of a sine wave.  Then make the radius also dependent on the y value, add twist
by varying the phase shift of the sine wave along the y axis, and you have the
objects lining to top of the cake.  The objects along the bottom are based on
a similar principle, but the way the radius varies along the x axis differs
for +/- x.  These are placed using while loops.  (For actual equations, refer
to the source code included in the .zip file.)

Candles:

A cylinder surrounded by several sphere_sweep objects for the white sections,
which stick out like on the real thing (although you probably can't tell in
this image).  The flame is a macro taken from my entry to the Worlds Within
Worlds round (January-February 2002).

Balloons:

The balloons are a two component blob object, differenced with a slightly
smaller version of itself to make it hollow while still maintaining some
thickness.  This is done instead of using the hollow keyword as the lack of
thickness in a hollow object causes the balloons to take on too much of the
colour of the object behind it when a filtering texture is used (this gives
more realistic, yellowish shadows).  The text on the balloons is a text
object intersected with a slightly larger version of the blob object.  The
bottom is a simple cone.

Strings:

The strings are sphere_sweep objects.  While loops were use to place the
points for the loop around the hook and the balloons (not really visible). A
slightly larger sphere is use for the knot.  There are two version of the
object with the bit of string hanging differently from the knot.

Hooks:

Also sphere_sweeps, as I felt this created a smoother look than the cylinder
and torus versions I used at first.  The texture is a silver texture from the
POV include files.

The hooks, strings, and balloons are placed with a bit of random rotation.

Sky:

The clouds are from skies.inc, modified slightly to work from the camera
looking down perspective.  The rainbow is a POV rainbow object.  The colours
are based on the one in the tutorial.  It took quite a bit of tweaking to get
it placed how I wanted.

Board:

Simple CSG and a texture from woods.inc.