This chapter begins with a survey of different techniques used for
modeling water surfaces. Later, the bumpmap technique for modeling
water is described.
Mark Watt at Digital Pictures in London has done work on rendering light-water interaction : how light is reflected at the surface of the water and how it is refracted by the surface. He presents a variation of backward ray tracing called backward beam tracing. There has been work done where the water surface is stored as a height map or 3D surface. We briefly discuss this method in section 3.3.
The scenery we decided to model is a view of a sunset as we look
into the horizon at a slightly wavy ocean that reflects the light from the sun as it sets.
The straightforward way to create this sunset scene is to model a 3D
surface or possibly a height map. The surface's reflectiveness, the direction of the sun
and the surface definition can then be fed to a ray tracer. The problem with this approach
is that it is a time consuming, slow process, and the definition of the topology of the
surface requires a huge amount of memory, as the surface extends towards the horizon. It
is possible to use the repeatedness of the waves and then map the waves over the area. The
problem with this approach is that waves on the ocean consist of a number of superimposed
waves with different amplitude, wavelength and direction and this is also how the surface
should be modeled. We have used 5 waves in our implementation. The result is that the
surface will not repeat itself over and over again as an exact copy of the previous wave.
We use a modified technique of bump mapping in order to resolve this problem.
A bumpmap is a pattern, or a (2D) matrix of normal vectors that are mapped onto a surface. These could be thought of as micro surfaces. The surface that the bumpmap is mapped to has one "general surface normal" (i.e. it does not consider small deviations), but the micro surfaces' normals will differ from this "general surface normal" when the surface is examined at a closer range. It is this difference that is stored in the bumpmap. This can represent a wave in a simplified format so that the normal vectors are just as they would be describing a wave, but the actual surface is completely flat as shown in Figure 4.
Please note that the problem that the surface is not repeating
itself as an exact copy of the previous wave is still to be solved.
Instead of using a matrix containing the normal vectors for the whole surface, the normal could also be calculated as a function of the position in relation to a reference point. This means that only the normals needed for displaying each pixel have to be calculated.
A number of waves defines the surface. The waves in turn are
defined, in terms of amplitude, direction and wavelength. It is also possible to specify
the wave shape. In our implementation we use sine curves to obtain the wave shape.
A simple ray tracer was created for this purpose.
After specifying the viewpoint and the viewplane, rays are shot through every pixel in the viewplane. The intersection point and the intersection angle can be calculated since the viewpoint and the position of the pixel are known. The water is a flat surface with a bumpmap textured on it. The normal vector of the surface can be calculated using the point of intersection.
Angle of surface normal vector = tan-1(Ai *sin((POI-R) Di) )
If the surface normal is 0º it points straight up and if it is 90º
is in pointing in the direction of the wave. The number of superimposed waves is set by n
and Ai is the amplitude of wave i. POI-R is the vector from R to POI and denotes the dot product. Di (see Figure
5) is the direction vector of the wave and determines also the wavelength. Once the
normal at POI is known, the reflecting ray R can be found.
The angle between the direction vector of the sun and the reflected
ray will determine the color of that pixel.
An angle of 0º will give the pixel a white color and angle greater
than or equal to 90º => dark blue color.
The inputs that are needed for this technique are direction vectors, amplitude and frequency for the waves and a direction vector for the sun. The viewpoint and the viewplane must also be specified for the ray tracer. The information can be stored in less that 100 bytes!
A reasonably realistic sunset was successfully model (Figure 9).
There are some situations where this technique is not well suited. The fact that the
surface is flat is a simplification that can reveal itself. If a wave form is created so
that waves are breaking (typical for large waves when they approach the shore) then this
technique will completely fail, since it only allows one surface normal per position on
the (flat) surface.
In this simplified implementation the sun is reflected, but no cliffs or other objects will be reflected. The waves will also look unrealistic when they hit a shore. It is very easy to modify and create a variety of waves using the above method. The only restriction is that the waves can not be too large or be breaking.
Because of the simplifications, this technique is fast in comparison to defining the whole topology of the surface or using height maps and ray trace the image. For example it takes approximately one minute and 20 second to create one 1024x500x256 image with six superimposed waves on a 100MHz 486 PC. Ray tracing the same quality image will take considerably more time according to our experience.