TITLE: Dolphins at midnight
NAME: Mark Mackey
COUNTRY: UK
EMAIL: mark_mackey@merck.com
TOPIC: Contrast
COPYRIGHT: I SUBMIT TO THE STANDARD RAYTRACING COMPETITION COPYRIGHT.
JPGFILE: mdmcpark.jpg
ZIPFILE: mdmcpark.zip
RENDERER USED: 
    Megapov 0.5

TOOLS USED: 
    3ds2pov, Gilles Tran's MakeTree macro, vi

RENDER TIME: 
    Roughly 260 CPU-hours

HARDWARE USED: 
    SGI

IMAGE DESCRIPTION: 


This image went through several incarnations before settling in its current
form. For a while I had been toying with the idea of creating a surrealist
image featuring a fish made of water leaping from an ocean of fish scales, but
had never actually started it. This still topic provided the impetus to get
going, but I couldn't make the image work. I settled on a dolphin rather than a
fish at this stage: I'm not sure why.

The problem with the original image was that it was too bare. I couldn't find
any inspiration for the background, and after fiddling with various sky
textures gave up on it. Inspiration returned when I was leaving work late one
night, and something about the stillness and the patterns of light and shade in
the car park sparked in my mind. One of the things on my POV 'to-do' list had
been a night scene: most of the scenes that I have done have either been in
daylight or indoors, and I was intrigued by the lighting possibilities of a
night-time scene.  So, the idea took shape: what could happen late at night
when nobody's around?

There were several different contrasts possible in the scene: natural vs
artificial, light vs shade, reality vs fantasy. I originally decided to aim
more for the 'natural vs artificial' divide, but completely failed to make the
dolphin model look realistic. As a result, I plumped for the 'reality vs
fantasy' idea, went back to my original idea and made the dolphin out of water.
It ended up looking like glass instead, but I suppose that it's difficult to
differentiate the two in a still.

I wonder what the cat is thinking?


DESCRIPTION OF HOW THIS IMAGE WAS CREATED: 


First: a warning if you try to trace this at home. This is a *large* scene: I
needed to get the car park looking as realistic as possible, and that meant
that the trees, the bushes, the leaf litter and the sky all had to be
accurately modelled. There are a lot of objects in the scene (over 700,000) and
it used nearly a gigabyte of memory per processor for the final trace. I traced
it in sections on a multiprocessor machine: the final trace was in 6-pixel-high
slices and the slice through the body of the dolphin took over 9 hours!

There is a large set of #declares at the top of the main scene file which turn
on or off most of the scene elements or reduce their detail, which made
development much faster since if I was altering the details of the splash I
could turn off all of the plants, change the lamp posts to a simple box with a
point light on top and render the bit of the scene that I wanted very quickly.

The first element of the scene which I developed was the 'splash'. It's an
isosurface: the function looks complicated but it was built up in stages. It's
basically the 'ripple' pattern modified with a couple of 1/(1+x^2) decay
functions. The main difficulty here was getting the decay right: I needed a
reasonable 'mound' of water in the middle without having the ripples spread too
far. The requirement that the ripples fade nicely into the plane of the road
was also tricky: I'm still not entirely happy with this but it will do.

The rest of the 'splash' is a macro which constructs a blob object by
distributing spherical blob components along a paraboloid, with the size of the
spheres being random but height-dependent (so that higher spheres were
smaller). A small amount of roughly normally-distributed noise is added to the
blob positions to prevent it looking too perfect. A bit more fiddling around
with the isosurface was needed at this point to get it blending into the blob
nicely.

I must confess: the dolphin isn't mine. It's converted from a 3DS model and
isn't really very good (low poly count). I tried to create a dolphin shape with
sPatch, but couldn't get anything decent and ran out of time. The fact that the
dolphin is transparent hides some of the inadequacies of the model. The cars
and bike aren't mine either (more 3DS models), although all required
more-or-less extensive tweaking to work well in the scene.

