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).