Kuan-Loong Yong, Seth Green, Patti McLain
CS348B Image Synthesis
Final Project Writeup [edited]
Smoke
-----
Our group modelled smoke as a volumetric object specified completely by a
space-density function and an gas illumination model. The ray-marching
algorithm involves approximating an integral that accummulates color and
opacity along the ray [1]. We used Blinn's [2] formulation of the
Henyey-Greenstein phase formula to compute the brightness of a smoke
particle. In order to speed up the computation, we do not compute for
ray-object intersections when tracing light rays from a smoke particle to
the light sources. This has little effect on the believability of the
smoke object since it is so amorphous anyway. Note, however, that the
smoke does cast convincing shadows on other surfaces.
To get the right look for the smoke, we used a cone distorted by a simple
(1 - exp(kx)) function to suggest the effect of smoke clinging onto the
surface of the cigarette before dissipating upwards, which corresponds
rather closely to our observations. To give the cone a puffy smoke-like
appearance, we peturbed the cone by a 3D turbulence function. The amount
of turbulence is proportional to the square of the height of the smoke
particle. The density of the smoke drops off linearly radially, and as
a function of the square root of the height vertically. Although we chose
these functions arbitrarily, the result is very convincing.
Given this framework, animating the smoke becomes an extremely
straightforward task. By simply displacing the 3D turbulence function
downwards as a function of time, we create the illusion of rising smoke.
Water
-----
We introduced an automatic means of generating radial waves
with interpolated surface normals in our ray tracer. At run-time, the
program reads in a description of the wave surface and generates a huge
polyset, replete with an octree structure and per-vertex normals, on the
fly. The height of the waves vary sinusiodally with the distance from the
wave origin; their amplitude drops off linearly with increasing radial
distance. To add a touch of irregularity, we added a small amount of
low-frequency FBm noise to the wave function.
The water waves are also fully animatable. The program simply regenerates
a whole new polyset and discards the previous one whenever time
progresses.
Caustics
--------
We formulated an efficient way of simulating reflection caustics due to
undulating height fields by hybridizing Watt's backward beam tracing
technique [3] with well-known techniques in the field of two-pass texture
mapping [4]. Using Watt's caustic polygon approach, we rasterize polygons
onto an intermediate bounding cylinder surrounding the object we wish to
throw caustics on. We form each caustic polygon by tracing rays from the
light source to each vertex of a triangle on the polygonal mesh,
reflecting those rays off (each vertex of the triangle must have its own
normal for this approach to be effective), and rasterizing the caustic
triangle formed by those rays when they intersect the intermediate
cylinder. Rasterization occurs on a special texture map which we term a
"caustic map" that the program can easily index into given the cylindrical
coordinates of the point of intersection. The brightness of each caustic
triangle is uniform, and is simply a function of the dot product between
the the averaged normal of the triangle and the ray direction to the light
source, and the ratio of the area of the actual polygon to that of the
caustic polygon. Please refer to [3] for a detailed discussion of this
computation. For speed and simplicity, we do not compute for ray-object
intersections when casting caustic polygons on the intermediate surface.
The second stage involves treating the caustic map as an ambient color
map, and projecting it optimally onto the underlying polyset mesh. A
simple radial projection fails miserably when the object is highly
non-cylindrical because of excessive distortion. We present a better
approach:
Given a point on the polyset object, we find the further intersection of
the ray originating from that point and having a direction parallel to the
surface normal with the bounding cylinder (the ray can intersect the
cylinder at most twice), after discarding all vector components parallel
to the axis of the cylinder. This is essentially a 2D problem involving
the intersection of a line with a circle. The program does the caustic map
lookup based on that point of intersection. The ambient color returned
from the lookup is scaled by the dot product of the surface normal with
the axis of the bounding cylinder before the shader adds that to the
surface color computed from the regular phong illumination model. This
additional step is necessary to attenuate caustics on surfaces that point
in the direction of the axis of the cylinder. Notice in our renderings
that caustics do not appear on flat, horizontal surfaces pointing away
from the water surface.
Our mapping technique works remarkably well on surfaces which are not
highly cylindrical, as evidenced by our rendering of the cat polymesh. We
also noticed that, in order to get sufficient detail in the caustics, it
is necessary to subdivide the height field much more finely for computing
caustics than for actually rendering the height field itself. Our ray
tracer accomplishes this by storing two copies of each height field in
memory -- an ultra-high resolution mesh for creating caustic polygons, and
a lower resolution one used by the regular ray tracing pipeline.
***************************************************************
Cigarette Tip
-------------
The tip of the cigarette is modeled as a large number of small flat polygons to
simulate the flecks of charred tobacco that are produced by a burning
cigarette. Before being lit a cigarette tip contains about 10-50 pieces of
tobacco arranged in a somewhat spiral pattern. After burning the tobacco
breaks up into 100-1000 small flecks. Near the center of the cigarette the
charred tobacco is black, and on the outer edge it is colored white from the
burnt wrapping paper. The tip of the cigarette was modeled in Matlab and
exported as an inventor format file to be read by Composer. The tip is modeled
as a dense number of concentric rings which were then split into
equicircumferential slices. The vertices of each slice are perturbed by a
Gaussian noise function and a scaling function to give the end of the tip a
rounded appearance. Each vertex is given a diffuse color based on itıs distance
from the center.
*****************************************************************
Distribution Ray Tracing
________________________
The semi-diffuse reflections are based on the Gregory Ward
anisotropic reflection model [1]. The specular part Ward's
model is used, the diffuse portion of the reflection implements
the Whitted model. The diffuse portion of the Ward model is
equivalent to the Whitted model. The Ward model uses an elliptical
gaussian function for the specular component. To generate the
secondary rays using importance sampling, directions with the
highest contribution have a higher probability of being sampled.
Therefore, the sample rays are also generated from a gaussian
distribution, around the mirror direction, and equal weighting
is used for each of the rays. Multiple rays are only spawned
at the first reflection, since the return from spawning multiple
rays at each intersection is not computationally efficient, and
the contribution is lessened after each reflection.
Translucence is modeled similarly, the distribution is isotropic
about the refracted direction. The contribution of rays are weighed
equally. This gives the appearance of a mottled transparent
medium.
Penumbra-
To generate penumbrae lights were modeled as axis-aligned boxes.
This was computationally efficient, and does provide softened
shadows. To model lighting in an environment to evaluate different
lighting selections, a more faithful approach to modeling the
light extent should be made. Shadow rays were uniformly generated
that intersect the box. All rays provided equal contribution to
the shadowing.
Camera Animation
________________
The animation of the camera is computed by providing 3 camera
data sets from composer. The animation uses the 3 sets of data
as control points for a quadradic Bezier curve. Therefore,
the first and last points are interpolated with the intermediate
point providing the control.
***************************************************************
References
----------
[1] Kajiya and Kay 1989
Ray Tracing Volume Densities
SIGGRAPH 89, vol 18, pp 165-174
[2] Blinn, James 1982
Light Reflection Functions for Simulation of Clouds and Dusty
Surfaces.
SIGGRAPH 82, vol 16, pp 21-29
[3] Watt, Alan and Mark Watt 1992
Advanced Animation and Rendering Techniques
ACM Press, pp 253-256
[4] Bier, E. A. 1986
Two part texture mapping
IEEE Computer Graphics and Applications, Sep 1986, 6(9), pp 40-53
[5] Peitgen and Saupe 1988
The Science of Fractal Images
Springer-Verlag, pp 100-101
[6] Ward, Gregory
Measuring and Modeling Anisotropic Reflection
Computer Graphics 26, 2, July 1992