I set myself a challenge in this scene and used no maps. All of the surfaces
and pigments are procedural. The entire road surface including the lines and
oil spots is a single complicated texture! I found that there were a few
non-intuitive things about the syntax for textures (especially scaling
multi-part textures) which took some getting used to. This ended up being quite
a good learning exercise: I now know much more about POV's procedural texturing
than I used to!

The road surface and dirt are simple boxes with complicated pigments and
normals to roughen them. The dirt texture could use some more work (it looks
much better non-antialiased), but not much of it is visible so I didn't bother.
The gutters are CSG's generated by a macro in sections with some random jitter
of the segments: again, this was probably overkill since you don't notice the
detail. If I ever do a very high resolution trace of this for a poster or
something it may pay off, however. 

The bike shed and lamps are also simple CSG and isosurface objects with
emitting media for the glow effects. I played around with the lighting quite a
bit in this scene: the final lighting is quite complicated, with 11 area
lights, a point light source for moonlight and a coloured ambient.  The ambient
caused me some problems: I wanted to decrease the default ambient light since
it was easier than going through all of my textures changing their 'ambient'
values. However, if you just change the default ambient light then all of the
'Luminous'-style textures stop working well, so I had to declare values for the
ambient light components and then scale all of the colour values in my lamps by
those: complicated, but it worked. There's probably a better way of doing this.

All of the trees and bushes are generated using Gilles Tran's MakeTree macro or
a modification of it which I made to allow multiple leaf types on one tree
(used for the bushes on the left with berries). A 'hedge' macro takes a tree
object and places copies of it (with random rotations, scales, and jitter)
along a line. It's the hedges that cause the enormous memory requirements. The
small shrubs in the undergrowth are actually the same tree that was used for
the large hedge on the left. Many thanks are due to Gilles for his macro, and
also for the textures that came with it which were ruthlessly appropriated and
modified for the trees in this scene!

The scene at this stage in its development still looked too clean and
artificial, so I wrote a couple of macros which take an array of objects and
probabilities and either generate a 'pile' of randomly chosen objects or
scatter randomly chosen objects around a plane. This was used with an array of
leaf shapes to generate the leaf litter, which significantly reduces the
'cleanness' of the scene. With a bit more time I'd add a few more leaf types
and possible a couple of pieces of paper (with low probabilities).

The sky textures were modified from those in Michael Hough's sky tutorial
(http://members.aol.com/amaltheaj5/skytut1.html). Two separate skies are
blended into each other to give the effect of city lights off to the right. The
starfield came from a suggestion from John VanSickle (on
http://www.geocities.com/SoHo/Gallery/2006/ptip54.htm). I found that his
original version didn't look realistic enough: there were too many bright stars
and they weren't distributed evenly over the sky. The version included with the
source here biases the star brightnesses towards the low end and gives a much
more even distribution of stars. If memory was a problem you could probably
improve this macro further by culling stars which lay outside the view fulcrum.

The final elements added to the scene were the cat and the second dolphin. The
wake from the second dolphin is another isosurface: this one took a while to
get right and I'm still not entirely happy with it: it's a sine wave reflected
along one axis, cut into a triangle with two planes and then decayed from the
origin with another 1/(1+x^2) type function. The problem with this is that
there's a ridge left along the axis, but luckily that's not too visible in the
final scene. If anyone comes up with a clever idea on how to produce a better
'wake' surface then please let me know!

I had lots of trouble at the last minute with gamma-correction, since while
most of the individual parts of the scene were developed on a PC the full
traces were all done on SGIs, and the gamma of the monitors is quite different.
I fiddled around with POV's gamma correction at the last minute, but never
quite got the brightness of all of the scene elements right: in particular I'm
less than thrilled with the oil spots.  The sky needed some last-minute changes
also: that's why the cloud pigments are somewhat messily written!

I've included most of the source for the image in the ZIP file: I've left out
most of the 3DS models due to their size (if anyone wants them, just email me).

