TITLE: Birthday in the Clouds NAME: Philip Chan COUNTRY: Canada EMAIL: p_chan@shaw.ca WEBPAGE: www.ucalgary.ca/~phichan/index.html TOPIC: Surrealism COPYRIGHT: I SUBMIT TO THE STANDARD RAYTRACING COMPETITION COPYRIGHT. JPGFILE: pc_bday.jpg ZIPFILE: pc_bday.zip 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.