1 Synthetic Texturing 1.1 Introduction

advertisement
1 Synthetic Texturing
1.1 Introduction
This dissertation describes improved methods for computer generation of many of the
patterns found on animal fur, scales and skin and shows a method for placing these patterns
on complex surfaces. Examples of such patterns include the clusters of spots on leopards and
jaguars called rosettes, the large, plate-like spots on giraffes and the stripes-within-stripes
found on the lionfish. This dissertation explores the patterns that can be created by simulating
a chemical mechanism called reaction-diffusion. This is a process in which several chemicals
diffuse over a surface and react with one another to produce stable patterns of chemical
concentration. Reaction-diffusion is a model of pattern formation that developmental
biologists have proposed to explain some of the cell patterns that are laid down during embryo
development. This dissertation demonstrates that simulation of a reaction-diffusion system
can be used to create synthetic texture, that is, patterns on the surfaces of computer models.
As an example of this, the top of Figure 1.1 shows a horse model with a white surface and
the bottom shows this same model with zebra stripes created by reaction-diffusion.
My thesis is:
Noticeably improved biological textures on complex surfaces can be generated
by first tessellating a surface into a mesh of fairly uniform regions and then
simulating a reaction-diffusion system on that mesh to create a final texture.
The field of computer graphics has been quite successful at creating models and images of
man-made objects. Most manufactured objects have surfaces that are fairly smooth and that
have very little color variation, and such objects are captured well by current graphics
techniques. More of a challenge to computer graphics is simulating natural scenes that
contain surfaces with rich patterns of color and surface detail. Nature abounds with complex
patterns: the ruggedness of a mountain range, the cracking pattern of tree bark, the blades of
grass in a field, the veins of a leaf, the pattern of bristles on a fly. This dissertation is directed
towards capturing some of the richness and complexity of patterns found in nature. The
patterns presented here take us a step closer to creating convincing natural scenes by
simulating a biological model of pattern formation (reaction-diffusion) to create an array of
textures that resemble patterns found in nature.
The advantages of using simulations of reaction-diffusion to create patterns are both in the
natural look of the patterns and also in the natural way in which these textures can be fit over
Figure 1.1: Stripe texture created using reaction-diffusion. Top is an untextured
horse and the bottom shows zebra stripes on the same model.
the surface of a particular model. This gives substantially improved images over previous
procedural texturing methods for creating images of animals that have color variation across
their fur or skin.
What advantages might there be of using a model that is biologically inspired to create
realistic images? Often the computer generated images that look the most real are those that
take into account as much knowledge as is possible about the real world. For instance, the
highlights on shiny surfaces originally were created using ad-hoc formulas for light reflection
-2-
[Phong 75]. Now more convincing highlights are made by taking into account the
microscopic features of a surface [Blinn 77] [He et al 91]. Computer graphics researchers
learn about optics and the properties of materials to better simulate how light illuminates
surfaces. As another example, consider the convincing images of plants that have been
created by taking into account the measured sizes and growth patterns of the leaves and
branches of specific plants [de Reffye 88]. Here again, more knowledge of the real world
results in more convincing images. Similarly, to create better looking synthetic patterns, we
can try to understand how patterns of color form in nature. In particular, biologists have
shown how reaction-diffusion systems can produce a wide number of the patterns that are
found on animals; these patterns can then be used to texture the surfaces of objects in
computer generated scenes.
There are three major issues in texturing that guide much of the computer graphics work on
textures: user control, image realism and image quality. User control is concerned with what
influence users can exert over the final image. Although we would like not to burden the user
with too many tasks and choices while creating a textured object, they should be able to guide
the look and placement of the texture. The controls provided to them should be simple and
intuitive, just as the accelerator and brakes in a car are easy to understand and to use. Another
important issue in texturing is realism. The patterns of the textures should look as close as
possible to textures in the real world. These textures should not be stretched or distorted and
should not show unnatural seams. Related to the issue of realism is image quality. The most
important aspect of texture quality in a final image is how well the texture is filtered. That
is, how well is the texture represented on the screen, especially when the texture is magnified
or compressed. Texture realism, quality and user control are issues that will come up often
in this dissertation.
1.2 Overview of Dissertation
This dissertation demonstrates that reaction-diffusion can be integrated with each of the
stages needed to create an image that contains textured objects. The dissertation is organized
as follows:
Synthetic Texturing (Chapter 1): This chapter gives a definition of texture and outlines the
three steps needed to create a synthetic texture. Much of the literature on textures in computer
graphics is surveyed here. An idealized system is outlined for creating textures using
reaction-diffusion. This is a system that may be built in the future using the techniques
presented in this dissertation. Chapters 3, 4 and 5 present new results that take significant
steps towards realizing such a texturing system.
Developmental Biology and Reaction-Diffusion (Chapter 2): This chapter gives an
overview of various models of animal development. Much of this chapter is devoted to two
views of the cell: cell actions and the different forms of information available to a cell. This
gives two perspectives that are useful for understanding the formation of patterns in a
developing embryo, and several pattern formation models are discussed. In particular, this
chapter introduces the reaction-diffusion model of pattern formation.
-3-
Reaction-Diffusion Patterns (Chapter 3): This chapter is concerned with creation of
specific patterns using reaction-diffusion. It begins by providing a more detailed view of the
literature on reaction-diffusion in developmental biology than is given in the previous
chapter. It then demonstrates that a cascade of more than one reaction-diffusion system can
be used to create a variety of patterns found in nature. Using multiple reaction-diffusion
systems to create patterns is a new result presented in this dissertation.
Mesh Generation for Reaction-Diffusion (Chapter 4): This chapter presents a method for
creating a reaction-diffusion texture that is tailored to fit a given surface. This is a central
contribution of this dissertation. The chapter shows that a fairly uniform mesh of cells can
be created over an arbitrary polygonal model. Such a mesh can be used to simulate reactiondiffusion systems for texture creation. To build such a mesh, first a set of points is evenly
distributed over a model by causing the points to repel one another. Then the final simulation
mesh is constructed by building the Voronoi regions surrounding each of these points. A
reaction-diffusion simulation can then be carried out over this mesh to produce patterns of
chemical concentration. The final patterns of concentration fit the geometry of the given
model. Also, this method allows users to control the way in which feature size or other
parameters are to vary over the surface of a model.
Rendering Reaction-Diffusion Textures (Chapter 5): This chapter describes two new ways
of rendering reaction-diffusion textures. Textures are created by interpreting as colors the
patterns of chemical concentration over an irregular mesh whose creation was described in
the previous chapter. The high-quality (but relatively slow) method averages the colors of
nearby mesh points to give the color at a particular pixel. This averaging of mesh points is
based on a cubic weighting function that falls off smoothly with distance. A faster (but lowerquality) way to render such textures is to re-tile a model based on the simulation mesh and
color the triangles from the re-tiling to create the pattern. Creating a hierarchy of meshes can
speed up both these methods of rendering.
1.2.1 Guide to Related Work
Because this dissertation touches on a number of issues in graphics, there are many related
articles in the computer graphics literature. For ease of understanding, the description of a
particular article is placed at the beginning of the chapter where the article’s results are the
most relevant. Chapter 1 describes previous work on texture synthesis and texture mapping.
Chapter 2 gives pointers into the literature of developmental biology that relates to pattern
formation. This is standard material in developmental biology that is organized in a manner
that is most relevant to pattern creation for computer graphics. Chapter 3 gives an overview
of the work done on reaction-diffusion patterns in the biology literature. Chapter 4 describes
other work done in computer graphics on mapping of reaction-diffusion textures [Witkin and
Kass 91]. Chapter 5 covers the literature on texture filtering.
-4-
1.3 A Definition of Texture with Examples
Before discussing the details of synthetic texturing it is useful to have a working definition
of texture in the context of creating images by computer:
Texture is any change in surface appearance across an object that can be effectively
separated from the gross geometry of that object.
The most straightforward way that a surface’s appearance can change is to have its color vary
at different positions on the surface. A picture on the wall of a living room is a good example
of a texture that varies the color of a surface. The picture can be separated from the description
of the room’s geometry by storing the picture in a two-dimensional array of colors.
Computer-generated textures were first used in early flight simulators built by General
Electric for NASA [Schachter 83]. The motivation for using textures in these simulators was
to give cues for judging distances during flight training. The first of these simulators,
completed in 1963, displayed no more than a patterned ground plane and sky in perspective.
These were two-color textures created by combining four levels of square mosaic patterns
using modulo 2 addition. The more detailed pattern components faded with distance, but no
attempt was made to smooth the edges between the square components of the texture. This
resulted in distracting jagged edges in the texture. Textures provide important visual cues in
flight training, and nearly all modern flight simulators incorporate textures in scene
generation.
Texture mapping was introduced to graphics in its modern form by the work of Ed Catmull
[Catmull 74]. Catmull’s work centered on the display of objects that are described by cubic
surface patches. His algorithm for creating images used a depth-buffer, which is an array of
distance values for each pixel in the final image. The display algorithm divides patches into
smaller and smaller pieces until they are the size of a pixel, and then places the color of a small
patch into the final image if its distance is less than the currently stored depth in the depth-
N
observer
E
R
reflected
object
shiny surface
Figure 1.2: Light interacting with perfectly shiny surface.
-5-
Figure 1.3: Example of environment mapping. The Utah Teapot
reflecting the UNC Old Well
buffer. The patches are described as cubic functions that map a square in 2D parameter space
into 3D positions. Textures are placed on a patch by creating a correspondence between a
rectangular stored array of colors and this 2D parameter space. The parameter limits for each
patch are kept during the subdivision process, and the texture color is averaged over these
parameter limits to give the color at a pixel.
Textures can also be used to change surface properties other than color. For instance, textures
can be used to approximate the way in which light reflects off a perfectly shiny surface. With
mirrored surfaces, light bounces off the surface much like a pool ball bounces off the side of
a billiard table. This is shown in Figure 1.2, where we can find what light travels in the
direction E towards the observer’s eye by tracing the path of a ray away from the surface in
the reflected direction R. The color of the surface that this ray would strike is the color that
an observer would see at this location on the mirrored object. Performing this ray tracing is
computationally expensive when compared with the simple intensity calculation used for the
diffuse surface [Whitted 80]. A simple and fast way to approximate this effect is given in
[Blinn and Newell 76]. We can make the simplifying assumption that the objects surrounding
the reflecting surface are far from the surface. We can then compute an environment map
from the viewpoint of the object. The environment map is a collection of six rendered views
of the world surrounding the object, one view for each face of a cube surrounding the mirrored
object. Now when the mirrored object is rendered, the environment map is consulted to find
the reflected color instead of performing a costly ray trace through the world. Figure 1.3
shows the use of environment mapping to simulate the effect of reflection on a shiny teapot.
Here again, surface appearance is separated from geometry, in this case by storing the distant
environment in a texture.
-6-
light source
N
L
intensity = N • L
diffuse surface
Figure 1.4: Diagram of how light interacts at a location on a diffuse surface.
(a)
(b)
(c)
(d)
Figure 1.5: Using bump mapping to modify surface normals.
Figure 1.6: Example of bump mapping (center) and displacement mapping (right).
-7-
Another property that a texture can modify is the normal vector to the surface [Blinn 78]. To
understand what this will do, we first need to examine a simple lighting model. Let us assume
that we have a surface that is a completely diffuse reflector, that is, assume that light striking
the surface will be scattered equally in all directions, regardless of the direction of the light
source. Figure 1.4 shows a small piece of a surface, where the unit vector N points in the
normal direction (directly outward from the surface) and the unit vector L points towards the
light. For a totally diffuse surface, the intensity I of light leaving this surface in any direction
is proportional to the dot product N • L. This means that more light impinges upon and leaves
a diffuse surface when the direction of the light is nearly pointing head-on to the surface. If
the light is nearly grazing a diffuse surface then the surface will catch and reflect very little
of the light.
We are now ready to see what change in appearance will occur when the surface normals are
changed based on a texture. The idea of bump mapping, described in [Blinn 78], is that a twodimensional array of scalar values can be used to represent small height changes to a surface.
Blinn found that a surface can be made to look bumpy if the surface normals are perturbed
based on these height values, and that the actual position of the surface doesn’t need to be
altered to give convincing bumps. Figure 1.5 shows an example of this. Part (a) of the figure
represents a one-dimensional slice of a flat surface. Part (b) shows a height field that will
modify the left surface, and part (c) shows the new height that results from putting together
parts (a) and (b). Part (d) shows the original surface shape with the modified surface normals.
Rendering the surface using the modified surface normals produces patterns of light and dark
across the surface that are convincingly like what actual bumps would look like, yet the
surface actually remains smooth. Figure 1.6 shows an un-textured sphere on the left and a
bump mapped sphere in the center. It is the change in the normal direction N as it is used in
the lighting model that gives the change in intensity over the center surface. Notice that the
Figure 1.7: Transparent texturing.
-8-
silhouette of the center surface is still smooth because the geometry has not been changed,
only the surface normals are altered during the lighting calculations.
Another surface characteristic that can be modified by textures is transparency. Figure 1.7
shows a translucent sphere, an opaque sphere and a sphere whose transparency has been
modulated by a simple texture. Gardner has used transparency-altering textures to produce
realistic images of clouds [Gardner 85].
If textures can be used to change the color, reflection, normal direction, and transparency of
a surface, then can textures also be used to modify the actual position of a surface? The answer
is yes, and the technique is called displacement mapping [Cook 84]. The right portion of
Figure 1.6 shows an a sphere whose surface position has been altered by a displacement map.
Notice that not only does the intensity vary over the surface as it does with bump mapping,
but the silhouettes are also bumpy. This is because the position of the surface has been
changed by a displacement map prior to hidden surface elimination. Displacement mapping
separates the fine geometric detail of an object from its gross shape. Notice that displacement
mapping satisfies the definition of texture given above.
1.4 The Three Steps to Texturing (Previous Work)
The process of texturing a surface can be broken down into three stages: 1) texture
acquisition, 2) texture mapping, and 3) texture rendering. As an example of these three
stages, consider the cubic surface patch in the left portion of Figure 1.8. The image in the
middle of this figure was captured using a digital camera. Next, the mapping stage consists
of finding a function that maps points in the texture’s space onto points of the surface being
textured. In this case, the texture’s space is the two-dimensional rectangle that contains color
values of the image. This space can be indexed by a two-dimensional vector (u,v). The cubic
Figure 1.8: Texturing a cubic surface patch.
-9-
surface is a patch that is defined by mapping parametric values in the unit square [0,1] × [0,1]
into three-space. Positions on the patch correspond to two-dimensional coordinates (s,t) in
this unit square. The texture can be mapped onto the surface patch simply by identifying the
texture coordinates (u,v) with the parametric coordinates (s,t). Finally, the actual rendering
of the texture must bring together the texture definition, the texture mapping function and the
reflective properties of the surface to create a final textured image, shown at right in the figure.
Below we will discuss each of these stages of texturing. Notice that decisions about one of
the stages will often influence the methods chosen for the other stages in the texturing
process.
1.4.1 Texture Acquisition
How a texture is acquired for a given object depends on the kind of texture being used. There
are currently two broad classes of textures recognized in computer graphics: image-based
textures and procedural textures. Image-based textures are stored arrays of color values that
represent a particular picture or pattern. Using a digital paint program is a fairly common way
of defining image-based textures. Another way to capture an image is to use an image scanner
or a digital camera. The photographic image of Figure 1.8 is an example of this. Another
method of creating an image-based texture is to render a synthetic image and use the resulting
picture as a texture. All of these methods create two-dimensional arrays of gray-scale or color
values that represent a picture or a pattern.
Quite a different approach for defining a texture is to give a mathematical description of a
pattern. Such a texture is known as a procedural texture, and creating such textures is often
called texture synthesis. Several methods have been proposed that use composition of
various functions to generate textures. Gardner introduced the idea of summing a small
number of sine waves of different periods, phases and amplitudes to create a texture [Gardner
84]. Pure sine waves generate fairly bland textures, so Gardner uses the values of the low
period waves to perturb the shape of the higher period waves. This method gives textures that
are evocative of patterns found in nature such as those of clouds and trees. Perlin uses bandlimited noise as the basic function from which to construct textures [Perlin 85]. He has shown
that a wide variety of textures (stucco, wrinkles, marble, fire) can be created by manipulating
such a noise function in various ways. [Lewis 89] describes several methods for generating
noise functions to be used for texture synthesis.
Blinn and Newell briefly described how a texture can be created by specifying a twodimensional frequency spectrum and taking its inverse Fourier Transform to make a final
pattern [Blinn and Newell 76]. Lewis expanded on this idea to make a method of creating
textures that is halfway between digital painting and procedural texture creation [Lewis 84].
He demonstrated how a user can paint an “image” in the frequency domain and then take the
Inverse Fourier Transform to create the final texture. He shows how textures such as canvas
and wood grain can be created by this method.
None of the methods for texture synthesis described above attempt to model the actual
- 10 -
physical processes that produce patterns in the real world. Some of the textures generated
by function composition produce images that look quite real, but some physical phenomena
are likely to prove too difficult to mimic without modeling the underlying processes that
create the texture. One example of this is the wood solid texture demonstrated by Peachy that
mimics the way trees create concentric rings of dark and light wood [Peachy 85]. Another
example of modelling natural processes are the way different wave functions can be summed
to produce the effect of water waves [Schachter 80] [Max 81]. Still another example of using
physical simulation for texture creation is the dynamic cloud patterns of Jupiter in the movie
2010 [Yaeger and Upson 86]. Another example of how physical simulation can be used to
generate textures is the texture synthesis method using reaction-diffusion presented in this
dissertation. Creating patterns by physical simulation of natural processes is a rather
involved method of defining textures procedurally.
An important issue that arises in making procedural textures is how to guide the synthesis to
give a desired pattern. For instance, we might want to use Gardner’s sum-of-sines to make
a texture of cirrus clouds. How many sine functions should we use and how large should we
make the sinewave amplitudes? Typically, we would find ourselves trying out different
values for parameters of the texture function until we get a pattern we like. We would like
to get a “feel” for which parameters changed particular aspects of a procedural texture
function. This kind of parameter exploration can be made more pleasant if the textures can
be created and displayed rapidly. For instance, some procedural textures can be generated
at a rate of several frames per second on the Pixel-Planes graphics engine [Rhoades et al 92].
Rhoades and his co-authors describe a system in which a user can change texture parameters
and cause dynamical updating of textured objects by turning a joystick knob or moving a
slider bar. The issue of user parameter control must be addressed for any procedural method
of texture creation, and we will return to this issue when we look at the parameters for
reaction-diffusion textures.
1.4.2 Texture Mapping
Once a texture has been created, a method is needed to map it onto the surface to be textured.
Often an image texture is represented as a two-dimensional array of color values, and one can
think of such a texture as resting in a rectangle [0,m] × [0,n] in the plane. Mapping these values
onto a complex surface is not easy, and several methods have been proposed to accomplish
this. A common approach is to define a mapping from the unit square to the natural coordinate
system of the target object’s surface. For example, latitude and longitude can be used to
define a mapping onto a sphere, and parametric coordinates may be used when mapping a
texture onto a cubic patch [Catmull 74].
In some cases an object might be covered by multiple patches, and in these instances care
must be taken to make the patterns match at the common seams of adjacent patches. For
example, suppose a model of a cow’s body was composed of five large patches, one patch
for each of the four legs and a fifth patch for the rest of the body. Further suppose there are
separate dappling textures for each of these patches. A leg patch must have a pattern that
matches itself where opposite edges join together from the patch wrapping around the leg.
- 11 -
Furthermore, the patterns of each leg must match the pattern of the body patch where the leg
meets the cow’s body. A successful example of matching textures across patches has been
shown for the bark texture of a maple tree [Bloomenthal 85].
An important issue in texture mapping is finding a way to give the user control over how a
texture is placed on a surface. One method of mapping that offers the user some amount of
control is to create a projection of the texture onto the surface of the object. An example of
this approach is to allow the user to orient the texture rectangle in 3-space and perform a
projection from this rectangle onto the surface [Peachey 85]. Related to this is a two-step
texture mapping method given by [Bier and Sloan 86]. The first step maps the texture onto
a simple intermediate surface in 3-space such as a box or cylinder. The second step projects
the texture from this surface onto the target object.
A different method of texture mapping is to make use of the polygonal nature of many
graphical models. This approach was taken by [Samek 86], where the surface of a polygonal
object is unfolded onto the plane one or more times and the average of the unfolded positions
of each vertex is used to determine texture placement. A user can adjust the mapping by
specifying where to begin the unfolding of the polygonal object.
Each of the above methods have been used with success for some models and textures. There
are pitfalls to these methods, however. Each of the methods can cause a texture to be distorted
because there is often no natural map from a rectangle to an object’s surface. This is a
fundamental problem that comes from defining the texture pattern over a geometry that is
different than that of the object to be textured. One solution to this problem can be found in
a sub-class of procedural textures known as solid textures.
A solid texture is a color function defined over a portion of 3-space, and such a texture is easily
mapped onto the surfaces of objects [Peachey 85] [Perlin 85]. A point (x,y,z) on the surface
of an object is colored by the value of the solid texture function at this point in space. This
method is well suited for simulating objects that are formed from a solid piece of material such
as a block of wood or a slab of marble. Solid texturing is a successful technique because the
texture function matches the geometry of the material being simulated, namely the geometry
of 3-space.
1.4.3 Texture Rendering
The purpose of texturing is to create images of synthetic objects that are visually enhanced
by the surface patterns given by the textures. Rendering a textured object is the process of
bringing together the information about the texture, the mapping of the texture and the
object’s geometry to create a final image. Much of the work in texturing has concentrated
on minimizing the visual artifacts that can arise in texture rendering.
The most noticeable texturing artifacts result from a phenomenon known as aliasing.
Aliasing occurs when high-frequency patterns appear as if they are lower-frequency patterns.
This can be seen in the checkerboard at the left of Figure 1.9. The moiré patterns near the
- 12 -
Figure 1.9: Aliased checkerboard (left) and anti-aliased version (right).
horizon illustrate that the high frequencies from many squares bunched close together can
look as though there is a lower-frequency pattern with fewer features in a given region. The
jagged edges between the squares is another example of aliasing. One way to minimize
aliasing artifacts is to filter the texture, averaging the color values in an area of the texture to
determine the color at a given pixel. There is a large body of literature on texture filtering,
and good starting points in this literature are [Heckbert 89] and [Mitchell and Netravali 88].
One way to think about the issue of texture filtering is to consider what needs to be done to
faithfully render a texture in extreme scene instances. For example, consider what should
happen when a textured object is far away in a given scene so that it covers very few pixels
in the image. In this case, many texture elements should contribute to the color of a single
pixel. Averaging the color values from many texture elements means filtering the texture.
A filter that averages together many color values from a texture is known as a decimation
filter. The opposite extreme is when an object is very near the viewer in a scene, so that a
single texture element may cover many pixels in the final image. The surface pattern will look
blocky if care is not taken, revealing the discrete nature of the stored texture. Averaging
between several nearby color values can make the underlying grid of the texture less apparent.
A filter that reconstructs a color value from very few adjacent texture elements is called a
magnification filter.
The extremes of magnification and decimation do not give the whole story of texture filtering.
There are many issues to consider when deciding how texture values should be averaged
together to contribute to a final image. This topic will be considered in more detail in Chapter
5 as a preliminary to how reaction-diffusion textures can be rendered. All the issues described
above are relevant to rendering of patterns created by reaction-diffusion.
- 13 -
1.5 An Idealized System
Now that we have examined the topics of texture synthesis, mapping, and rendering, we can
consider how all these methods may be brought together in practice. This section describes
a session that a user might have with a hypothetical system for texture creation. This is an
idealized system for texturing objects using reaction-diffusion. The example will serve to
highlight the major issues involved in texturing a model with a reaction-diffusion pattern. Let
us assume that a user has a polygonal model of a large cat and wants to fit a leopard spot pattern
onto this model. Traditionally, the user would create a spot pattern on a rectangular surface
(probably using a digital paint program) and then painstakingly work to map this image
texture onto the surface of the cat. Using this traditional approach, the user would have
trouble avoiding visible seams when wrapping the texture around the legs and would also
encounter problems when trying to make the pattern uninterrupted at the junction between
the legs and main body. As an alternative to this method, let us see how we might use reactiondiffusion to place a spot pattern on the cat model.
The first step is to find a reaction-diffusion system or a cascade of such systems that produces
the desired pattern of spot clusters. The user picks a pattern that most closely resembles the
desired pattern from a catalog of cascade patterns. Perhaps the spots look too regular, so the
user decides to increase the randomness in the underlying chemical substrate. A simulation
of this on a small grid gives the look the user wants, and now he or she begins to make
decisions about how the pattern’s scale should vary across the model. The leopard should
have smaller spots on the legs and head than on the main portion of the body. The user
specifies this by selecting key points on the head and legs of an un-textured image of the cat
and indicating that at these locations the spots should be roughly three centimeters in
diameter. Likewise, key positions on the cat’s body are selected to have six centimeter spots.
These parameters are automatically interpolated across the model’s surface, and the values
are bundled together with the parameters of the cascade process and sent to a program that
generates the final texture on the surface of the cat. The program creates a mesh over the
surface of the model and then simulates the given reaction-diffusion process on the mesh to
create the spot pattern.
There are two ways that the resulting pattern can be used to create a final image. The first
method is to create a re-tiled version of the polygonal model based on the simulation mesh.
The polygons of this re-tiled model are then colored based on the chemical concentration
given by the reaction-diffusion simulation. The user can view and manipulate this polygonal
model on a graphics workstation. For a higher quality image, the user can invoke a renderer
that has been enhanced to display textures directly from a texture mesh. Such a renderer uses
a cubic weighted average of mesh values to avoid visual artifacts resulting from the discrete
nature of the underlying mesh. If the cat is positioned far from the viewer, the renderer may
generate the cat’s image from a more coarse representation of the model’s geometry, and it
may also use a version of the texture where the higher frequency components have been
eliminated. Using such simplified models speeds the rendering process without noticeably
affecting the image quality.
- 14 -
There are four issues that the above example illustrates:
-
creating complex patterns with reaction-diffusion
specifying how parameters vary across a surface
generating a texture that fits the geometry of a model
rendering images efficiently and without artifacts
The remainder of this dissertation tells how each of these issues in texturing with reactiondiffusion patterns can be addressed.
- 15 -
2 Pattern Formation in Developmental
Biology
The goal of this chapter is to provide an overview of pattern formation models in developmental biology. This will provide context for understanding the specific developmental
model of reaction-diffusion and also present other models of pattern formation. Some of
these other models may also prove useful to computer graphics. The chapter begins by giving
an overview of the important issues in embryo development. Further details should be sought
in an introductory text on developmental biology such as [Gilbert 88]. The remainder of the
chapter describes models of pattern formation, describing them according to the information
cells are thought to receive and actions that cells can perform.
A major goal of developmental biology is to explain how the seemingly unstructured object
that is the fertilized egg can, over time, change into a complex organism such as a fruit fly
or a human being. The first few stages of development of an embryo are very similar for most
multi-cellular animals, from simple worms to amphibians, birds, and mammals. During early
stages of development, the cells of the embryo undergo numerous divisions to create many
cells. At the same time, these cells are arranging themselves spatially to lay out the basic body
plan of the animal. The fates of these cells are also being decided during this process. A cell
of the early embryo has the possibility of becoming almost any cell type. Later in the
developmental process, however, a given cell has fewer possible fates with respect to its
ultimate cell type.
The central issue of animal development is the arrangement of all the cells into their proper
positions in the embryo according to cell type. There are roughly 200 different cell types in
humans [Alberts et al 89], and during development all of these cells must be positioned
correctly in the embryo. For instance, pigment cells should find their way to the skin, and
the cells of the central nervous system must come to be in the spinal column or brain. Each
of the cells ends up in its proper place within the animal, and this occurs either through cell
movement or by cells becoming specialized based on their position. Developmental biology
seeks to understand the mechanisms that produce this geometric arrangement of cells
according to cell type. We will need an understanding of some of the components of a cell
and their functions before we return to this issue.
2.1 Introduction to the Cell
Biologists commonly view the embryo as a collection of cells. One reason for this view is
that a cell is the smallest portion of an embryo that can act somewhat independently of other
parts of the developing organism. In mammals, for example, the macrophage cells act in such
an independent fashion that they almost seem to be whole, single-celled creatures that freely
travel through our circulatory system and the surrounding tissues. A cell’s plasma membrane
is a clear division between the cell and the environment outside of the cell. It is this membrane
that allows a cell to regulate the concentration of proteins and ions present inside its
cytoplasm. The chromosomes, the DNA within the nucleus of the cell, store the vast majority
of the information needed to guide the actions of the cell, including those actions necessary
for development. The synthesis of proteins within the cell is dictated by the DNA. Together,
the plasma membrane, the DNA and the many proteins in a cell can be thought of as the skin,
the brain and the active and structural parts of a cell that give the cell a separate identity.
The information in DNA includes directions for the general actions and upkeep of the cell and
also directions for the cell’s embryonic development. The information takes the form of
genes that control the production of specific proteins and RNA. Protein are created by the
processes of transcription and translation. Transcription is the creation of an RNA molecule
that is a copy of the information present in a gene. When this RNA codes for a protein, it is
called a messenger RNA or mRNA. mRNA’s are an intermediate form of information along
the pathway from DNA to protein. An mRNA molecule encodes the information controlling
the amino acid sequence from which one or more protein molecules may be produced. The
process of reading the mRNA and forming a protein molecule is called translation.
Transcription is pivotal in embryo development. Control of transcription is a large part of
the control over what proteins are produced by a given cell. The difference between one cell
type and another is a difference in the proteins that are being manufactured within the cells.
All cells have the same information contained in their DNA, so the differences between cells
are a result of which genes are being transcribed within each cell. Thus cells of a given tissue
type can be characterized by which genes are turned “on” (which are being transcribed) and
which are turned “off.”
Throughout development, the cells in the embryo become increasingly specialized. Any
single cell from the four-cells stage of a sea urchin embryo can develop to produce an
complete sea urchin if it is separated from the other cells. This shows that such an early cell
is unspecialized. Later in development, a cell separated from the rest of the embryo is quite
incapable of developing into a whole animal and will instead form abnormal structures that
resemble parts of an animal. Such a cell is said to be determined, which means that the cell
has travelled some distance down the path of increased specialization. Determination of a
cell is closely related to what genes are being transcribed in the given cell. To give another
example, a cell of the neural crest might become either a pigment cell or a neuron depending
on later events, but it cannot become a blood cell. It is presumed that these cells have
particular genes that are turned on or off, and that this limits the fate of these cells. Thus we
can view development as the control of gene transcription in order to create the geometry of
the embryo.
- 17 -
2.2 Animal Development
We are now in a better position to understand the central question of animal development:
How are cells geometrically arranged according to cell type? This is a question about the way
genes control the geometry of an embryo. How can the genes (and the proteins that the genes
encode) dictate the final geometry of an animal? It is known that there are groups of genes
that are somehow responsible for placing the legs of a fly on its thorax instead of on its head.
What signals are present in an embryo to guide the placement of the thumb of the left hand,
in contrast to its final position in the right hand? In the regeneration of a salamander arm, the
nearer portion grows back first and the hand and fingers are the last parts to re-form. What
mechanism keeps track of the parts that have already been regenerated and what part should
be created next?
There are two basic mechanisms for placing a cell correctly in the embryo according to its
tissue type. One way is for the cell to move to the correct position in the embryo. This can
mean that a cell actually crawls through the embryo to the correct position, a process known
as migration. This can also mean that the embryo folds, stretches or otherwise changes its
shape to bring the cells to their proper location. The second way a cell can come to be
positioned correctly is for the cell to somehow “know” where it is and for it to change into
the proper cell type based on this information. This means that a cell may differentiate based
on geometric information.
The process of development is a complex mixture of the two mechanisms of cell placement
described above. Cells do not purely rely on movement to arrive at their proper position, nor
do all cells remain stationary and change their cell type based on position. Development is
a complex web of events that can involve both basic mechanisms. For instance, a group of
cells may differentiate into different cell types based on their position along the length of
embryo, then some of these cells may migrate to a new location, and finally these cells might
further differentiate based on their new position. In the sections that follow, it will be helpful
to keep in mind these two broad mechanisms of development. Cell movement and
differentiation based on information about position both contribute to the embryo’s development.
The remainder of this chapter is divided into three sections. The first of these sections
describes in more detail some of the actions a cell may take during the course of development.
This will give us a better understanding of how cells participate in shaping an embryo. The
next section describes the forms of information available to cells in a developing embryo. A
cell may use information to guide its migration or to decide how to differentiate further. The
final section describes how the information available to a cell and the actions that a cell may
perform can be brought together to lay down patterns in an embryo.
2.3 Cell Actions
There are two complementary aspects that are essential to a cell's participation in development: the actions a cell can perform to influence development and the information on which
- 18 -
the cell bases its actions. Many of the actions a cell can perform can directly influence the
form of an embryo. Examples of such actions include changing cell shape or size, migrating,
dividing, and dying. Some actions, however, have a rather indirect influence on development; examples include the internal change in the state of a cell (determination) and the
secretion of chemicals that will later influence development. Both direct and indirect
mechanisms of change are discussed in more detail below.
2.3.1 Cell Division
Cell division is the most conspicuous mechanism of change in the very early embryo. The
first task of the fertilized egg is to make a rapid transition from an egg to an embryo with many
cells. It is only when the embryo is composed of a number of cells that it can begin to change
its shape and that different portions of it can become specialized. Most of the cells in the early
embryo divide rapidly, providing many cells with which to form patterns. An exception to
this, however, is that the cells of the early embryo of vertebrates do not divide rapidly.
The rate of cell division is not the only contribution that division has on development,
however. Also important is the direction in which a cell divides. The early cell divisions in
an embryo are carefully oriented to aid in setting down the overall body plan. In the sea
urchin, for example, cells that arise from what is known as the animal pole have a different
fate than cells of the vegetal pole (see Figure 2.1). The first and second divisions of the sea
urchin embryo split the egg into four cells that each have an animal and vegetal portion. Each
Figure 2.1: Cell division transforms the egg into a blastula.
- 19 -
Figure 2.2: Gastrulation.
of these cells can go on to develop into a complete sea urchin if separated from the others.
The third cell division then splits each of these four cells into an animal and a vegetal cell,
defining much of the orientation of the embryo. None of the eight cells resulting from this
division can create a whole normal embryo if separated from the other cells.
2.3.2 Shape Change
Another mechanism of development in the embryo is shape change of cells. An important
example that emphasizes the importance of shape change can be found in early development
in sea urchins and frogs. During gastrulation in these animals, the vegetal portion of the
embryo flattens out and then fold in towards the hollow cavity called the blastocoel (Figure
2.2). The change in shape at the lower portion of the embryo is thought to be caused by the
cells actively changing their shape. First, these cells become elongated in the direction
perpendicular to the cell's surface. This flattens the embryo at the pole. Then these same cells
become constricted on their outward-pointing end, giving them a characteristic pyramid
Figure 2.3: Formation of neural tube.
- 20 -
shape. This shape change causes the lower sheet of cells to fold in towards the hollow center
of the embryo. These cells form the endothelial layer of cells that are destined to give rise
to particular organs and tissues in the adult embryo. Similar changes in cell shape appear to
contribute to the formation of the neural plate and the neural tube (Figure 2.3).
2.3.3 Migration
Cell migration is movement of a group of cells from one portion of an embryo (away from
their cell neighbors) to another part of the developing animal. Migrating cells typically take
on quite a different role at the destination site than the cells that were already present at the
destination. This is a more curious developmental mechanism than cell division and cell
shape change. Why do cells need to migrate, instead of having cells at the destination site
take on the role of the migrators? The answer to this is probably not simple, but it is thought
that much of the answer can be ascribed to historical, or evolutionary, reasons.
Whatever the reason for cell migration, it is a fact of development. One example of cell
migration in sea urchin embryos is the movement of cells from the far vegetal pole into the
blastocoel during gastrulation. These cells, called micromeres, separate themselves from
their neighbors, crawl through the outer shell of the embryo, and individually take up new
positions attached to the inner surfaces of the cells that compose the hollow blastocoel. The
individual cell motions are distinct from the flattening and folding of the lower region that
also is part of gastrulation. The cells arising from micromeres secrete the skeleton of the sea
urchin.
Cell migration plays an important role in other aspects of development besides gastrulation.
Another important migration occurs when many of the cells from the neural crest move to
other portions of the embryo to become pigment cells and various cells in ganglia, glands, and
teeth. Still another example of cell migration can be found in animals with a central nervous
system. In these higher organisms, migration of the axons of neurons plays a central role in
wiring the brain. This is a different kind of migration, where the cell body remains fixed and
only part of the neuron actually moves. Both the mechanisms that guide the axons and the
way in which the axons move through tissue are similar to the actions performed when an
entire cell migrates, and it is for this reason that axon migration is considered a special form
of cell migration. However, axon migration could also be considered an extreme form of cell
shape change.
In this discussion of cell migration we have ignored how a cell knows which direction to
travel. This is a question of how a cell acquires information, and the issue will be addressed
later, with other issues about forms of information within an embryo.
2.3.4 Materials from Cells: The Cell Matrix, Hormones and Morphogens
There are a number of ways that a cell can help steer the course of development by creation
and release of chemical products. An important example is the way in which cells create the
support structures within an organism. The spaces between cells are composed of many
- 21 -
proteins and carbohydrates that comprise the extracellular matrix. The components of the
extracellular matrix include collagen, a fibrous material that forms a strong framework for
tissue, and proteoglycans that allow tissue to resist compression. Also part of the matrix are
molecules that form potential adhesive sites, places where a cell can attach permanently, or
temporarily as “hand-holds” during migration. All of these materials are created by cells and
are essential to development.
There are other sorts of molecules that a cell can release that contribute to development.
Hormones are chemicals that are released into the circulatory system that can trigger
responses by cells at many points in an animal. For instance, ecdysone is an insect hormone
that causes the transition from one larval stage to another or causes the final transition to insect
adulthood. It causes the shedding of the insect’s old exoskeleton to reveal the new, still soft
exoskeleton of the next insect form. Hormones are chemical signals that regulate changes
across the entire organism.
Another kind of chemical signal is called a morphogen, and, as the name implies, morphogens
are signals for change of form. Although there is some debate within developmental biology
about the scope of the term, we will interpret the word broadly. We will say a chemical is
a morphogen when it freely diffuses through groups of cells or tissue and causes cells to
follow different developmental pathways depending on its local concentration at each cell.
Morphogens play a large role in two models of how patterns in an embryo are formed, and
we will return to these models in section 2.5 on pattern formation.
2.3.5 Cell Death
A well-documented and widespread mechanism in development is the case of cells dying to
aid in shaping the embryo. Cell death plays a major role in the shaping of hands and feet in
birds and mammals. These extremities are shaped like paddles early in limb formation,
without any separation of the digits. Then, cells in four regions on the hand-to-be die off,
leaving four gaps between the portions of the hand that become the fingers. These cells are
fated to die in order to help shape the hand or foot. Cell death is also important in the
development of the nervous system. In vertebrate embryos, several motor neurons may
initially form synapses with the same muscle cell. Then, through some form of competition,
many of the neurons lose their connection with the muscle cell. The neurons that are left
without a connection to a muscle cell then die. Here again, cell death is a normal part of the
development process.
2.3.6 Determination
All of the cellular mechanisms of development described above are ways that a cell may
interact with its embryonic environment. There is another cell mechanism that plays a vital
role in development but that goes on entirely within a cell. Determination is an internal
change of state in a cell that locks the cell into a particular course of development. The cells
of the neural crest illustrate determination. At a certain point in development, these cells
migrate to other locations in the embryo to become pigment cells, cells in the sensory ganglia,
- 22 -
or one of several other kinds of cells. Cell transplant studies have shown that a cell is not yet
fated to become a particular cell type before it begins migration from the neural crest. Before
migration the cell is said to be undetermined. Once the cell has migrated away from the neural
crest and arrived at one of the possible destinations, that cell soon is locked into a particular
pathway of change that fits the role it will play in the destination tissue. At that point the cell
is said to be determined. It should be noted that there is often no one determination event for
a particular cell, but instead a cell becomes more and more specialized throughout the course
of development. Thus calling a cell determined or undetermined really should be viewed in
the context of how specialized other cells are at the same point in development.
For cells migrating from the neural crest, the determination of the cell is triggered by cues
from the environment at its destination. The act of determination, however, is an event that
is internal to the cell. In some cases (probably most) the actual determination event is a
change in the way proteins are bound to DNA often reinforced by slight modifications to the
DNA itself (such as methylation). A change might either block or turn on the expression of
a particular gene, and the protein coded by that gene may trigger any number of other events
within the cell. Biologists speak of a cascade of gene expression, where one gene’s activity
causes many other genes to become active in a particular sequence. The details of such
cascades of expression are only now becoming evident in a few specific cases. One such case
is the cascade of expression that lays down the segmentation in the developing fruit fly.
2.4 Information that Guides a Cell
As mentioned earlier, the actions a cell may perform is only half the story about a cell’s
participation in development. Equally important are the various forms of information that
guide a cell’s actions. These forms of information include: chemical messages, haptotactic
gradients (changes in stickiness), mechanical forces, electric fields and the internal state of
a cell. Some of the forms of information described below (such as chemical messages)
naturally correspond to particular actions of a cell (such as production of a chemical).
Viewing these products again, as information instead of actions, gives us a useful additional
perspective.
The discussion below is organized according to the form taken by information, that is,
according to the information carrier. It will also be useful to consider the information
contents. There are several different kinds of information important to a cell in a developing
embryo. These include: guidance for migrating cells, information about position within the
embryo for cells that remain stationary and information about the timing of events within the
embryo. This view of information in an embryo will be especially useful in Chapter 3, where
our goal is to simulate pattern formation using a computer model.
2.4.1 Chemical Messages
Morphogens and hormones are two kinds of chemical messages that guide development.
Hormones are very simple chemical triggers that are meant to be received by many cells at
once through an organism in order to synchronize an event, such as the casting off of an insect
- 23 -
exoskeleton, or to control the rate of a given process. A cell that detects the hormone is not
concerned with where the message came from or the quantity of the chemical. The hormone
is just a messenger that says it is time to perform a particular action. In contrast, morphogens
are chemical messages that convey information about geometry. The morphogen typically
conveys this geometric information by its variation in concentration (chemical gradient)
across different portions of an embryo. A cell that detects a morphogen will travel down one
of several developmental pathways depending on the morphogen concentration that it
detects.
Probably the most clear examples of morphogens (in the above sense) are some of the proteins
that diffuse through the early fruit fly embryo. Seven pairs of segments are formed during
the course of development of a fruit fly larva. More than a dozen genes have been identified
that participate in determining this pattern of segmentation of the larval fly. There are at least
four distinct stages to this process of segment formation, and different genes that participate
in defining the segments are active at different times during this process. The proteins
produced by some of these genes have been shown to be present in graded concentrations
along the head/tail axis of the embryo. In some cases it has been shown that the concentrations
of such proteins cause different cells to follow different developmental pathways. Experiments have shown that if the concentrations of certain chemicals are changed then this
disturbs later development of the embryo. See [Alberts et al 89] for an overview of this
subject.
Hormones and morphogens usually deliver their messages to stationary cells. There is
another form of chemical message that is used to guide cells that are in motion. Chemotaxis
is the attraction of a cell to a particular chemical, called a chemoattractant. The job of a
chemoattractant is geometric, like a morphogen, but in this case the task is to guide a
migrating cell to a particular position. Biologists have identified potential instances of
chemotaxis in developing embryos, but identifying the chemoattractants has proved to be
difficult.
2.4.2 Haptotactic Gradients
Chemical messages are not the only form of information that may be used to guide a migrating
cell. Haptotaxis is the attraction of a cell to regions of increased stickiness. The word “haptic”
means “relating to touch,” and in this case it means the sense of touch of a cell. A migrating
cell makes and breaks contact with the extracellular matrix. The idea behind haptotaxis is
that a migrating cell may preferentially move in the direction of higher adhesiveness because
a stickier contact is likely to pull the cell in that direction. Haptotaxis has been demonstrated
in the laboratory [Harris 73] and there is evidence that haptotaxis guides the migration of the
pronephric duct cells in the salamander embryo [Poole and Steinberg 82].
2.4.3 Electric Fields
Another possible source of information in an embryo is electric fields. Electric fields have
been detected in many living organisms, including early chick embryos [Jaffe and Stern 79]
- 24 -
and in the regenerating limbs of some amphibians [Borgens 82]. Experiments are inconclusive about whether these fields play a role in development. Measurement of an electric field
at a particular location gives information about both field strength and direction, so there is
certainly the potential for such fields to be a source of geometric information.
2.4.4 Structural Information and Mechanical Forces
As we have discussed, migrating cells may be directed by chemical or adhesive gradients.
Another guiding factor for migrating cells is the structure of the extracellular matrix in which
they are moving. Some portions of the extracellular matrix contain fibers that are stretched
preferentially in one direction. It has been shown in laboratory conditions that migrating cells
are influenced in their motion by the way the structures in the matrix are aligned [Weiss 34].
When cell motion or shape is influenced in this manner it is called contact guidance. Because
contact guidance has been demonstrated in the laboratory, it is tempting to guess that this is
also a factor for cells migrating in the developing embryo.
Everything within an embryo is made either directly or indirectly by cells. This means that
the preferential stretching of fibers within the extracellular matrix must result from the
activities of cells (excepting forces from outside the embryo). Indeed, fibers taken from the
extracellular matrix have been shown to be preferentially stretched in laboratory experiments. In particular, fibroblast cells in a petri dish will gather together into clumps when
placed on a collagen substrate [Stopak and Harris 82]. The cells alter the collagen so that fiber
bundles are stretched between these clusters of cells. Moreover, film of this organizing
activity shows that cells not already in such a cluster seem to move along these stretched fibers
as if the fibers are providing contact guidance. As with any study of cells outside the living
organism, we should be cautious when drawing conclusions about what goes on in the
developing animal. Nevertheless, these studies are suggestive, and we will return to
mechanical forces when we talk about broad mechanisms for pattern formation.
2.4.5 Contact Inhibition
There is another kind of response a migrating cell may have to certain forms of contact. Often
when a migrating cell comes to touch another cell it will back away from the point of contact.
This is known as contact inhibition. It is easy to see how contact inhibition can help to
disperse a clump of cells or to more evenly distribute a given type of cell through a region
of the embryo. There is evidence to show that contact inhibition plays a role in the initial
dispersion of cells from the neural crest [Rosavio et al 83].
2.4.6 Internal State of Cell
In the earlier section on determination we discussed how a cell may change its internal state
to set the course of its development. Thus we can think of a cell’s internal state as another
source of information for the cell. A large part of a cell’s state is determined by which genes
are actively being transcribed from the cell’s DNA and translated into proteins. The
- 25 -
transcription of DNA is partly controlled by the binding of transcription factors to particular
locations along the DNA.
There are other sources of information internal to cells. Some of the actions that a cell
performs are guided by timing mechanisms within the cell. An important example of this is
the timing of cell divisions. This is a complex topic, and it is only recently that much of the
timing mechanism for cell division has become understood [Murray and Kirschner 89].
Still another source of information is the protein and mRNA already present in the egg during
the time of fertilization. The genes coding for such molecules are termed maternal-effect
genes because the gene products are transmitted solely from the female zygote; the male
zygote does not contribute to the proteins and mRNA of the fertilized egg. An example of
a maternal-effect gene is demonstrated by a maternal-effect mutation called snake in the fruit
fly. The wild-type mRNA product of this gene (no mutation) is present in the fertilized fruit
fly egg. The protein coded by this gene has been shown to be important in determining the
dorsal/ventral orientation of the embryo (backside versus belly). An embryo with the snake
mutation on both chromosomes lacks this protein coded by the maternal-effect gene, and such
embryos are badly deformed [Anderson and Nusslein-Volhard 84]. This illustrates that part
of the geometry of the embryo can be dictated by information purely internal to the early cells
of the organism.
2.5 Pattern Formation
One of the largest differences between higher animals and plants is in their strictness of body
plan. Although each plant species has a distinct style or motif in the way its leaves, branches,
flowers and so on are laid out, there is considerable variation in geometric detail between
individuals from the same species. We can recognize a weeping willow by a collection of
characteristics, like the typical bend of its branches, but two willows never have the same
number of branches in an identical configuration. This variation of geometric detail in plants
stands in strong contrast to the fixed body plan of animals. A given normal individual animal
always has the same geometric form as other members of the same species. It is this constancy
of geometry that allows us to say that a spider has eight legs and that the human femur is the
same shape across all individuals. The process of realizing the blueprints for a developing
animal is called pattern formation. To be more precise, pattern formation is the process by
which differentiated tissue is laid out within an embryo according to a fixed geometric plan.
Pattern formation is a higher-level view of development than the cellular viewpoint that we
adopted earlier. In examining how patterns form, we are interested in observing the fate of
large collections of cells. Nevertheless, we can take a reductionist attitude towards pattern
formation and ask how the actions of many individual cells ultimately determines the
geometry within the animal. The sections that follow examine four mechanisms for pattern
formation: the gradient model, reaction-diffusion, chemotaxis, and mechanical change.
Each of these mechanisms can be examined from the standpoint of information available to
the cells and the actions that these cells perform.
- 26 -
Head
Tentacles
Foot
Figure 2.4: Hydra.
2.5.1 Gradient Model
In an earlier section we discussed cell differentiation based on the quantity of a chemical
called a morphogen. Because one of the characteristics of a morphogen is that it can freely
diffuse through an embryo, the best candidates for morphogens are small molecules or ions.
The central issue for pattern formation based on a morphogen is the creation of a fixed, stable
pattern of concentration throughout the embryo. There is more than one way in which the
concentration of a morphogen can be caused to vary across different positions in the embryo.
One way is for the chemical to be produced at one location in the embryo (the source) and
for that chemical to be broken down at another location (the sink). Diffusion causes the
morphogen concentration to vary from regions of high concentration (near the source) to
regions of lower concentration (near the sink). This gives a stable variation of concentration
of the morphogen if a balance is struck between the creation and breakdown of the
morphogen. This basic model is known as the gradient model for pattern formation. This
model has recently received a good deal of attention, largely due to the work of Lewis Wolpert
[Wolpert 71], although the notion of chemical gradients in development has been around for
quite some time [Child 41].
There is indication that a gradient mechanism is responsible for maintaining the body plan
of the Hydra. The Hydra is a small, freshwater animal found in ponds and streams, and it is
related to jellyfish and anemones. A Hydra has a collection of stinging tentacles surrounding
its mouth at one end called its “head” and it attaches itself to plants or rocks at its “foot” (see
Figure 2.4). The Hydra is rather unusual because its cells are constantly moving from one
part of the organism to another, yet its basic body plan remains intact. There is evidence to
suggest that there are several chemicals in the Hydra that are responsible for maintaining the
position of the head and foot. One chemical, dubbed the head activator, has a high
concentration in the head region, and this concentration tapers off towards the foot. The head
activator appears to be a signal for maintaining the structures in the Hydra’s head. The head
- 27 -
region is the source of the head activator. There is another chemical, called the head inhibitor,
that is also produced by the head region. The head inhibitor seems to diffuse more rapidly
than the head activator, and this inhibitor is thought to prevent other head regions from being
formed elsewhere on the Hydra. In addition, there are two chemicals that seem to be
responsible for maintaining the foot in much the same fashion. These four candidate
morphogens pose a somewhat more complicated picture than the simple one-chemical
gradient model of pattern formation. Still, there is much overlap here with the basic gradient
model. The key similarity is the simple gradient from one part of the organism to the other
that signals to the cells the role they should play in the body. (See [Gilbert 88] for a more
complete description of morphogens in Hydra and for references.)
Another candidate for a morphogenic gradient is found in the study of limb-bud formation
in chick embryos. The limb-bud is a bump on the chick embryo that later becomes a wing.
A small molecule known as retinoic acid (a form of vitamin A) is present in graded
concentrations across the limb-bud. Retinoic acid has recently has been discovered to affect
development in some animals and it is a very strong producer of birth defects of the limbs and
heart. New discoveries about its role in limb development suggest that it is a morphogen and
that it directs the anterior/posterior (head/tail) orientation of limbs. It remains to be seen if
the mechanism for maintaining retinoic acid’s concentration across the limb bud is in
agreement with the source/sink gradient model of pattern formation.
2.5.2 Reaction-Diffusion
The gradient model of pattern formation uses a source and a sink to create a stable chemical
concentration across part of an embryo. Are there other ways a diffusible chemical can hold
a fixed pattern of concentration in a developing organism? The mathematician Alan Turing
answered this question in the affirmative in a landmark theoretical paper on morphogenesis
[Turing 52]. Turing showed that two chemicals that diffuse at different rates and that react
with one another can form stable patterns of concentration. Such a chemical system is called
a reaction-diffusion system. In his paper, Turing used as an example a ring of cells such as
is found at the mouth of a Hydra. He showed that a reaction-diffusion system acting over such
a ring of cells could form a stable pattern of peaks and valleys of chemical concentration. This
is much like the standing waves on a string that is vibrating at a fixed frequency. Figure 2.5
shows a graph of the concentration of one chemical from a simulation of such a system. More
recently, other biologists have shown how reaction-diffusion systems that act in two
dimensions can produce patterns of spots or stripes. See Sections 3.1 and 3.2 for a discussion
of this work.
Both the “reaction” and the “diffusion” components of a reaction-diffusion system are
needed to produce patterns such as spots and stripes. “Reaction” refers to how the
concentrations of the two chemicals affect the creation or degradation of one another in a
systematic manner. Turing assumed that these reactions operate identically in all regions of
the embryo. Thus, if the concentration of the chemicals are initially uniform throughout the
embryo then the amounts of the two chemicals will rise and fall in exactly the same way
through the entire embryo, giving no spatial variation in concentration. Likewise, if there is
- 28 -
Figure 2.5: Pattern of chemical concentration from reaction-diffusion system.
no variation in concentration, then diffusion does not change the concentration at any point
in the embryo. What Turing demonstrated, however, is that in many cases even a small
variation in the initial concentration of one or both chemicals is enough to cause the two
chemicals to reach a stable state where their concentrations vary in a regular manner across
the embryo. This model of pattern formation is the basis of the textures created in this
dissertation. We will examine reaction-diffusion systems in greater detail in Chapter 3.
2.5.3 Patterns Created by Chemotaxis
There is still another way in which chemical agents can play a role in pattern formation.
Murray and Myerscough have presented a model of snake skin patterns based on chemotaxis
[Murray and Myerscough 91]. They propose that the patterns on snakes result from different
densities of cells over the skin and that the amount or kind of pigment produced is a factor
of this cell density. Their model supposes the existence both of a chemical agent that attracts
migrating cells and of a relationship between production of this chemical and the density of
cells in a given region of skin. This system can be described as a pair of partial differential
equations that share many characteristics with reaction-diffusion equations. Numerical
simulations of this system with different parameters over several different geometries result
in a wide variety of patterns. Many of these patterns match skin patterns of various snake
species.
2.5.4 Mechanical Formation of Patterns
We discussed earlier how mechanical forces can act to clump together cells in a petri dish.
In experiments the fibers underneath such groups of cells are stretched parallel to the lines
running between neighboring groups of cells [Harris et al 84]. This clumping and the
- 29 -
stretching between the groups is reminiscent of some patterns found in developing organisms. This has led to the suggestion that mechanical forces can act as a mechanism of pattern
formation [Oster, Murray and Harris 83]. This paper suggests that this mechanism may be
responsible for the formation of feather primordia on chick embryos. These primordia are
arranged in a diamond lattice on the surface of the chick, and there are lines of tension running
between neighboring buds.
2.6 Summary
Development is the process of arranging cells in an embryo according to cell type. We have
seen how this can be viewed from the perspective of cell actions and the various forms of
information available to a cell. Patterns of tissues in an embryo are formed by many cells
acting together in the embryo. Biologists have proposed several models of pattern formation,
including the gradient model, reaction-diffusion, chemotaxis, and mechanical pattern
formation. These mechanisms of pattern formation are actively being explored by developmental biologists. It is my hope that the field of computer graphics can benefit from further
exploration of developmental mechanisms. At this point, however, we will leave behind
other issues in developmental biology and concentrate only on reaction-diffusion.
- 30 -
3 Reaction-Diffusion Patterns
This chapter presents some of the patterns that can be formed by simulating reactiondiffusion systems. We begin by examining the components of a simple reaction-diffusion
system and present a mathematical model of such systems. Next, we give an overview of the
literature in developmental biology on pattern formation by reaction-diffusion. Once we
have covered these basics, we will then demonstrate that more complex patterns can be
formed using cascades of reaction-diffusion systems. This is new work that widens the range
of patterns that can be created using reaction-diffusion. We will then look at an interactive
program called Cascade that was made for exploring cascade systems. The methods
presented in this chapter provide a user with a wide range of control over the textures that can
be created using reaction-diffusion.
3.1 The Basics of Reaction-Diffusion Systems
To begin our discussion of reaction-diffusion systems we will describe a hypothetical
arrangement of cells and give a description of the interactions between some of the chemicals
in these cells. The assumptions are those made by Alan Turing in his paper that introduced
reaction-diffusion as a possible pattern formation mechanism [Turing 52]. From these
biological components we will form a mathematical description of what are considered the
important aspects of a reaction-diffusion system.
Let us begin by considering a one-dimensional arrangement of cells in an embryo. Figure
3.1 gives a diagram of this hypothetical row of cells. We will give attention to two chemicals
that are present in the cells, and we will refer to them as chemicals a and b. Assume that there
are processes within these cells that can cause more of these chemicals to be manufactured
Cell membrane
Molecular bridge
A
B
A
A
A
B
B
A
A
Morphogens
Diffusion
between cells
Figure 3.1: A row of cells. Molecular bridges allow morphogens
to diffuse between neighboring cells.
B
and other processes that can cause these chemicals to be broken down (degraded). Further
assume that the rates of these processes are dictated directly by the amounts of chemicals a
and b already in a cell. That is, the amount of chemical a in a cell changes based on the
quantity of the chemicals a and b are already in the cell. Likewise, the concentration of
chemical b will increase, decrease or remain fixed depending on the concentrations of
chemicals a and b. This is the reaction portion of the system.
The molecules within a cell are usually confined to the cell by the cellular membrane. In our
model, however, we will assume that there are pathways or bridges between adjacent cells
through which some molecules can pass. As an aside, such bridges between certain animal
cells do in fact exist. Gap junctions are bridges between cells that are found more widely
distributed in developing embryos than in adults, and they allow molecules of up to 1000
Daltons to pass between cells [Alberts et al 89]. Although Figure 3.1 shows only a few
bridges, adjacent cells are often joined by many such molecular bridges. In our model we will
assume that chemicals a and b can diffuse between neighboring cells in the row through these
bridges. The process of diffusion will tend to even out the concentration of the chemicals over
the row of cells. If a particular cell has a higher concentration of chemical b than its
neighbors, then that cell’s concentration of b will decrease over time by diffusion to its
neighbors, if all else remains the same. That is, a chemical will diffuse away from peaks of
concentration. Likewise, if the concentration of b is at minimum at a particular place along
the row of cells, then more of b will diffuse from adjacent cells to this cell to raise the
concentration of b at that cell. Diffusion acting alone over time tends to smooth out the
concentration of chemicals across a given domain. It wears down the peaks and fills in the
valleys.
Reaction and diffusion are the driving forces of change in the concentrations of chemicals a
and b in the row of cells. Such a system may have one of several patterns of change in
chemical concentrations over time depending on the details of the processes of reaction and
diffusion. These possible trends of chemical concentration include: oscillating chemical
quantities, unbounded increase of chemicals, vanishing of the chemicals, and a steady state
of chemical concentrations. Turing singled out a special case of the last of these, achieving
a steady state of concentrations, as the most interesting behavior for pattern formation. He
found that under certain conditions a stable pattern of standing waves of concentration will
arise. It happens that there are two necessary conditions for such a pattern to appear. The
first of these is that the two chemicals must diffuse at unequal rates. That is, one of the
chemicals must spread to neighboring cells more rapidly than the other chemical. The second
condition necessary to make these patterns is that there must be some random variation in the
initial concentration of chemicals over the cells. This is a reasonable assumption to make
because there are bound to be small variations from one cell to another in a real organism.
A specific reaction-diffusion system that follows these assumptions is given in Section 3.1.2.
3.1.1 A Mathematical Description of Reaction Diffusion
Now we will abstract from this model of cells and chemicals a mathematical description of
the system. The result of this abstraction will be a set of partial differential equations. In our
- 32 -
mathematical model, the concentrations of these two chemicals can be represented as real
numbers. The units of these quantities are not important, but the units might be something
like parts per million or moles. (See [Lengyel and Epstein 91] for a description of the
chemical reactants and their amounts in an actual reaction-diffusion system.) The positions
along the row of cells can be either discrete (one value per cell) or they can be represented
as positions along a continuous domain. For now, let us represent positions along the row
as a continuous value. Let us now use the symbols a and b to represent the concentration of
the corresponding chemicals. We can capture the changes in concentration of these two
chemicals over time by the following partial differential equations:
∂a
∂t
∂b
∂t
2
= F(a,b) + D ∇ a
a
2
= G(a,b) + Db ∇ b
The first of these equations describes the change over time in the amount of chemical a at a
particular position in the line of cells. The reaction term F(a,b) says that part of this change
is some function of the local concentrations of a and b. The term Da ∇2a says that the change
in the concentration of a also depends on the diffusion of a from nearby positions. The
constant Da describes the speed of diffusion of chemical a. The Laplacian ∇2a is a measure
of the concentration of a at one location with respect to the concentration of a nearby. If
nearby places have a higher concentration of a, then ∇ 2a will be positive and a will diffuse
towards this position. If nearby places have lower concentrations, then ∇2a will be negative
and a will diffuse away from this position. The meaning of the second equation is analogous
to the first, but with a different reaction function G and a different diffusion rate Db. The
Figure 3.2: One-dimensional example of reaction-diffusion. Chemical
concentration is shown in intervals of 400 time steps.
- 33 -
reaction terms in these equations say what is going on within a cell, whereas the diffusion
terms describes the flow of chemicals between cells.
3.1.2 Simulation of Reaction-Diffusion
The partial differential equations above give a concise description of the reaction-diffusion
process. It is natural to ask whether these equations can be solved in closed form. The answer
is that closed-form solutions are difficult or impossible to find except when the reaction
functions F and G are very simple. For this reason, reaction-diffusion equations are usually
discretized and solved numerically instead of analytically. Here is the discrete form of one
of the one-dimensional reaction-diffusion systems that Turing gave in his 1952 paper:
∆ai = s (16 – bi) + Da (ai+1 + ai-1 – 2ai)
∆bi = s (ai bi – bi – βi) + Db (bi+1 + bi-1 – 2bi)
where
ai
bi
βi
Da
Db
s
= concentration of the first morphogen at the i th cell
= concentration of the second morphogen at the i th cell
= random substrate at i th cell
= diffusion rate for a
= diffusion rate for b
= speed of reaction
For the equations above, each ai is one “cell” in a row of cells and its neighbors are ai-1 and
ai+1. The diffusion term is approximated by the expression Da (ai+1 + ai-1 - 2ai). The values
for βi are the sources of slight irregularities in chemical concentration across the row of cells.
Figure 3.2 shows the results of these equations by graphing the change in the concentration
of chemical b across a row of 60 cells over time. Initially the values of ai and bi were set to
4 for all cells along the row. The values of βi were clustered around 12, with the values varying
randomly by ±0.05. The diffusion constants were set to Da = 0.25 and Db = 0.0625, which
means that a diffuses more rapidly than b. The reaction speed constant s has the value
0.03125. The values of a and b were constrained to be always greater than or equal to zero.
Notice that after about 2000 iterations the concentration of b has settled down into a pattern
of peaks and valleys. The simulation results look different in detail from this when a different
random seed is used for βi, but such simulations all have the same characteristic peaks and
valleys with roughly the same scale of these features.
In the above reaction-diffusion system, βi acts as a random substrate to keep the values of a
and b from remaining constant across all cells. The initial values for ai, bi and βi were set so
that if there was no randomness introduced in the equations then the value of the reaction
portions of the equations would always evaluate to zero. In other words, without the variation
from βi, the chemical concentrations of both a and b would remain flat and unchanging over
time. As we will see below, the amount of randomness introduced by βi affects just how
regular or irregular the final pattern will be.
- 34 -
The above reaction-diffusion system can also be simulated over a two-dimensional domain.
In this case the discrete equations become:
∆ai, j = s (16 – ai, j bi, j) + Da (ai+1, j + ai-1, j + ai, j+1 + ai, j-1 – 4ai, j)
∆bi, j = s (ai, j bi, j – bi, j – β i, j) + Db (bi+1, j + bi-1, j + bi, j+1 + bi, j-1 – 4bi, j)
These equations are simulated on a square grid of cells. Here the diffusion terms at a
particular cell are based on its value and the values of the four cells that surround the cell. Each
of the neighboring values for a chemical are given the same weight in computing the diffusion
term because the length of the shared edge between any two cells is always the same on a
square grid. This will not be the case when we perform a similar computation on an irregular
mesh in Chapter 4, where different neighbors will be weighted differently when calculating
∇2a and ∇2b.
Figure 3.3 (upper left) shows the result of a simulation of these equations on a 64 × 64 grid
of cells. The values of the parameters used to make this pattern are the same as the values
of the one-dimensional example (Figure 3.2) except that s = 0.05 and β = 12 ± 0.1. Notice
that the valleys of concentration in b take the form of spots in two dimensions. It is the nature
of this system to have high concentrations for a in these spot regions where b is low.
Sometimes chemical a is called an inhibitor because high values for a in a spot region prevent
other spots from forming nearby. In two-chemical reaction-diffusion systems the inhibitor
is always the chemical that diffuses more rapidly. The inhibitor communicates information
about the distances to extremes of concentration (e.g. distances to the centers of spots) by this
faster diffusion.
We can create spots of different sizes by changing the value of the constant s for this system.
Small values for s (s = 0.05 in Figure 3.3, upper left) cause the reaction part of the system to
proceed more slowly relative to the diffusion, and this creates larger spots. Larger values for
s produce smaller spots (s = 0.2 in Figure 3.3, upper right). The spot patterns at the top of
Figure 3.3 were generated with βi, j = 12 ± 0.1. If the random variation of β i, j is increased
to 12 ± 3, the spots become more irregular in shape (Figure 3.4, upper left). The patterns that
can be generated by this reaction-diffusion system were extensively studied in [Bard and
Lauder 74] and [Bard 81].
The literature on reaction-diffusion systems is filled with different reaction functions that
create either spot or stripe patterns. It is interesting to observe the many forms that a reaction
function may take. These functions may be linear, may use product terms (as does Turing’s),
or may use quotients [Murray 81]. There is much work yet to be done to characterize what
reaction functions will produce stable patterns in reaction-diffusion systems.
The method of introducing randomness into the above simulation may appear somewhat
arbitrary. Albert Harris has pointed out that there are many ways to introduce randomness
to a reaction-diffusion system and he has observed that many of these ways still produce the
patterns that are characteristic of the particular system [Harris 92]. We have verified this for
- 35 -
Figure 3.3: Reaction-diffusion on a square grid. Large spots,
small spots, cheetah and leopard patterns.
Figure 3.4: Irregular spots, reticulation, random stripes
and mixed large-and-small stripes.
- 36 -
Turing’s spot-formation system using the Cascade program (described below). For example,
spots will form even if β is held constant at the value 12 (without random variation) and both
the values for a and the diffusion rate Da have slight random variations. The literature in
reaction-diffusion does not appear to address this issue of how randomness is introduced into
a system, and this is a fruitful topic for future research.
3.2 Reaction-Diffusion in Biology (Previous Work)
This section examines the literature on reaction-diffusion in developmental biology.
As was mentioned previously, reaction-diffusion was introduced as a model of morphogenesis by Alan Turing [Turing 52]. The paper introduced the idea that chemical substances
called morphogens could react with one another and diffuse through an embryo to create
stable patterns. Turing’s paper is thorough in its examination of different aspects of this basic
idea. It gives considerable detail about the breaking down and formation of chemicals due
to reactions between different molecules in a reaction-diffusion system. The paper examines
several simple reaction-diffusion systems. It describes a system with linear reaction terms
and solves both the discrete and continuous forms of these equations. The solutions to both
equations are a set of standing waves of chemical concentration (sinusoidal functions). The
paper examines reaction-diffusion systems on a ring of cells and on a sphere. Turing suggests
that the breakdown of symmetry of a reaction-diffusion system on a sphere may be
responsible for triggering gastrulation in the early embryo. The paper also shows a dappling
pattern made by reaction-diffusion that is reminiscent of the spots on cows.
Jonathan Bard and Ian Lauder thoroughly examined one of Turing’s reaction-diffusion
equations that acts over a row of cells [Bard and Lauder 74]. This is the same two-morphogen
system that was described earlier in this chapter. Through computer simulation, they
explored the kinds of patterns that this particular system will produce under a variety of initial
conditions. Their conclusion was that the patterns that are generated by this system are not
sufficiently regular to explain most patterns in development. They suggest, however, that
reaction-diffusion could explain less regular patterns in development such as leaf organization or the distribution of hair follicles.
In 1981 both Jonathan Bard and James Murray published independent papers suggesting that
reaction-diffusion mechanisms could explain the patterns on coats of mammals. Bard’s work
concentrated on showing that a variety of spot and stripe patterns could result from such
systems [Bard 81]. He showed that a reaction-diffusion system can produce the small white
spots on a deer or the large dark spots on a giraffe. He demonstrated that a wave of activation
that sweeps over a surface of cells might account for creating striped patterns. These stripes
can be either parallel or perpendicular to the wave of activation depending on the assumptions
of the model. Murray’s work showed that a single reaction-diffusion system might produce
rather different patterns of light and dark on a mammalian coat depending on the size of the
animal [Murray 81]. For example, the pattern created on a small animal may be dark regions
at the head and tail of the animal separated by a white region in the center. The same
mechanism may produce several irregularly shaped dark regions on a larger animal. On an
- 37 -
even larger animal, the mechanism might produce a large number of small dark spots. This
same paper also demonstrated that a reaction-diffusion may account for some patterns found
on butterfly wings.
Hans Meinhardt dedicated much of a book on pattern formation to exploring the patterns that
reaction-diffusion systems can create [Meinhardt 82]. The book gives equations and
FORTRAN code that produce spots and stripes in two dimensions. The lower left of Figure
3.4 shows a random stripe pattern created by a five-morphogen reaction-diffusion system that
is described in this book. Appendix B of this dissertation gives the five simultaneous
differential equations for stripe-formation. Also presented in Meinhardt’s book is a reactiondiffusion system that creates patterns much like the veins on a leaf. Much of Meinhardt’s
book is concerned with simple chemical gradients that can be set up and remain stable under
a number of different assumptions about the embryo’s geometry and under different initial
conditions.
David Young demonstrated that irregular striped patterns can be created by a reactiondiffusion model [Young 84]. These kinds of patterns strongly resemble the ocular dominance
columns found in the mammalian visual system [Hubel and Wiesel 79]. Young’s stripeformation model is based on the work of N. V. Swindale, who simulated such patterns by a
model of local activation and inhibition between synapses [Swindale 80].
Hans Meinhardt and Martin Klinger presented a model showing that reaction-diffusion
systems may explain the patterns of pigment found on mollusc shells [Meinhardt and Klinger
87]. The model assumes that pigment is laid down on the growing edge of the shell. The
shell’s pattern reflects the history of chemical concentrations along the one-dimensional
domain that is this growing edge. Different reaction functions and initial conditions result
in different patterns. Many of the patterns generated by this model bear a striking
resemblance to patterns found on actual molluscs. Deborah Fowler and her co-workers
generated striking images of synthetic shells by bringing this work into the computer graphics
domain [Fowler et al 92].
Perhaps a dozen or more researchers have attempted to model the segmentation of fruit fly
(Drosophila) embryos using reaction-diffusion. Early work along these lines met with the
problem of irregular stripe formation, where the reaction-diffusion systems proposed would
not consistently form the seven segments that arise in Drosophila embryos [Kauffman et al.
78]. More recent models have met with success. Thurston Lacalli found that a particular
model that uses four-morphogens will produce a stable pattern of stripes [Lacalli 90]. Axel
Hunding, Stuart Kauffman and Brian Goodwin have showed that a hierarchy of reactiondiffusion systems can lay down a stable pattern of seven segments [Hunding et al. 90]. Their
model is what we will call a cascade of reaction-diffusion systems, a topic we will return to
in Section 3.3. Their paper also provides a good summary of other work on Drosophila
segmentation and reaction-diffusion.
Reaction-diffusion is one developmental model within a broader class that have been termed
local activation and lateral inhibition (LALI) models. George Oster has pointed out the
- 38 -
similarities between several models of pattern formation, including models based on
chemical, neural and mechanical means of lateral inhibition [Oster 88]. Simulations of all
of these models give a similar range of patterns, that of spots or stripes of varying sizes. For
reaction-diffusion systems, the local activation says that a high concentration of one
chemical (call it x) will cause even more of chemical x to be created. The lateral inhibition
refers to the way production of another, more rapidly diffusing chemical (call it y) can be
triggered by production of x and how in turn y can inhibit the production of x. The local
activation causes peaks of concentration of x, and the lateral inhibition prevents this from
being a runaway process. The lateral inhibition also keeps two peaks of x from forming too
close to one another.
3.3 Cascade Systems
In earlier sections we saw that reaction-diffusion can be used to make simple spot and stripe
patterns. This section presents a method of creating more complex patterns using more than
one reaction-diffusion system. This expands the range of patterns that can be created for
texture synthesis using reaction-diffusion, and it is one of the main contributions of this
dissertation. Complex patterns can be created using reaction-diffusion by causing one
chemical system to set down an initial pattern and then allowing this pattern to be refined by
simulating a second system. We will refer to such a sequence of reaction-diffusion systems
as a cascade. As mentioned earlier, one model of embryogenesis of the fruit fly is based on
a series of reaction-diffusion systems. These systems may lay down increasingly refined
stripes to give a final pattern that matches the segmentation pattern of the fly larva [Hunding
90]. Bard has suggested that such a cascade process might be responsible for some of the less
regular coat patterns of some mammals [Bard 81]. The last paragraph in his article contains
the following remarks:
The jaguar has on its basically light coat, dark spots surrounded either by a dark
ring or a circle of spots. Such a pattern could perhaps be derived from either a
cascade process or a very complex interpretation system. It is however hard to
see how these or any other mechanisms could generate the pattern of the thirteenlined ground squirrel: this animal, basically brown, has seven A-P [anteriorposterior] stripes with six intervening rows of white spots...
Bard gives no details about the way two reaction-diffusion systems might interact. The
patterns shown in this section are new results that are inspired by Bard’s suggestion of a
cascade process.
The upper portion of Figure 3.3 demonstrates that the spot size of a pattern can be altered by
changing the size parameter s of Turing's reaction-diffusion system from 0.05 to 0.2. The
lower left portion of Figure 3.3 demonstrates that these two systems can be combined to
create the large-and-small spot pattern found on cheetahs. We can make this pattern by
running the large spot simulation, “freezing” part of this pattern, and then running the small
spot simulation in the unfrozen portion of the computation mesh. Specifically, once the large
spots are made (using s = 0.05) we set a boolean flag frozen to TRUE for each cell that has
- 39 -
a concentration for chemical b between 0 and 4. These marked cells are precisely those that
form the dark spots in the upper left of Figure 3.3. Then we run the spot forming mechanism
again using s = 0.2 to form the smaller spots. During this second phase all of the cells marked
as frozen retain their old values for the concentrations of a and b. These marked cells must
still participate in the calculation of the values of the Laplacian for a and b for neighboring
cells. This allows the inhibitory nature of chemical a to prevent the smaller spots from
forming too near the larger spots. This final image is more natural than the image we would
get if we simply superimposed the top two images of Figure 3.3. For the patterns made in
this dissertation, the choice of when to freeze a pattern was made interactively by a user of
the simulation program (described below).
We can create the leopard spot pattern of Figure 3.3 (lower right) in much the same way as
we created the cheetah spots. We lay down the overall plan for this pattern by creating the
large spots as in the upper left of Figure 3.3 (s = 0.05). Now, in addition to marking as frozen
those cells that form the large spots, we also change the values of chemicals a and b to be 4
at these marked cells. When we run the second system to form smaller spots (s = 0.2) the small
spots tend to form in the areas adjacent to the large spots. The smaller spots can form near
the large spots because the inhibitor a is not high at the marked cells. This texture can also
be seen on the horse model in Figure 5.12.
In a manner analogous to the large-and-small spots of Figure 3.3 (lower left) we can create
a pattern with small stripes running between larger stripes. The stripe pattern of Figure 3.4
(lower right) is such a pattern and is modeled after the stripes found on fish such as the
lionfish. We can make the large stripes that set the overall structure of the pattern by running
Meinhardt's stripe-formation system with diffusion rates of Dg = 0.1 and Ds = 0.06 (see
Appendix B for equations). Then we mark those cells in the white stripe regions as frozen
and run a second stripe-forming system with Dg = 0.008 and Ds = 0.06. The slower diffusion
of chemicals g1 and g2 (a smaller value for Dg) causes thinner stripes to form between the
larger stripes.
We can use both the spot and stripe formation systems together to form the web-like pattern
called reticulation that is found on giraffes. Figure 3.4 (upper right) shows the result of first
creating slightly irregular spots as in Figure 3.4 (upper left) and then using the stripeformation system to make stripes between the spots. Once again we mark as frozen those cells
that compose the spots. We also set the concentrations of the five chemicals at the frozen cells
to the values found in the white regions of the patterns made by the stripe-formation system.
This causes black stripes to form between the marked cells when the stripe-formation system
is run as the second step in the cascade process.
3.4 An Interactive Program for Designing Complex Patterns
The patterns presented in the section 3.3 indicate that there is a wide range of possible textures
that can be made using cascades of reaction-diffusion systems. This section presents an
interactive program called Cascade that is used for exploring the space of cascade patterns.
Perhaps the most difficult aspect of creating new cascade patterns is that there are many ways
- 40 -
that one reaction-diffusion system can pass information to a second system. It may be
desirable to have the first system change any of the following parameters of the second
system: the diffusion rates, the initial chemical concentrations, the degree of randomness, the
reaction rates, or additional parameters in the reaction functions. Cascade lets a user specify
changes to these in a simple fashion using a small language designed for this purpose.
Cascade uses a MasPar MP-1 parallel computer to quickly generate new patterns, and these
patterns are presented in gray-scale on the user’s screen. As an indication of the Maspar’s
simulation speed, it requires less than a second to compute 1,000 iterations of Turing’s system
on a 64 × 64 grid. The same simulation requires about 80 seconds on a DECstation 5000. The
remainder of this section describes Cascade in more detail and presents patterns that have
been created using the program.
3.4.1 Creating a New Pattern
Figure 3.5 shows the screen from a session with Cascade. In this particular session the user
is creating a two-stage cascade texture to make cheetah spots. The left portion of the screen
is dedicated to the first reaction-diffusion system and the right of the screen is for the second
system in the cascade. Both are Turing’s spot-formation system in this figure. Each half of
the screen is further divided into a graphical portion at the top, where the chemical
concentrations are shown, and a text portion below where parameters to the system are
specified.
The conceptual model underlying Cascade is simple and consists of two parts. One part is
that a user specifies the initial values of a collection of parameters across a grid. Each
parameter is given a value at each position in the grid, so any parameter may vary spatially
over the grid. This means that chemical concentration, reaction rates, diffusion rates, and all
other parameters can differ depending on location. The second part of the conceptual model
is that a user can invoke a routine that simulates a particular reaction-diffusion system over
the grid. The simulation is carried out based on the initial values of the parameters that are
specified by the user. A simulation routine changes the values of some of the parameters over
time, namely those that represent the concentrations of chemicals in the reaction-diffusion
system. Let us examine the way these two components are controlled through the user
interface of Cascade.
A typical session with Cascade beings with the user choosing the basic systems that will be
used in the cascade process. Currently there are three simulation routines to choose from:
Turing’s spot-formation system, Meinhardt’s spot-formation system, and Meinhardt’s
stripe-formation system. Reasonable default parameter values are provided for each system,
and these values appear in the text portion of the window. In Figure 3.5, for example, the
initial value for chemical a at the left is given as 4, and the random substrate β is specified
as 12 ± 0.1. The user is free to change any of these values and run a simulation at any time
based on the specified parameters. Several words on the screen are surrounded by ovals, and
these are called buttons (refer to Figure 3.5). A user can trigger an event by clicking on one
of these buttons using a mouse. A simulation is begun by first clicking on the “Initialize”
button and then clicking one or more times on the “Simulate” button. The “Initialize” button
- 41 -
Figure 3.5: Cascade user interface.
- 42 -
tells Cascade to evaluate the parameter specifications over the square simulation grid.
Clicking “Simulate” runs the particular reaction-diffusion simulation for a number of time
steps specified by the iteration parameter. The graphical representations of the chemicals are
updated after each simulation run.
Most often a user will change parameters and run simulations on the first system until the
pattern looks as if it will be a good basis for the desired final pattern. For example, in Figure
3.5, the user has created a large spot pattern that needs smaller spots added to it. The user can
change the second system so that the initial values of one or more of its parameters are based
on values from the first system. In Figure 3.5 this is accomplished by specifying a value of
“b < 4” for the freeze parameter. This says that a cell in the simulation grid is to be frozen
if the concentration of chemical b is less than 4 in the first system. To make the new spots
smaller, the value for ka (another name for s) in the second system is different than its value
in the first system. We will now take a closer look at parameter specification in Cascade.
3.4.2 Patterns Created by Cascade
Figure 3.6 shows twelve patterns that were created using Cascade. These patterns are not
meant to be an exhaustive catalog of those that can be created. They are the result of a couple
of days of exploration using Cascade, and they are presented as an indication of the range of
patterns that can be created using cascaded systems.
The mechanisms for generating these patterns are outlined below. Complete expressions for
each of these systems are given in Appendix C.
Autocatalytic Spots
These are spots created by Hans Meinhardt’s autocatalytic spot-formation system. Notice
that they are more irregularly spaced than the spots from Turing’s system.
Vary Spots
This shows a gradation of spot sizes over a region. This was made by varying the speed
constant s from Meinhardt’s spot system.
Eroded Stripes
This pattern was created by cascading two stripe-formation systems. The first system created
thick stripes, and the second system carved cavities in these thick stripes.
Thin Lines
The basic form of this pattern was laid down by a stripe-forming system. This pattern was
then altered by Turing’s spot-forming system, where the substrate parameter β was altered
by the first system.
- 43 -
Figure 3.6: A variety of patterns created with Cascade.
- 44 -
Small Spots
This was created by cascading two Turing spot-formation systems. The second system’s
substrate β was derived from the chemical a of the first system.
Honeycomb
These two patterns are more extreme cases of the above cascade (Small Spots). Here, the
initial value of β was higher than in the previous system.
Wide Spots
These spots were created by cascading large spots from Turing’s system together with a
stripe-formation system. The chemical b in the stripe system was altered based on chemical
b of the spot system.
Plates
This is a similar system to the previous one (Wide Spots). The stripe-forming system was
set to produce more thin stripes than the earlier pattern.
Broken Lines
This is a cascade of two Turing spot-formation systems. The second system’s diffusion rate
for chemical a was controlled by the concentration of chemical b from the first system.
Bumpy Stripes
This pattern was created from one instance of Meinhardt’s spot-formation system. Here, the
parameter p2 has been raised to cause the system to produce stripes instead of spots. This
demonstrates that Cascade can be useful for exploring isolated reaction-diffusion systems.
Mixed Spots
This pattern was made by cascading thick stripes from Meinhardt’s stripe-formation system
together with spots from the autocatalysis spot system. The spot sizes were controlled by
setting the speed parameter s from the result of the earlier stripe-formation system.
Squirrel
This pattern shows that the mixed stripe-and-spot pattern of the thirteen-lined ground squirrel
can be created using a cascaded system. The stripes were set down using Meinhardt’s stripeformation system. The stripes were oriented vertically by having a higher degree of
randomness at the right border. Then portions of the stripes were frozen and spots were
created between the stripes using Turing’s system.
- 45 -
4 Simulating Reaction-Diffusion on
Polygonal Surfaces
This chapter describes a new method for placing patterns that are generated by reactiondiffusion onto polygonal surfaces. In order to understand what is presented in this chapter,
let us consider the way a texture placement task would be accomplished using more
traditional methods. Let us assume we wish to place a pattern of spots on a polygonal model
of a frog. The most obvious way to do this begins by simulating a spot-forming reactiondiffusion system on a rectangular patch that is divided into a grid of squares. The resulting
patterns of chemical concentration could then be considered as colors of an image texture,
and that texture could be mapped onto the frog surface by traditional means. The rectangular
patch could be wrapped over the surface of the frog by assigning patch coordinates to vertices
of the frog model. This method has the advantage of using well-understood methods of
texture mapping and rendering. Unfortunately, it also retains the problems of stretched
textures and noticeable seams when the texture is placed on any but the most simple models.
Fortunately, we can take advantage of the physical nature of reaction-diffusion to place the
resulting patterns on a given surface. Specifically, we can simulate any reaction-diffusion
system directly on a mesh that is fit to a given surface. Presumably this is similar to what
happens in naturally occurring reaction-diffusion systems. That is, a pattern-formation
mechanism that makes spots on a real frog during development acts over the entire geometry
of the skin or pre-skin cells. The frog’s spots are not unusually stretched and show no seams
because such a pattern is formed on the frog’s surface. Likewise, if we simulate a spotmaking reaction-diffusion system directly on the surface of a polygonal model of a frog, there
will be no stretching or seams in the pattern. The spot texture is tailor-made for the given
surface. This method of fitting a texture to a given surface is a central contribution of this
dissertation.
The majority of this chapter is dedicated to describing an automated method of creating a
mesh over which a reaction-diffusion system can be simulated. This is work that was
presented in [Turk 91]. Quite a different approach to simulating reaction-diffusion on
surfaces was presented in [Witkin and Kass 91]. The next section gives an overview of the
technique of Witkin and Kass. The remaining sections turn to the central mesh creation
method.
4.1 Simulation on Joined Patches (Previous Work)
One approach to fitting a reaction-diffusion system to a given surface was described by
Andrew Witkin and Michael Kass [Witkin and Kass 91]. It should be noted that this method
has not yet been implemented for complex surfaces. Their method begins by dividing the
surface to be textured into rectangular patches. This step currently must be done by hand
since there are as yet no automated methods of taking a polygonal model and fitting
rectangular patches over the model. The next step is to gather together information about the
way the patches stretch over the model and where they join one another. This information
is then used during simulation of a reaction-diffusion system. The simulation is performed
on several rectangular grids of square cells, one grid for each of the rectangular patches. Let
us examine the way in which simulation on grids can be modified to avoid the twin pitfalls
of texture distortion and seams between patches.
For isotropic diffusion systems, where the chemicals diffuse at equal rates in all directions,
simulation on a grid of square cells is straightforward. Several examples of isotropic
diffusion systems were described in Chapter 3. The basic method replaces the differential
equations with discrete versions of the equation that approximates the Laplacian operator
with sums and differences of adjacent grid cells. For instance, consider Turing’s spotformation system as simulated on a grid:
∆ai, j = s (16 – ai, j bi, j) + Da (ai+1, j + ai-1, j + ai, j+1 + ai, j-1 – 4ai, j)
∆bi, j = s (ai, j bi, j – bi, j – β i, j) + Db (bi+1, j + bi-1, j + bi, j+1 + bi, j-1 – 4bi, j)
The last terms of the first equation show that the diffusion term at cell ai, j is approximated
by the sum of the concentrations of a at the four neighboring cells minus four times the
concentration at cell ai, j. This is the isotropic case. Such grid simulations can be modified
to take into account anisotropic diffusion. For instance, the diffusion term for ai, j could be
changed to the following:
Da (2ai+1, j + 2ai-1, j + ai, j+1 + ai, j-1 – 6ai, j)
This equation says that chemical a diffuses twice as rapidly in one direction as in the other
direction. This has the effect of stretching the pattern in the direction of faster diffusion.
Figure 4.1 shows an isotropic pattern on the left and a stretched pattern on the right. This
ability to create patterns that appear to be stretched was suggested by Witkin and Kass as a
way to generate textures that are pre-distorted to fit a given surface. For instance, suppose
one of the rectangular patches that covers a model is stretched in the vertical direction near
the top of the patch than at the bottom. This could be taken into account during the simulation
by changing the diffusion term so that the pattern would be bunched up near the top. Then
when the final pattern is stretched onto the surface, the top of the patch would be stretched
to un-distort the pattern. The proper pre-distortion amount can be computed from the
Jacobian of the parametric equation for the surface patches. This is described in full in
[Witkin and Kass 91].
- 47 -
Figure 4.1: Isotropic and anisotropic patterns of spots.
Creating pre-distorted patterns avoids textures that look stretched, but what can be done about
avoiding seams between patches? This issue is addressed by using appropriate boundary
conditions for the patches, that is, by sharing information between patches during simulation
of the physical system. Chemical quantities can be passed from one patch to an adjacent patch
by incorporating cells from more than one patch into the sums of cell concentration that
approximate the Laplacian terms. The most simple case is that of the periodic patch, where
the top and bottom edges of a patch are identified with one another and likewise the left and
right edges are joined to one another. These conditions are appropriate for a torus that is
covered by a single four-boundary patch. The diffusion terms in the simulation equation are
modified to take this into account simply by changing the meaning of “neighboring cell” for
cells on the edge of the rectangle. Each of the cells on the left edge of a grid has the three
“typical” neighbors and, in addition, has a fourth neighbor that is a cell from the far right of
the grid along the same row of cells. All the simulations on square grids shown in Chapter
3 use such periodic boundary conditions. Patches that cover more complicated objects can
also have their boundary conditions modified to join the patches together during the
simulation that creates reaction-diffusion patterns. This is the approach suggested (but not
yet implemented) by Witkin and Kass to avoid seams between patches. Each of the reactiondiffusion patterns shown in their paper were simulated on one surface patch.
The strength of the above method for simulating reaction-diffusion on surfaces is that many
grid-based simulation techniques can be brought to bear. For instance, Witkin and Kass
demonstrate that a rapidly computable approximation to Gaussian convolution [Burt 81] can
be used to speed up reaction-diffusion simulations. The drawback of the patch-based method
is that the user is required to divide the model into surface patches. The remainder of the
chapter is devoted to a method of simulating reaction-diffusion directly on the surface of a
model that requires no such work on the part of the user.
- 48 -
4.2 Requirements for Simulation Meshes
In this section we will discuss the desired characteristics of meshes for reaction-diffusion
simulations. We will consider the acceptable shapes and sizes for the cells of a simulation
mesh. Before considering these issues, let us ask whether we need to simulate reactiondiffusion on a mesh at all. As we saw in Section 3.1, a reaction-diffusion system can be
described by a set of partial differential equations. The non-linearity of many reactiondiffusion systems often make closed-form solutions difficult. Solving such systems on
complex geometry such as a giraffe model makes analytic solutions harder still. Because few
reaction-diffusion systems can be solved symbolically in closed form, our system uses
numerical integration to solve the differential equations. Let us consider possible sources for
meshes on which to simulate a reaction-diffusion system.
Suppose we wish to place a reaction-diffusion pattern on the surface of a given polygonal
model. What are the characteristics of such models? There are many sources of polygonal
models in computer graphics. Models generated by special-effects houses are often digitized
by hand from a scale model. Models created by computer-aided design might be made by
converting a model from constructive solid geometry to a polygonal boundary representation. Some models are generated procedurally, such as fractals used to create mountain
ranges and trees. Still other models are captured by laser scanning of an object. It is natural
to ask whether we can use the original polygonal mesh as the mesh on which to simulate a
reaction-diffusion system. Unfortunately, the above methods of model creation give few
guarantees about the shapes of the polygons, the density of vertices across the surface or the
range of sizes of the polygons. If a model has polygons that are larger than the size of the spots
we want to place on the surface then we cannot capture the detail of the spots by using the
original polygonal mesh for simulation. Long mesh cells are not good for simulations
because the numerical approximations to the derivatives at such cells are poor. We do not
want to simulate a system on a mesh that is too dense, otherwise we will spend more time to
compute a texture than is necessary. For these reasons it is unwise to use the original polygons
as the mesh to be used for creating textures. Let us examine the properties we want for our
simulation meshes.
The simulations of Chapter 3 all took place in a grid of squares. The regularity of such a grid
makes simulation programs particularly easy to write. All the squares are the same size and
each of them has four nearest neighbors, given the appropriate boundary conditions. Is it
important that the squares are the same size? Our goal in simulating reaction-diffusion
systems is to produce patterns such as those described in Chapter 3. None of these patterns
have features that vary radically in size. For instance, the spots in the upper right square of
Figure 3.3 are roughly the same size throughout the square. The same observation can be
made of striped patterns. We will refer to the average width of the spots or stripes in a pattern
as the natural feature size of the pattern. We need grid cells that are small enough to capture
the features of a given reaction-diffusion system, but these cells do not need to be very much
smaller than the natural feature size of the system. Features will be lost if the cells aren’t small
enough, but extra work will go to waste if the cells are too small. It makes sense, then, to have
grid cells that are all roughly the same size. Another requirement is for the shapes of the cells
- 49 -
to be fairly regular so that the chemicals will diffuse isotropically across the surface. Ideally
we would like a mesh to be composed of cells that are all exactly the same shape, such as
regular squares or hexagons. Unfortunately, this is not possible upon arbitrary surfaces.
Instead, our goal will be to automatically generate a mesh that has cells that are all roughly
the same size and shape.
Mesh generation is a common problem in finite-element analysis, and a wide variety of
methods have been proposed to create meshes [Ho-Le 88]. Automatic mesh generation is a
difficult problem in general but the requirements of texture synthesis will serve to simplify
the problem. We don’t need to invoke the elaborate methods from the finite-element
literature. These complex methods can create variable-sized mesh regions based on
geometric features or physical properties of the surface. Instead, we only require that the
model be divided up into relatively evenly-spaced regions. The mesh generation technique
described below automatically divides a polyhedral surface into cells that abut one another
and fully tile the polygonal model. The only input necessary from the user is a specification
of the number of cells to be in the final mesh.
There are three steps to generating a mesh for reaction-diffusion simulation. The first step
is to distribute n points randomly over the surface of the given polygonal model. Step two
causes all these points to repel one another, thus spreading themselves evenly over the surface
of the model. The final step is to build a cell (called a Voronoi region) around each of these
points. The following two sections (4.3 and 4.4) describes these steps in detail.
4.3 Even Distribution of Points over a Polygonal Surface
This section describes a new method of evenly spreading points over the surface of a
polygonal model. These points will eventually become the center of cells in a simulation
mesh. First we will describe a method of placing points randomly over a given model so that
no part of the model is more likely to receive points than any other portion of the surface. Then
these points will be spread more evenly over the model’s surface by having each point repel
all other nearby points.
4.3.1 Random Points Across a Polyhedron
Distributing points randomly over a polyhedral model is non-trivial. Care must be taken so
that the probability of having a point deposited within a fixed-size region is the same for all
such regions on the surface. When placing a point randomly on a model, we cannot simply
choose randomly with equal weight from among all the model’s polygons. This would result
in a higher density of points on the smaller polygons. Instead, when randomly placing a point,
we need to make an area-weighted choice from among the polygons. (We will show later a
method of placing a point randomly on this polygon.) Suppose we have a model composed
of n polygons: P1, P2,... Pn. Let each polygon Pi in the model have an area Ai. We want the
probability of placing a point on polygon Pi to be proportional to this polygon’s area relative
to the surface area Atotal of the model. This probability is Ai / Atotal. This can be accomplished
first by creating a list of sums S1, S2,... Sn, where Si is the sum of all polygon areas from A1 up
- 50 -
to and including Ai. To choose a random polygon, we will first pick a random value r chosen
uniformly in range of zero to Atotal (the total surface area of the model). Now we can look
through the list of partial sums Si to find the smallest i such that Si is great than r, that is, find
i such that Si-1 ≤ r < Si. This search can be performed quickly using binary search over the
values S1, S2,... Sn. Since r is chosen from zero to Atotal and because Si - Si-1 = Ai, this search
will yield the value i with probability Ai / Atotal, as we desired. This indicates that the point
should be deposited on the polygon Pi. We now require a method of placing a point randomly
on this polygon. The approach described below for this is taken from [Turk 90].
In what follows we will assume that we are picking a random point on a triangle. Any
polyhedral model can be triangulated to satisfy this requirement. Call the vertices of the
triangle A, B, and C. Let s and t be two uniformly distributed random values chosen from the
interval [0,1]. Then the pseudo-code below picks a random point Q in the triangle:
if s + t > 1 then
s=1-s
t=1-t
{ reflect if necessary }
a=1-s-t
b=s
c=t
{ compute barycentric coordinates within the triangle }
Q = aA + bB + cC
Without the “if” statement, the point Q will be a random point in the parallelogram with
vertices A, B, C, and (B + C - A) (see Figure 4.2). A point that lands in the triangle B, C, (B
+ C - A) is moved into the triangle A, B, C by reflecting it about the center of the parallelogram.
(B + C) - A
C
Q
t
B
A
s
(B + C) - A
C
t
Q
A
B
s
Figure 4.2: Picking random point in triangle. Top: s + t ≤ 1. Bottom: s + t > 1.
- 51 -
4.3.2 Point Relaxation
Once the proper number of points have been randomly placed across the surface, we need to
move the points around until they are somewhat regularly spaced. This is accomplished using
relaxation. Intuitively, the method has each point push around other points on the surface by
repelling neighboring points. The method requires choosing a repulsive force and a repulsive
radius for the points. It also requires a method for moving a point that is being pushed across
the surface, especially if the point is pushed off its original polygon. Here is pseudo-code
giving an outline of the relaxation process:
loop k times
for each point P on surface
determine nearby points to P
map these nearby points onto plane containing the polygon of P
compute and store the repulsive forces that the mapped points exert on P
for each point P on surface
compute new position of P based on repulsive forces
Each iteration moves the points into a more even distribution across the polyhedron. Figure
4.3 shows an initially random distribution of 200 points in a square and the positions of the
same points with k = 50 iterations of the relaxation procedure.
Figure 4.3: Random points in plane (left) and the same points after relaxation (right).
- 52 -
The repulsive radius of the points should be chosen based on the average density of the points
across the whole surface. The meshes used in this paper were created using a radius of
repulsion given by:
n = number of points on surface
a = area of surface
r = 2 a /n
The above value for r gives a fixed average number of neighboring points to any point,
independent of the number of points on the surface and independent of surface geometry.
This is important because uniform spatial subdivision can then be used to find neighboring
points quickly. It has been our informal experience that the exact nature of the equation for
the force between points does not significantly affect the quality of the final point distribution.
For instance, we could have used a force that varies inversely with the square of the distance
between points, but this would have meant that points arbitrarily far apart would affect one
another. This would have been an added computational burden with no advantage in the final
configuration of points.
For repulsion by nearby points, we require a distance function across the surface. For points
that lie on the same polygon the Euclidean distance function can be used. For points that lie
on different polygons we need to do something reasonable. A logical choice is to pick the
shortest distance between the two points over all possible versions of the polyhedral model
where each model has been unfolded and flattened onto a plane. Unfortunately, determining
the unfolding that minimizes this distance for any two points is not easy. Since there is no
limit to the number of polygons that may be between the two points, finding this distance
could take an arbitrary amount of computation. As a compromise, we choose only to use this
flattened distance when the two points are on adjacent polygons, and we will use an
approximation if the points are further removed than this. We use this approximation for the
sake of speed. The approximate distance between points that is described below can be
computed in constant time for any pair of points. There are clearly more elegant approaches
to finding distances over a surface that have a higher computational cost. Fortunately, we do
not affect the final point distribution much by using an approximation because points that are
far from one another do not affect each other’s final position much.
The left portion of Figure 4.4 illustrates computing the flattened distance between two points
that are on adjacent polygons. We can pre-compute and store a transformation matrix M for
adjacent polygons A and B that specifies a rotation about the shared edge that will bring
polygon B into the plane of polygon A. With this transformation, the distance between point
P on polygon A and point Q on polygon B is determined by applying M to Q and then finding
the distance between this new point and P.
For points P and Q on widely separated polygons A and B, we first find in which direction
Q lies with respect to the polygon A. Then we can apply to Q the rotation given by the
transformation matrix of the edge associated with this direction. Usually this will not bring
Q into the plane of A, so this point is then projected onto the plane of A and we can use the
- 53 -
Top View
Top View
polygon B
polygon B
polygon A
polygon A
Q
P
Q
P
Side View
Side View
P
MapToPlane(Q, A)
polygon A
MapToPlane(Q, A)
P
polygon A
project
rotate
polygon B
Q
polygon B
rotate
Q
Figure 4.4: Mapping nearby point Q onto plane of point P. Left shows
when Q is on adjacent polygon. Right shows more remote point Q.
distance between this new point and P as our final distance. This is shown in the right portion
of Figure 4.4. This gives a distance function across the surface, and in addition it gives a
method of making every point near a given point P seem as though it lies on the plane of the
polygon of P. The procedure of moving a point Q onto polygon A is called MapToPlane(Q,A).
With a distance function in hand, making the points repel each other becomes straightforward. For each point P on the surface we need to determine a vector S that is the sum of all
repelling forces from nearby points. Here is the determination of S based on the repulsive
radius r:
S=0
for each point Q near point P
map Q onto plane of P 's polygon; call the new point R
V = normalized vector from R to P
d = distance from R to P
if d < r then
S = S + (r - d ) V
Once this is done for each point on the surface, the points need to be moved to their new
positions. The new position for the point P on polygon A will be P' = P + kS, where k is some
small scaling value. The meshes used here were made with k = 0.15. In many cases the new
point P' will lie on A. If P' is not on A then it will often not even lie on the surface of the
polyhedron. In this case, we determine which edge of A that P' was “pushed” across and also
find which polygon, call it B, that shares this edge with A. The point P' can be rotated about
- 54 -
the common edge between A and B so that it lies in the plane of B. This new point may not
lie on the polygon B, but we can repeat the procedure to move the point onto the plane of a
polygon adjacent to B. Each step of this process brings the point nearer to a polygon, and
eventually this process will terminate.
Most polygons of a model should have another polygon sharing each edge, but some
polygons may have no neighbor across one or more edges. Surfaces that have edges such as
these are called manifolds with boundaries. A cube with one face removed is an example of
such a surface, and this surface has a four-sided boundary. If a point is “pushed” across such
a boundary then the point should be moved back onto the nearest position still on the polygon.
This is simply a matter of finding where the line between P and P' intersects the boundary
of the polygon that P is on. For a surface with boundaries, this will cause some of the points
to be distributed along the boundaries.
The result of the point repulsion process is a set of points that are fairly evenly distributed over
the surface of the given polygonal model. These points can now serve as centers for cells of
a simulation mesh. Once this mesh is built, any reaction-diffusion system can be simulated
on the surface of the model. Let us turn to creating the cells surrounding the mesh points.
4.4 Generating Voronoi Cells on the Model
The final step in creating a mesh is to take the points that were distributed evenly by the
relaxation process and determine the cells centered at each of these points. Each of these cells
is like a container of small quantities of the chemicals that are participating in the reactiondiffusion process. These cells will abut one another, and the chemicals will diffuse between
pairs of cells through their shared wall. Figure 4.5 gives an abstract picture of this model. The
size of the shared wall between two cells determines the amount of diffusion between the
cells. This quantity will be referred to as the diffusion coefficient between the two cells. We
need a way to form regions around the points to determine adjacency of cells and to give the
diffusion coefficients between adjacent cells. In keeping with many finite-element meshgeneration techniques, we choose to use the Voronoi regions of the points to form the regions
surrounding the points. Other choices of mesh generation procedures are possible, and we
will discuss this issue below.
A description of Voronoi regions can be found in books on computational geometry, e.g.,
[Preparata and Shamos 84]. Given a collection of points S in a plane, the Voronoi region of
a particular point P is that region of the plane where P is the closest point of all the points in
S. For points on a plane, the Voronoi regions will always be bounded by lines or portions of
lines that are positioned halfway between pairs of points. Figure 4.6 shows the Voronoi
regions in the plane for the points from Figure 4.3. When simulating a diffusing system on
such a set of cells we will use the lengths of the edges separating pairs of cells to determine
the quantity of a given chemical that can move between the two cells. It is important to
understand that constructing the Voronoi region around a particular point tells us which
points are its neighbors. We need to know which points are neighbors in order to compute
the diffusion terms at a point.
- 55 -
Large amount
of diffusion
Small amount
of diffusion
Figure 4.5: Amount of diffusion between adjacent cells depends
on size of shared boundary.
Figure 4.6: Voronoi regions of the points shown in Figure 4.3.
- 56 -
The concept of a Voronoi region gracefully generalizes to three dimensions. A Voronoi
region of a point P from a set of points S in 3D is a region of 3-space that is separated from
other regions by planes or portions of planes that are midway between P and other points in
S. These three-dimensional cells are always convex. This leads directly to one possible
generalization of Voronoi regions for a polyhedral surface. We can take the Voronoi region
of a point P on the surface as being the intersection between the 3D Voronoi region and the
polyhedral surface. Unfortunately, this sometimes leads to regions that are composed of
several disjoint pieces on different portions of the surface. Moreover, these Voronoi regions
do not adequately capture the notion of adjacency of points on a surface because the distance
function does not measure distance across the actual surface.
A more reasonable generalization of Voronoi regions to a surface makes use of a measure of
distance over the surface. We can use the notion of shortest path (geodesic) over a polyhedral
surface to give a better definition of Voronoi region. Using the length of the shortest path over
the surface as our distance measure, the Voronoi regions that this induces are never disjoint.
They also capture the idea of adjacency better than the previous definition of Voronoi regions
for a surface. An exact solution to finding these Voronoi regions on an arbitrary polyhedron
is given in [Mount 85]. Unfortunately, the algorithm to determine exact Voronoi regions is
rather involved. Instead of using Mount’s method, the meshes in this dissertation were
created using planar approximation of the exact Voronoi regions.
The simplified method of creating Voronoi regions on a polygonal surface makes use of the
unfolding process used in the point repulsion process. Using the same procedure as before,
all points near a given point P are mapped onto the plane of the polygon A containing P. Then
the planar Voronoi region of P is constructed and the lengths of the line segments that form
the region are calculated. It is the lengths of these segments that are used as the diffusion
coefficients between pairs of cells. It is possible that the process of unfolding and creating
Voronoi regions for two nearby points can give two different values for the length of the
shared line segment between the regions. In this case, the values of the two lengths is
averaged.
In general, computing the Voronoi regions for n points in a plane has a computational
complexity of O(n log n) [Melhorn 84]. Recall, however, that the relaxation process
distributes points evenly over the surface of the object. This means that all points that
contribute to the Voronoi region of a point can be found by looking only at those points within
a small fixed distance from that point. In practice we need only to consider those points within
2r of a given point to construct a Voronoi region, where r is the radius of repulsion used in
the relaxation process. Because uniform spatial subdivision can be used to find these points
in a constant amount of time, constructing the Voronoi regions is of O(n) complexity in this
case. This can be substantially faster than creating the true Voronoi regions over the surface.
For models with many more polygons than Voronoi regions, computing the exact Voronoi
regions would take an amount of time that is independent of the number of Voronoi regions.
In this case, the number of polygons that must be examined would dictate the computation
time required to build the Voronoi regions.
- 57 -
It is important to consider whether the planar approximation to the exact Voronoi regions is
acceptable for mesh building. There are two characteristics of the planar approximation
method that make it an attractive alternative to Mount’s exact technique. The first favorable
aspect is the O(n) time complexity of the approximation method, in contrast to the longer time
to compute the exact regions. The second favorable aspect is that the approximation method
is a more simple method to implement. Ease of implementation has the positive side-effect
of being easier to debug and make robust. The mesh generation method described above has
been successfully applied to creating simulation meshes for a wide variety of polygonal
models. These models include a hand-digitized model of a horse, a mathematically
interesting minimal surface, an isosurface created using the marching cubes algorithm
[Lorensen and Cline 87], and a model of a giraffe that was created freehand using a modelbuilding program. The reaction-diffusion textures created using these meshes showed no
apparent artifacts from the simulation mesh. The success of this mesh-building technique
over a large number of models indicates that using an approximation of the Voronoi regions
was a reasonable compromise between speed and accuracy. Furthermore, building the planar
approximation to the Voronoi regions is independent of all other aspects of reaction-diffusion
simulation and rendering. If the approximation was somehow found to be inadequate,
Mount’s method could be substituted and then all other aspects of the techniques presented
here could be used with these exact Voronoi regions.
As an alternative to the Voronoi mesh, we could choose that the relaxed points be used as the
vertices of the simulation cells instead of as the cell centers. This approach would yield a
mesh that is the dual of the Voronoi diagram, called the Delaunay triangulation. If the
Voronoi mesh had C cells and V vertices, then the corresponding Delaunay mesh would have
V cells and C vertices, and the two meshes would have the same number of edges. Since the
cells of the Delaunay mesh are all triangles, each cell would diffuse to exactly three
neighboring cells, in contrast to the roughly six neighbors per cell in a Voronoi mesh.
Although all the simulations in this dissertation used Voronoi meshes, using Delaunay
meshes probably would have given satisfactory results. Further research is needed to
determine the relative merits of the two approaches.
4.4.1 Meshes for Anisotropic Diffusion
The previously described construction of the Voronoi regions assumes that the diffusion over
a surface is isotropic (has no preferred direction). The striking textures in [Witkin and Kass
91] show that simulation of anisotropy can add to the richness of patterns generated with
reaction-diffusion. Given a vector field over a polyhedral surface, we can simulate
anisotropic diffusion on the surface if we take into account the anisotropy during the
construction of the Voronoi regions. This is done by contracting the positions of nearby
points in the direction of anisotropy after projecting neighboring points onto a given point's
plane. Then the Voronoi region around the point is constructed based on these new positions
of nearby points. The contraction affects the lengths of the line segments separating the cells
- 58 -
Figure 4.7: Spot pattern from anisotropic diffusion on test object.
and thus affects the diffusion coefficients between cells. The contraction will also affect
which cells are neighbors. Figure 4.7 shows that anisotropic diffusion creates spots that are
stretched when Turing's system is simulated on the surface of a model.
4.5 Simulation on a Mesh
The previous section gave a method for creating a simulation mesh for any polygonal model.
We can now create any of the reaction-diffusion patterns from Chapter 3 on a given model
by simulation on this mesh. The square cells of a regular grid are now replaced by the Voronoi
regions that comprise the cells of the mesh. Simulation proceeds exactly as on a grid of
Figure 4.8: Diffusion between cells on square grid (left)
and between Voronoi regions (right).
- 59 -
squares except that calculation of the Laplacian terms now takes into account that the cell
shapes are irregular. Figure 4.8 shows both the square grid case and the instance of a mesh
of Voronoi regions. Consider determining the rate of diffusion of a chemical a at a particular
cell. The diffusion term ∇2a on a square grid has the form:
da[i,j] = (a[i-1,j] + a[i+1,j] + a[i,j-1] + a[i,j+1]) - 4a[i,j]
The diffusion quantity da[i,j] is computed from the value of the concentration a[i,j] at the cell
and the concentrations at the surrounding cells. The computation is much the same on a mesh
of Voronoi regions. The diffusion coefficients can be calculated by approximating the
derivatives of concentration by a path integral around the boundary of the cell [Thompson
et al 85, pages 156–157]. ∇2a is computed at a particular cell by multiplying each diffusion
coefficient of the cell by the value of a at the corresponding neighboring cell, summing these
values for all neighboring cells, and subtracting the value of a at the given cell. Let the
concentrations of chemical a be stored in a one-dimensional array called a. Let coeff[i,j] be
the diffusion coefficient between cells i and j. Then the Laplacian term da[i] for a particular
cell i is computed as follows:
da[i] = - a[i]
for each neighbor j of cell i
da[i] = da[i] + coeff[i,j] * a[j]
Figure 4.9: Reaction-diffusion on test object. Top shows Voronoi regions,
bottom shows chemical concentration as color.
- 60 -
We have found that the diffusion coefficient between a pair of adjacent cells can be
approximated by the lengths of the boundary separating the two cells. For a particular cell,
these lengths are normalized by the circumference of the cell, so that the coefficients sum to
one. The values given by this approximation are usually within 15% of the values given by
the method described in [Thompson et al 85]. Most of the simulations in this dissertation used
this boundary length approximation for the diffusion coefficients.
When a reaction-diffusion simulation over such a mesh is complete, the result is a
concentration at each cell in the mesh for each participating chemical. Figure 4.9 shows the
results of simulating Turing’s spot-formation system on a mesh of Voronoi regions over a test
surface. The color of the cells are based on the concentration of chemical b, where low values
of b are shown blue and high values are white. The underlying simulation mesh is quite
evident in this image. Chapter 5 shows that such patterns can be placed on surfaces without
displaying artifacts of the mesh.
4.6 Pattern Control Across a Surface
User control is an important issue in synthetic texturing. We saw in section 4.5 that an
arbitrary reaction-diffusion pattern can be placed on any given polygonal model. This gives
a user the ability to choose from a wide variety of patterns such as those presented in Chapter
3. In this section we will examine several techniques for giving a user further control of
reaction-diffusion textures. The methods presented here give a user control over the manner
in which features vary over the surface of a particular model. The first technique allows a
user to specify the placement of stripes on a model. The second technique demonstrates that
diffusion can smoothly spread parameter values over a particular surface. This can be used
to vary such characteristics as the size or regularity of spots and stripes over a model. The
final technique allows parameters to be specified based on an approximation to the curvature
of the underlying surface.
4.6.1 Stripe Initiation
The reaction-diffusion system that produced the random stripes in the lower left of Figure 3.4
can also be used to create more regular stripe patterns. The random stripes are a result of the
slight random perturbations in the “substrate” for the chemical system. If these random
perturbations are completely removed, then no stripes whatsoever will form. If, however, the
substrate and chemical concentrations are homogeneous at all but a few special cells, then
stripes will radiate from these few designated mesh cells. Such a stripe initiator cell can be
made by marking the cell as frozen and raising the initial concentration of one chemical at
that cell. Such a cell acts as a source of the particular chemical. The stripes shown in Figure
4.10 were created in this manner. These stripes were created by creating several stripe
initiator cells on the head and one such cell on each of the hooves. Figure 4.11 shows the
stripes radiating from these positions part-way through the simulation. These cells were
marked as unchanging and the initial value of chemical g1 was set to be slightly higher than
at other cells (see Appendix B for the simulation equations).
- 61 -
Figure 4.10: Zebra stripes on horse model, created by simulating
reaction-diffusion on surface.
Figure 4.11: Stripes are initiated at the head and hooves.
- 62 -
Figure 4.12: Result of flood-fill over horse model from key positions.
Figure 4.13: Values from Figure 4.12 after being smoothed by diffusion.
- 63 -
4.6.2 Parameter Specification Using Diffusion
Section 4.5 demonstrated that we can place any single reaction-diffusion pattern onto an
arbitrary surface. Sometimes a user might want to have a pattern vary based on position on
a surface. For example, we might recognize that the stripes on a zebra are thicker on the
zebra’s haunches than elsewhere on its body. This variation could be achieved by slowing
the diffusion rate on and near the haunches in contrast to the rate of diffusion over the rest
of the model. There are many ways this variation in the diffusion rate might be specified. We
will discuss one such method that uses diffusion over a simulation mesh to smooth our
parameter values over a surface. This method was used to create the variation in stripe
thickness for the model in Figure 4.10.
The first step to specifying variation in a particular parameter is to specify the value of the
parameter at particular key positions. These key positions will be particular cells in the
simulation mesh. For the example of the zebra, twelve key positions on the haunches were
designated to have low diffusion rates (call it r1). Twelve more key positions on other parts
of the body were marked as having high diffusion rates (r2). Then these parameter values
were spread outward cell-by-cell from these special cells to other parts of the mesh. This
stage can be thought of as a flood-fill of the cells in the mesh. A given cell on the mesh
receives either the value r1 or r2 depending on which key position is closest. At the end of
this process, all the cells of the mesh have one or the other parameter value. Figure 4.12 shows
these values, representing a high value as black and low value as white. The next stage in this
process is to smooth out these parameters to remove the sudden jump in values at the border
between black and white.
Diffusion of the parameter values over the simulation mesh can smooth out this discontinuity
of values. (This should not be confused with reaction-diffusion. There is no reaction process
here.) As was discussed in section 3.1, diffusion acting alone has the tendency to smooth out
any spatial variation of a substance. Figure 4.13 shows the results of allowing the parameter
values of Figure 4.12 to diffuse for 400 time steps. Notice that the sharp jumps in value have
been removed. The numerical values illustrated in Figure 4.13 could be used to vary any
parameter of a reaction-diffusion system. Two of the parameters it could vary are the degree
of randomness or the rate of diffusion. The stripes of Figure 4.11 were created by using the
parameter variation shown in Figure 4.13 to specify the rate of diffusion over the model. This
created the variation in stripe width near the hind quarters.
4.6.3 Using Curvature to Specify Parameters
Another way to specify parameter variation over a model is to allow attributes of the surface
to contribute to the parameter values. This section demonstrates that a surface’s curvature
can be used to set parameter values for reaction-diffusion. Suppose we notice that a giraffe’s
spots are smaller at places of higher curvature on its body. We would like to use the amount
of curvature to guide the rate of diffusion during pattern simulation on a giraffe model. Figure
4.14 shows an estimate of curvature on a giraffe model, and Figure 4.15 is the same model
with a texture whose spots vary according to this curvature information.
- 64 -
Figure 4.14: Approximation of curvature over giraffe model. Areas of
high curvature are red and areas of low curvature are blue.
Figure 4.15: Size of spots on giraffe model are guided by the curvature
estimate shown in Figure 4.14.
- 65 -
P
θ
r
A
C
B
Figure 4.16: Curvature along a path in the plane (left) and curvature
approximation used at vertices (right).
The curvature estimate used for Figure 4.14 was presented in [Turk 92], and we will describe
that estimate below. Ideally, we would like to have an exact measure of curvature from the
object that the polygonal model is meant to represent. Often, however, this information is
not available, either because the object being represented is not available (e.g. volume data
was not retained) or because there never was an exact description of the object (e.g. a cat
model was created freehand by a human modeler). For these reasons it is useful to have a way
to approximate surface curvature from the polygonal data alone. More precisely, we want
to know the maximum principal curvature at any given point on the model. See any text on
differential geometry for a mathematical description of principal curvature, such as [O’Neill
66]. Intuitively, this is asking for the radius of the largest sphere that can be placed on the
more curved side of the surface at a given point without being held away from the surface by
the manner in which the surface curves. The left portion of Figure 4.16 shows the radius of
curvature at two points along a curve in the plane.
The right portion of Figure 4.16 illustrates the curvature approximation used here. This figure
shows the two-dimensional version of the curvature estimate near a point P. Here a circle has
been drawn that is tangent to the edge PA at its mid-point and that is also tangent to the longer
edge PB. The radius of this circle is r = tan(θ)  P - A  / 2. In this figure, the line segment
PC bisects the angle APB. This figure will act as a starting point for approximating the
curvature of a polygonal surface in 3-space at a vertex P.
- 66 -
In the three-dimensional case, the line segment PC is replaced by an approximation to the
surface normal N at the vertex P. Then, each edge in the polygon mesh that joins the vertex
P to another vertex Qi is examined, and an estimate of the radius of curvature from each of
the n edges PQ1, PQ2,... PQn can be computed. Let V be the normalized version of the vector
Qi - P, that is, a unit vector parallel to the edge PQi. Then an estimate for θi is arccos(N • V),
and the radius estimate for the edge PQi is ri = tan(θi)  P - Qi  / 2. The final estimate r of
minimum radius of curvature at the vertex P is the minimum of all the ri. This estimate of
curvature is a little noisy for some models, so we can smooth the estimate by averaging a
vertex’s radius r with that of all of its neighbors, and we can take this to be the minimum radius
of curvature at the vertex. Figure 4.14 shows the results of this estimate, where the surface
is colored red in areas of high curvature (small radius) and is colored blue in regions that are
more nearly flat.
Curvature information can be used to specify any parameters of a reaction-diffusion
simulation. These include reaction rates, speed of diffusion, random substrates, or initial
chemical concentrations. The spot sizes of Figure 4.15 were set by varying the diffusion rates
of a cascade system. It is likely that other surface properties will also prove useful in
specifying reaction-diffusion parameters. Some of these properties are: direction of
maximum curvature, surface normal direction, mean curvature, and Gaussian curvature.
Exploring the uses of these surface properties is a logical direction for future research.
4.6.4 Future Work in Pattern Control
Future work on pattern control over a surface should concentrate on user interface issues. For
example, a user should be able to specify the size of the stripes or spots directly instead of
providing numerical values for parameters. Specifying feature sizes would be much more
intuitive with the aid of a graphical pointing device such as a mouse. The user might point
at one portion of a giraffe model and drag the pointer over the model to indicate the average
width of a spot at that position.
- 67 -
5 Rendering Reaction-Diffusion Textures
Rendering a textured object is the process of bringing together the information about the
texture, the mapping of the texture, and the object’s geometry to create a final image. This
chapter is concerned with how to render scenes that contain objects that are textured using
reaction-diffusion patterns. The chemical concentrations from a reaction-diffusion simulation are converted into colors to give a final texture. This is analogous to a biological model
in which the concentration of a morphogen triggers the production of a pigment in an animal’s
skin.
We will begin by examining the major issues of rendering image-based textures, namely
projection and texture filtering. This overview will give us a point of reference for examining
two new methods of rendering reaction-diffusion textures. We require new methods to
render the patterns resulting from simulation on a mesh because our mesh cells are irregularly
distributed over a model. Previous texture rendering methods used regularly spaced grids of
color information. The first of the new rendering methods re-tiles the textured model with
small polygons that are colored based on the texture. This allows rapid display of textured
models on graphics workstations. The second method renders from the original surface’s
geometry and uses a weighted average of texture values to interpolate smoothly the reactiondiffusion texture pattern. This is a more compute-intensive rendering approach, but the final
images are usually of higher quality than those from the re-tiling method. The same issues
that are important for image-based textures will allow us to evaluate the quality of these two
techniques for rendering reaction-diffusion textures. Both the methods presented to render
reaction-diffusion textures are new contributions of this dissertation.
5.1 Rendering Image-Based Textures (Previous Work)
In this section we will examine the rendering process and look at several visually distracting
artifacts that can appear in textured images. Much of the material presented here is taken from
[Heckbert 89]. First, we will look at the fundamentals of creating a textured image by using
an image-based texture to vary the color across an object’s surface.
Photorealistic rendering has concerned itself almost exclusively with creating a rectangular
array of color values that are output to such devices as color cathode-ray tubes, liquid crystal
displays and film scanners. The task of rendering is to determine what the color components
(most often red, green, blue) should be for each pixel of the image. When a textured object
is rendered, one issue is bringing the color information in the texture to the correct place in
the final image. For instance, what process brings the blue dome from the center of Figure
1.8 to the appropriate position in the right portion of the figure? We need to find the
appropriate correspondence between positions in the texture and positions in the final image.
This information is found in two places: first, in the mapping function that the user describes
to wrap the texture around the object; and second, in the projection from the threedimensional scene description onto the two-dimensional screen.
5.1.1 Transformation Between Texture Space and Image Space
Let us define a few functions that will allow us to discuss the correspondence between
positions in an image-based texture and screen positions. Let the function g: R2 → R3
describe the mapping of a point in texture space into a three-dimensional position on the
object’s surface in the scene. For a particular image of the scene, we also have a mapping
from points in the three-dimensional scene to their projected positions on the screen, and we
will call this function h: R3 → R2. The composite function h • g : R2 → R2 describes mapping
a position in the texture to the final image. Figure 5.1 illustrates the functions g and h. The
composite mapping function h • g gives one way to render textured objects: For each texture
element at texture position (s,t), apply the function h • g to get a position (x,y) = (h • g) (s,t)
in the final image. The color values texture[ s,t] of the texture are then used to determine the
final color at the screen location screen[x,y] in the final image. This is texture order
mapping, and can be written as:
for s
for t
(x,y) = (h • g) (s,t)
screen[x,y] = texture[ s,t]
Screen Projection
Texture Map
2
R
Texture Space
(g)
3
R
(h)
Object Space
Texture-to-Image Map
(g • h)
Figure 5.1: Mapping from texture to image space.
- 69 -
2
R
Image Space
To a first approximation, this is the forward mapping method of rendering textured objects.
For the sake of simplicity, this description ignores the issues of lighting models, hidden
surface removal and sampling.
The forward texture mapping approach has two potential difficulties. The first problem is that
there may be holes in the textured surface because no texture elements mapped to some of
the pixels in the final image. This problem can be overcome by careful attention to how much
the mapping function h • g stretches the texture. This information about stretching is
contained in the Jacobian of the mapping function. The second problem is correctly filtering
the texture. This is a complex issue that we will return to in section 5.1.2. A solution to both
these issues was presented in [Levoy and Whitted 85], where the authors mapped texture
elements to fuzzy points whose contributions were summed in the final image. The
contribution of a fuzzy point varied in cross-section according to a Gaussian distribution. A
similar approach was taken in [Westover 90] to render volume data. Westover used the
regularity of the 3-D grid of volume data to sort the Gaussian footprints, which makes
combining their contributions simple.
Due to the difficulties mentioned above in the forward mapping approach, the more common
approach to texture mapping is to reverse the above process. Let the function f represent the
composite mapping function: f = h • g. Then we can use the inverse function f -1 to determine
which position (s,t) in the texture space corresponds to a given position (x,y) in the final
image: f -1(x,y) = (s,t). Texture rendering proceeds as follows: Render the objects in the scene
using some surface algorithm such as ray tracing or polygon scan conversion. When a screen
pixel at position (x,y) is determined to be covered by a portion of an object, the reverse
mapping f -1 (x,y) gives a location (s,t) in the texture space where the color values in
texture[s,t] can be looked up directly. This method is called screen order mapping, and can
be written as follows:
for x
for y
(s,t) = f -1(x,y)
screen[x,y] = texture[ s,t]
This method of texture rendering is the more commonly used approach of the two for
determining the color of an object. In a real renderer, the color value texture[s,t] would be
passed along with additional surface properties to a lighting model, and the result of this
computation would be stored at screen[x,y].
5.1.2 Aliasing and Filtering
Both screen and image order mapping depend on determining a correspondence between a
point in the texture space and a point in the final image. It is rarely correct to use just a single
entry from a texture color table to determine the color of a pixel in the final image. If, for
instance, an object is very far away from the viewer, the image of that object may cover only
a handful of pixels in the final image. This means that any detail from a texture on the object
- 70 -
is compressed into a very small number of pixels, so that many texture elements should
contribute to just one pixel’s color. The above sketches of forward and inverse texturing do
not address this problem because they do not account for sampling. The naive method of
inverse texturing looks up a single texture element based on the color value from the inverse
mapping of screen position (x,y). This is known as point sampling. The left half of Figure
1.9 shows an image of a checkerboard using this method of point sampling. Notice the
distracting moiré patterns near the horizon of the image and the jagged edges between each
of the black and white squares. Both of these image artifacts are a result of aliasing. Aliasing
is the result of trying to re-create a function from an inadequate number of samples of the
function. More precisely, aliasing is an artifact that results from high-frequency information
of a signal erroneously appearing as low-frequency information. In the case of the
checkerboard, the moiré patterns are a result of not properly averaging the texture values near
the horizon. The jagged edges between the squares are a result of not collecting enough
texture information near the edges between squares. To avoid these kinds of artifacts, we
need to filter the textures to remove these high-frequency components.
The problem of aliasing is well-understood, and the issues involved in sampling a signal such
as a texture are described in the literature on signal processing. The main approach to avoid
aliasing is to remove the high-frequency components by filtering the signal (e.g. the texture)
before it is sampled (e.g. represented as pixels). A band-limited filter takes a given signal and
removes the high frequencies that cannot be adequately represented in the final, sampled
representation of the signal. Hopefully, this filter will retain the low-frequency information
that can be represented. Refer to books on image processing such as [Castleman 79] or
[Oppenheim and Schafer 75] for more information about aliasing, filtering, and sampling as
they relate to images.
To gain an understanding of texturing artifacts and how to avoid them, we need a conceptual
model of the entire texture rendering process. Rendering creates discrete values on a regular
grid (the final image) from a set of discrete values in another regular grid (the image texture).
For the sake of simplicity, let us assume that both the texture and the final image are black
and white so that we can view them as real-valued functions. As a further simplification, we
will consider both texture and image to be one-dimensional samples instead of twodimensional grids of values. Figure 5.2 (from [Heckbert 89]), parts (a) and (e) show
representations of the texture and the final image. All the functions in this figure are realvalued functions, and these two functions in particular are zero everywhere except at
regularly spaced sample points. The arrows in the figure show the four processes involved
in the rendering of textures. The first process is reconstruction, where a continuous function
is created from the original, sampled function (in our case, the discrete grid of the texture).
The second step is to warp this continuous version of the texture, using the mapping h • g.
This is the process of squashing, stretching or otherwise transforming the texture to place it
on the final image. The third step is to pre-filter the warped image, and we discuss this step
in detail below. Here we will use the term pre-filter to mean a filter that is applied before
resampling. The final step is to sample the pre-filtered function, and the result of this step
gives us the final image. Figure 5.3 gives a two-dimensional illustration of these four
processes.
- 71 -
Figure 5.2: Conceptual model of the processes involved in rendering a texture.
Two of the four processes shown in Figure 5.2 are already dictated by the given scene that
is to be rendered. The warping step is completely determined by the way the texture is
mapped onto an object and from the position of the object in the scene. We represented this
warping by the function f = h • g above. Sampling, the last stage of the model, is fully
determined by the size of the final image. We are free to make decisions about both the
reconstruction and the pre-filtering processes. Let us take a closer look at reconstruction.
This process is the recognition that the discrete color values that make up an image-based
texture really are meant to represent some continuous color function. For our application,
reconstruction is the process of re-creating, as best we can, that continuous function. One
simple reconstruction method is to use linear interpolation between adjacent values in a
texture. Say, for instance, we wish to know the color of a texture at a position one-third of
the way between a completely black texture element (value 0) and an adjacent texture element
that is pure white (value 1). Linear interpolation of these color values gives a value of 1/3
at the place in question. In general, if we want a color value that is the fraction t of the way
between texture values texture[i ] and texture[i+1], then the linearly interpolated value is:
value = texture[i ] + t * (texture[i+1] - texture[i ])
- 72 -
Figure 5.3: Two-dimensional illustration of the rendering process.
- 73 -
Linear interpolation is the same as convolution of a discrete function with the triangle filter:
triangle(t) = max(0, 1 - |t|)
Convolving a discrete function with an appropriate filter is in fact the most common view of
reconstruction. Linear, quadratic and cubic reconstruction filters are all common in computer
graphics. Much work has been done exploring the qualities of different reconstruction filters.
Reconstruction filters are covered in many books on signal processing such as [Oppenheim
and Schafer 75]. See [Mitchell and Netravali 88] for a good overview of this topic as it relates
to computer graphics.
Let us now turn to the pre-filtering stage of texture rendering. The purpose of this stage is
to band-limit the warped texture function before it is discretely sampled to create the final
image. Ideally, this pre-filter should remove any frequencies in the function that are above
the Nyquist limit given by the sampling rate of the final image (see, for example, [Castleman
79]). This will remove the high-frequency information that could, due to aliasing, appear as
low-frequency information. Here again we are convolving a function with a filter. Sampling
theory tells us that the best shape for this filter is the sinc function (sinc(x) = (1/x) sin(x))
because only this filter cuts off high frequencies completely and leaves the lower frequencies
untouched. Unfortunately, the sinc function gives some difficulties in practice. One problem
is that it is infinite in extent. This means that every function value from part (d) of Figure 5.2
contributes to any given discrete value in part (e), which means a high computational
expense. Secondly, the sinc function can produce ringing (visible ripples near edges) which
is the result of the many closely spaced lobes of the sinc function. For these reasons, other
filters are used in practice. Two popular families of filters are the Gaussian filters and cubic
filters.
Although the processes of reconstruction and pre-filtering can be separated conceptually,
often they are implemented together in one part of a program. When a texturing algorithm
has the two processes tightly intertwined, they are referred to as a single process, the texture
filter. Under certain conditions, one component of the texture filter is more prominent than
the other. Depending on the position of a textured object in a scene, either the reconstruction
or pre-filtering process may dominate the look of a texture. If an object is very close to the
viewer then the reconstruction filter becomes important because a very small number of
texture elements may cover a large portion of the screen. In such cases, the interpolation
method used between texture elements dominates the look of the texture. When this happens,
the texture filter is sometimes called a magnification filter. The opposite extreme occurs
when a textured object covers very few pixels of the final image. Then the texture filter’s job
is to average many of the texture elements together to give one color value. Here, the prefiltering is foremost in importance, and such a filter is called a decimation filter.
5.1.3 Two Texture Sampling Methods: Point Sampling and Mip maps
Let us examine two concrete examples of filters for image-based textures. These two filters
are similar to the two methods of rendering reaction-diffusion textures that will be described
- 74 -
later. The first texture “filter” we will look at is point sampling of the texture. This is the naive
method of texturing that was outlined in the description of screen order mapping of textures.
The texture value is simply the color of the closest texture element to the inverse function
value f -1(x,y). This is actually the absence of any filtering, although it can be viewed as
convolution with a box filter. Conceptually, the reconstruction filter is a box filter that
stretches halfway between two texture elements. This means that no averaging between
neighboring texture elements is performed. This filter will give blocky looking textures when
a textured object is close to the viewer. The pre-filter is an impulse function centered at the
origin. This means that the filter uses just one texture element for the color, no matter how
small the object appears in the final image. The effect of this will be most noticeable if such
an object is moving, in which case the texture will sparkle and shimmer distractingly as
different portions of the texture move under the sampled positions. Clearly, point sampling
makes a poor texture filter. The re-tiling method of displaying reaction-diffusion textures
(described later in this chapter) has much in common with the point sampling method of
image-based texture rendering.
A substantially better texturing technique called a mip map was introduced by Lance
Williams [Williams 83]. Map maps should be thought of as a family of filters, and a specific
filter is given by the particular mip map implementation. Mip maps are now in common use,
probably because they are easy to implement and because they have a low, fixed computational cost per textured pixel. To motivate this fixed cost, consider what happens when a pixel
in a final image spans a large portion of a texture. The pixel’s color should be an average of
the colors from a large region of the texture, so a single lookup into the original texture will
be inadequate. Depending on the size of this region, we may have to make several hundred
texture lookups to find the appropriate average. If we create several pre-filtered versions of
the texture, however, just a few lookups into these pre-filtered versions will suffice to give
a reasonable color average over much of the texture. Each of these pre-filtered versions of
the texture is an appropriately band-limited (blurred) version of the original texture. The
collection of pre-filtered textures is what the image processing literature calls an image
pyramid. The high-quality method of displaying reaction-diffusion textures (described later
in this chapter) is similar to mip maps.
A mip map is just such a technique that uses multiple pre-filtered versions of a texture. Figure
5.4 is a diagram of a mip map. Consider a 256 × 256 element black and white texture. The
first level of the mip map is the original array of 256 × 256 texture values, shown at the base
of the pyramid at the right of Figure 5.4. The second level is a 128 × 128 version of the texture
in which each element is the average of nearby elements (typically four) from the first level
of the mip map. The additional levels are smaller by a factor of 2 on each side from the
previous level, and each of their elements are averages of texture elements from the previous
level. The final level of the mip map is a single value that is the average value over the entire
texture.
Finding a texture value using a mip map begins by determining the amount of compression
or stretching of the texture at a given pixel. A typical measure for this compression factor
is the size that a one-pixel circle on the final image would be if it was inverse mapped back
- 75 -
Original Texture
Levels 3 and 4
Mip map
Level 2
Level 1
Pixel Area
Interpolation between levels
Level 0
Figure 5.4: Pixel’s area mappped into texture space (left) and the appropriate
filtering computed from the mip map (right).
into texture space. This will usually give an elliptically shaped region. The equation given
in [Williams 83] for the compression factor is:

d = max

2
2
 ∂u  +  ∂v  ,
 ∂x 
 ∂x 
2
2
 ∂u  +  ∂v  
 ∂y 
 ∂y  
This value d determines the two levels of the mip map that will be used to compute the filtered
texture value. It is a measure of the size of the smallest bounding square around the elliptical
pixel-coverage region shown and the left of Figure 5.4. The larger the bounding square, the
higher the levels we will use in the mip map. Most of the time, the value of d will not specify
one particular level, but instead will indicate that the resulting color should be a blending of
values taken from two adjacent levels of the mip map. The pixel’s color is given by averaging
the values found from these two pre-filtered versions of the texture. The mip map approach
to filtering allows any number of ways to interpolate between the levels, and it also gives us
a choice about how a particular value within one level is computed. Linear interpolation is
the most commonly used choice in both cases, and this is what we will describe here. Given
a position (s,t) in texture space, the texture value within one level of the mip map can be
computed using bi-linear interpolation between the four nearest texture elements within a
level. This is done for both the levels indicated by d, and then the fractional portion of d is
used to linearly interpolate between the values at the two levels to arrive at the final filtered
texture value. This value is the result of seven linear interpolations between a total of eight
values in the mip map. It is this fixed cost that makes the mip map approach computationally
attractive.
- 76 -
It is instructive to contrast point sampling with the mip map filter described above. The filter
give by a particular implementation of a mip map is a concatenation of several transfer
functions, and this makes an exact analysis of a mip map filter difficult. To my knowledge,
no analysis of any filter that has been implemented using a mip map has appeared in the
graphics literature. The filter used in the above mip map is partially determined by the bilinear interpolation within a level. The filter shape is that of a four-sided pyramid and is
sometimes called a Bartlett filter. When the mip map turns into a magnification filter, the
resulting textures look a good deal smoother than a point sampled texture because the linear
interpolation makes the individual texture elements less noticeable. The second determining
factor in a mip map’s filter is the way one level is computed from the next lower level in the
pyramid. In the case of the implementation described above, point sampling is equivalent to
convolving with a box filter that is aligned with the axes of the texture space. When a textured
object is small, the mip map texture gives a rough average of all the texture elements present
within a pixel. For surfaces that are more nearly edge-on, the pre-filter of the mip map will
cause more texture elements than necessary to be averaged together, resulting in overblurring in one direction. This is a good deal less distracting than the sparkling that results
from point sampling. Overall, this mip map implementation does a fair job of filtering a
texture at a very reasonable computational cost. An analysis of mip map implementations
of filters is a topic for further research.
Point sampling and mip maps are by no means the only ways to filter textures. Other texture
filtering methods include summed-area tables [Crow 84] [Glassner 86], repeated integration
[Heckbert 88], space-variant kernels [Fournier and Fiume 88], and the Elliptical Weighted
Average filter [Greene and Heckbert 86]. We examined point sampling because the method
of rendering described in Section 5.3 has much in common with point sampling. We
examined mip maps in detail because they are similar to the high-quality method of rendering
reaction-diffusion textures that are described in Section 5.4. They are similar in the way that
they interpolate between two low-pass filtered versions of a given texture and because they
perform interpolation between sample points within a given filter level.
5.2 Interactive Texture Rendering
We would like to view reaction-diffusion textures interactively on graphics workstations. In
order to achieve interactive display rates we may need to make compromises in the quality
of the final image. In this section we will examine methods that have been used to display
textures rapidly using graphics hardware. Then in section 5.3 we will describe a fast
technique for displaying a reaction-diffusion texture that has been made for a specific model.
The most common method of generating textures in real-time is to use special-purpose
hardware that is designed to render image-based textures. The first texturing hardware was
built for flight simulators, and to this day most of the graphics machines that have rapid
texturing capabilities are targeted for the vehicle simulation market. The details of texture
rendering on present-day hardware varies from machine to machine, but the overall approach
to real-time texturing is quite consistent across vendors. Texture lookup and filtering is
- 77 -
usually performed as a final step just after primitive rasterization (e.g. polygon scanconversion) and directly before sending the pixel’s color information to the framebuffer. The
basic approach is to have one or (more often) several processors take a surface ID and texture
coordinate information from the rasterization stage and perform a texture lookup. These
texture processors typically have large amounts of memory to store several textures.
Textures are usually stored at several levels of detail (as is done for mip maps) although the
exact form of these levels varies among architectures.
An unconventional alternative to image-based texture hardware was demonstrated by the
Pixel-Planes group [Rhoades et al 92]. Pixel-Planes 5 is a graphics engine that uses 128 ×
128 arrays of one-bit processors to rasterize polygons [Fuchs et al 89]. Although these small
processors only have 208 bits of memory each and operate in SIMD fashion, they provide
enough processing power to re-compute some procedural textures anew each frame. This
method of texturing is only acceptable when the desired textures can be represented as simple
functions that do not require large amounts of data to evaluate. The technique cannot provide
a texture from an arbitrary image. Examples of textures that have been displayed interactively using this approach include wood, ceiling and floor tiles, sheet music, fire, and bricks.
Scenes that contain a dozen such procedural textures can be displayed at about ten frames per
second on Pixel-Planes 5.
When using a fast polygon display engine with no special-purpose texture hardware, textures
can be displayed as collections of many small polygons. This approach often strains the
polygon budget on such devices, however. If the texture is a 128 × 128 array of color values,
for example, then 1282 = 16,384 squares can be used to render the texture. Polygon display
engines often provide linear interpolation of colors across polygons. Color interpolation
across the texture element squares can be used to improve the look of the texture when the
textured object is near the viewer and the squares cover larger areas of the screen. Often the
graphics hardware provides linear interpolation of colors between polygon vertices. When
the texture squares become much smaller than pixel size, however, this texture method is
equivalent to point sampling, and the texture will sparkle objectionably.
The next section will describe a technique for rendering reaction-diffusion textures on
graphics workstations with no special-purpose hardware.
5.3 Using Surface Re-Tiling for Rapid Rendering
This section describes the rapid display of reaction-diffusion texture on a graphics workstation. The motivation for this is to give rapid feedback to the user about the overall look of
a reaction-diffusion texture. Using the technique presented in this section, a user can
interactively change the position and orientation of an object and see these new views
immediately. For example, the horse model shown in Figure 5.6 was displayed at a rate of
more than 15 frames a second on Pixel-Planes 5, a high-end graphics engine [Fuchs et al 89].
Recall from Chapter 4 that we can simulate any reaction-diffusion system on a mesh that is
fit to a particular surface. The results of this simulation are chemical concentrations at the
- 78 -
centers of the mesh cells. The basic method of texture rendering described in this section is
to re-tile a given surface based on a simulation mesh. This re-tiling process results in a new
model that is composed of polygons that are colored according to a pattern created by
reaction-diffusion. This is similar to displaying an image-based texture using a large
collection of color-interpolated squares or rectangles. Re-tiling based on a reaction-diffusion
pattern has the same image quality problems that are found when rendering image textures
using collections of rectangles. However, this method has a speed advantage over the higherquality rendering technique that will be described later in this chapter.
The approach of this re-tiling process is to throw away all the old polygons of the model and
replace them with new polygons that are placed according to the cells in the simulation mesh.
Then the chemical concentrations at each cell will dictate the colors of the vertices of the
surrounding polygons. A graphics workstation can then interpolate these colors across the
polygons and display the model at interactive rates. It is important to recognize that the
polygons of the original model cannot be used for this purpose because the simulation mesh
can have many cells for any single polygon of the model. Details of the texture would be lost
if the frequency contents of the pattern are higher than the density of the polygon vertices.
We want to create a new collection of polygons. One possible candidate for these polygons
are the Voronoi regions that comprise the cells of the mesh. Recall, however, that these
regions are never saved explicitly as geometric information. Only the lengths of the sides of
these regions are kept for calculating the diffusion terms of the cells. In fact, it would be quite
difficult to use the Voronoi regions to re-tile the polygonal model. The reason for this at least
in part is that many of the Voronoi regions are not flat but instead should lie on several of the
original polygons. It would be difficult to create a polygon for each Voronoi region in a
manner that could even allow all the new polygons to meet seamlessly at the polygon edges.
Since many of these regions may have six edges or more it would be difficult to make them
planar.
A natural alternative to using the Voronoi regions as polygons is to have the centers of the
cells become the vertices of the new polygons. This turns out to be much easier to accomplish
than using the Voronoi regions, and this is the approach used to create the re-tiled models in
this dissertation. One way to accomplish this would be to use the dual graph of the Voronoi
tessellation, known as the Delaunay triangulation. This is formed by replacing region centers
with vertices and vice versa. This results in a triangular mesh. Unfortunately, we tried this
method for several models and found that there were often several Voronoi regions in a model
that were particularly troublesome when creating the dual model, resulting in holes or
overlapping polygons. The source of these problems is in the nature of the planar
approximation used for the Voronoi regions, in the cases where nearby regions do not agree
on whether they are adjacent to one another. This problem results from using the planar
approximation of the Voronoi regions and it could be corrected by using the exact Voronoi
regions. In the work that follows, however, the Delaunay triangulation was dropped in favor
of a more robust method of re-tiling that did not pose these kinds of difficulties.
The solution to the problem of robust re-tiling was to create an intermediate form between
the original and the re-tiled model that allowed the topology to always remain faithful to that
- 79 -
of the original surface. This re-tiling technique was introduced in [Turk 92]. This method
replaces all the old polygons of the model with a collection of triangles, each of whose
vertices are mesh points that were positioned by relaxation. The method begins by
incorporating the mesh points into the polygonal model to create a new model that has all the
original vertices of the model as well as new vertices from the mesh points. Then the old
vertices are removed from the model one-by-one, leaving only the new vertices that are also
mesh points. The triangles in this new model receive their vertex colors from the chemical
concentrations of the reaction-diffusion simulation. Figure 5.5 shows a close-up of an
original model of a horse (top) and a re-tiled version of the same model (bottom). The user
has control over the number of polygons in the re-tiled model, although in Figure 5.5 the retiled model has more polygons than the original model. Figure 5.6 shows a textured version
of the re-tiled model using color-interpolated triangles.
5.3.1 Re-Tiling using Constrained Triangulation
The first stage in re-tiling, incorporating the mesh points as vertices of the model, relies on
a problem in computational geometry called constrained triangulation. Figure 5.7 shows a
constrained triangulation problem. The left half of this figure shows a collection of points
in the plane and a few edges between some of the points. The problem of constrained
triangulation is to connect all the points into a mesh consisting only of triangles while
incorporating the already given edges as part of the mesh. The right half of Figure 5.7 shows
a triangulation that meets the given constraint edges given at the left.
There are many ways to solve a constrained triangulation problem [Preparata and Shamos
85]. The solution method employed for the models in this dissertation is a commonly used
technique called greedy triangulation. Consider a set of n points and some constraint edges.
This algorithm starts by initializing the final list of edges with all the constraint edges for the
given problem. It then considers all other pairs of points of the problem and places these on
a candidate list of edges that is ordered based on the distance between the points. The
algorithm proceeds by removing the shortest edge on the candidate list and then adding this
edge to the final edge list if this edge does not intersect any of the edges already on the final
list. The “greedy” aspect of the algorithm is that it always tries to find the shortest edge it can
to add to the solution. The algorithm terminates when the candidate edge list is empty. The
final step determines what the resulting triangles are from the edges in the final edge list. The
greedy triangulation algorithm has the advantages that it is simple to implement and that it
gives reasonably shaped triangles. Its drawback is that it has computational complexity
O(n2).
Incorporating the mesh points into the polygonal model is a simple process that relies on
constrained triangulation. All of the polygons in the original model are processed one at a
time. Each of the vertices of a particular polygon are taken together with the mesh points that
lie on that polygon, and this collection of points is considered as a triangulation problem in
the plane of the given polygon. The edges of the original polygon serve as constraint edges
in this problem. The left half of Figure 5.8 shows a five-sided polygon taken from a
- 80 -
Figure 5.5: Original polygons of horse model (top, 13352 polygons) and a re-tiled
version of the same model (bottom, 32137 polygons).
- 81 -
Figure 5.6: Re-tiled horse model, where vertices are colored
based on a reaction-diffusion pattern.
Figure 5.7: Constrained triangulation.
Figure 5.8: Mutual tessellation of a face to incorporate mesh points.
- 82 -
hypothetical polygonal model and the two mesh points that lie on this polygon. This problem
is given to the greedy algorithm, and it returns a list of triangles as the solution. The right half
of Figure 5.8 shows the constrained triangulation solution for the example on the left. Now,
the original polygon is removed entirely from the model and is replaced with the new
collection of triangles. It is because we use the edges that bound the original polygon as
constraints during triangulation that we know the boundary of the new triangles will be the
same as the boundary of the polygon we remove. When this process is carried out for all
polygons in the model, the result is a model (entirely composed of triangles) that incorporates
all the points from the simulation mesh. This intermediate model in the re-tiling process is
called the mutual tessellation of the model.
The next step in the re-tiling process is to remove all the old vertices from the original model,
leaving only those vertices that were part of the simulation mesh. This can be accomplished
by once again invoking constrained triangulation. The idea is to replace the triangles that
immediately surround an old vertex V with a set of new triangles that do not include V and
that have the same collective boundary as the original triangles. To remove a particular vertex
V, we first find a plane that is an approximation of the tangent to the surface at V. Any
reasonable tangent approximation will do, and for the re-tilings found here we have used the
average of the surface normals of the polygons that share the vertex V. The next step is to
consider all the vertices of the model that form the triangles immediately surrounding V. The
left portion of Figure 5.9 shows a vertex V we wish to remove from a mutually tessellated
model and the triangles surrounding V. We now project all the vertices of these triangles
except V onto the tangent plane, and this gives us a new set of points for a constrained
triangulation problem. The additional edge constraints are those edges that did not have V
as an endpoint and that were part of the original set of triangles. These edges form the
boundary of the triangles surrounding V. The middle of Figure 5.9 shows such a constrained
triangulation problem from the model and the vertex V shown at the left. Constrained
triangulation is now invoked to give a new set of triangles (show at the right in Figure 5.9)
with the same boundary as the old set. The old triangles are then removed and replaced by
this new set of triangles. This process is repeated for each old vertex in the model until the
V (vertex to
remove)
Remove V and its edges
Figure 5.9: Removing an old vertex from a mutual tessellation.
- 83 -
only vertices that are left are those new vertices from the simulation mesh. The model has
now been re-tiled.
With this re-tiled model, it is now simple to assign the colors of the vertices based on the
concentrations of chemicals given by a reaction-diffusion simulation. The pattern on the
horse in Figure 5.6 was created using Turing’s spot-formation system.
The re-tiled models shown in this dissertation all have had the original vertices removed from
the model. A natural variant of the above re-tiling method would be to incorporate all the
mesh points into the model but then retain all the original vertices. There are good and bad
aspects to retaining the original vertices of the model. We have no values of chemical
concentration at the original vertices of the model. If we retained the original vertices we
would require some form of interpolation of chemical concentration at these vertices. On the
other hand, when we throw out the original vertices we are throwing out some of the geometry
of the model, and this is undesirable. In some instances this may cause sharp corners to be
lost. Models that keep the original vertices will have more polygons and will take longer to
display, but they will be faithful to the original model’s geometry. The ability to choose
between retaining and removing the original vertices would be a simple one to provide, and
this would allow a user to choose between geometric fidelity and display speed.
5.3.2 Macro-Displacement Mapping
Some patterns found in nature are not simply patterns of color but are also variations in the
roughness or bumpiness of a surface. For instance, the warts and bumps on a frog can be
Figure 5.10: Macro-displacement bumpy horse.
- 84 -
considered a pattern. We can create such patterns of geometry based on reaction-diffusion
simulations. Using the newly tiled model of an animal from the simulation mesh, we can
move the positions of the vertices of the model based on the pattern from a reaction-diffusion
simulation. Figure 5.10 shows a bumpy horse created in this manner. The vertices of this
model were pushed in a direction tangent to the surface, and the amount of motion of each
vertex was proportional to the concentration of chemical b from the Turing spot-formation
system. We will call this technique macro-displacement mapping. This is much the same
as the original displacement mapping technique described in [Cook 84].
In true displacement mapping, the positions of micropolygons are moved according to a
texture. Micropolygons are sub-pixel sized polygons that are created on-the-fly during the
rendering process. In contrast, macro-displacement mapping moves the polygons of a model
once to create a new model. This may be an important disadvantage. With macrodisplacement mapping, the individual polygons that are displaced will become noticeable if
the object is near enough to the viewer. This is not the case with true displacement mapping
because surfaces are split into micropolygons in a manner that is sensitive to the size of the
model on the screen. Macro-displacement mapping was used in this dissertation for two
reasons. First, no renderer was available that could be easily modified to do true displacement
mapping. This is a straightforward task left for future work. Second, the re-tiled models that
result from macro-displacement mapping can be rapidly displayed on fast graphics hardware.
This is an advantage over true displacement mapping. For instance, the model shown in
Figure 5.10 was displayed at more than ten frames per second on Pixel-Planes 5.
5.4 High-Quality Rendering of Reaction-Diffusion Textures
We now turn to a higher quality method of texturing an object using the pattern from a
reaction-diffusion simulation. The result of a simulation on a mesh is a set of irregularly
distributed measurements of chemical concentration over the surface of a given polygonal
model. The texturing method described in this section is based on a method to compute values
of chemical concentration at any position on the surface from these irregularly spaced values.
This is an interpolation problem over an irregular mesh of points. Texture interpolation is
usually done over regular meshes, and the method of irregular mesh interpolation described
in this dissertation is a new contribution to computer graphics. The interpolation method
described below produces images that minimize visible artifacts due to the simulation mesh.
As before, chemical concentration is mapped to color values to create the final texture of the
surface. This section begins by describing the sparse interpolation method that generates
function values at arbitrary positions on a polygonal model.
5.4.1 Sparse Interpolation on Polygonal Models
The problem at hand is to take discrete values of a function and to construct a continuous
function from these values. The numerical analysis literature is filled with ways of
interpolating between regularly spaced function values along a line or on a grid [Press 88].
Within the computer graphics field, the most commonly used method of interpolation is loworder polynomial fitting to regular grids of data. Linear, quadratic and cubic interpolation
- 85 -
methods are all commonly used for reconstruction in texturing, image warping and volume
rendering. It is far less common in graphics to reconstruct a continuous function from
irregularly spaced samples. One place where this problem does arise is in ray tracing.
Sometimes more rays are cast at pixels in places where the scene is more complex. These
additional rays may be evenly spaced, but more often their positions are randomly perturbed
to combat aliasing [Cook 86]. This is a very similar problem to that of interpolation of mesh
values over a polygonal model. The solution usually adopted for ray tracing is the weightedaverage filter. This is the method we will use for mesh interpolation. This and other methods
are evaluated in [Mitchell 87].
Let us examine the weighted-average filter in one dimension. We begin with a list of n
positions P1, P2,..., Pn and the function values F1, F2,..., Fn at each of these positions. The idea
behind the interpolation method is to allow nearby values to have a strong effect on the value
at a given position Q, and for that effect to fall off with distance from a sample position. We
will call this fall-off effect w: R → R, our weighting function from the reals into the reals.
This weighting function should have a maximum value at zero, fall off monotonically in the
positive and negative directions, and be symmetric around the origin. Figure 5.11 is a onedimensional illustration showing that the value at a position Q is found by weighting the
values of two nearby sample points. The equation for the weighted-average filter is:
n
∑F w( P
v (Q) =
i = 1
n
i
i
∑ w( P
i
i = 1
−Q / s )
−Q /s )
F2
F1
P1
v(Q)
Q
P2
Figure 5.11: Weighted-average at Q of two nearby sample points.
- 86 -
Each nearby function value is weighted according to its distance to the position Q. The scalar
quantity s stretches or contracts the range of action of the weighting function w. This method
of sparse interpolation works well if the discrete function values are not spaced too
irregularly. Fortunately, our mesh points are fairly regularly spaced due to the relaxation step
during mesh generation. The weighted-average filter generalizes quite naturally to our
problem.
Adapting the above equation to color values in three dimensions is straightforward. Allow
the function values F1, F2,..., Fn to be color values Fi = (redi, greeni, bluei) and let the positions
P1, P2,..., Pn be positions in three-space Pi = (xi, yi, zi). Then the interpolated color v(Q) of a
position Q = (x, y, z) can be evaluated directly from the above equation of the weightedaverage filter. All that is left to do is pick a suitable weighting function w. The two aspects
guiding our choice of w are smoothness of the function and speed of evaluation. A good
compromise between these two is given by the following function:
w(d) = 2d3 - 3d2 + 1
w(d) = 0
if 0 ≤ d ≤ 1
if d > 1
This function falls smoothly from the value 1 down to 0 in the domain [0,1], and its first
derivative is zero at both 0 and 1. This function is the only cubic polynomial with these
properties, and it can be found in several places in the graphics literature, e.g. [Perlin and
Hoffert 89]. The images in this dissertation have been made using a value of s = 2r, where
r is the radius of repulsion from the relaxation step of mesh generation. An important property
Figure 5.12: Leopard-horse, rendered using the weighted-average of nearby mesh values.
- 87 -
of the weighting function is that it is identically zero for distances greater than 1. This means
that mesh points that are further away than this distance do not contribute at all to the value
at a given position on the surface. We can use uniform spatial subdivision to rapidly
determine all the mesh points that fall within the radius of effect of the position. This reduces
the interpolation calculation at a particular location from an O(n) algorithm (examine all
mesh points in model) to O(1) since the number of nearby mesh points is a small finite value.
The leopard-horse in Figure 5.12 shows the result of this method of color interpolation. The
giraffe of Figure 4.15 shows another example of this texture rendering method. The patterns
on these models were created by two of the cascade systems described in Chapter 3.
The interpolation method described above allows a textured object to be as close to the viewer
as desired without displaying artifacts of the simulation mesh. The method as described does
not, however, address the problem of an object that covers very few pixels. We will examine
this issue now.
5.4.2 Diffusion of Colors for Pre-Filtering
As we look at texturing using mesh values, it will be helpful to refer to Figure 5.2, which
shows the four processes of texture filtering: reconstruction, warping, pre-filtering, and
resampling. As with image-based textures, the warping and resampling processes are
dictated by the scene composition and the screen size. The weighted-average filter described
above takes care of the reconstruction process. Now we will consider the issue of pre-filtering
using mesh values. The solution presented here is taken from the notion of an image pyramid
such as a mip map [Williams 83], and this idea is extended to our irregular texture meshes.
We cannot display information that has a higher frequency than our display device, so we can
use low-pass filtering to avoid aliasing. The idea of a mip map is to pre-compute different
versions of a texture at different amounts of low-pass filtering. We can extend the concept
from mip maps to reaction-diffusion textures by creating low-pass filtered (blurred) versions
of the texture meshes. The texture meshes are nothing more than color values Fi at positions
Pi. We will call level 0 the original set of color values, that is, an un-blurred version of the
texture. Level 1 will be a slightly blurred version of this original texture, and levels 2 and
higher will carry increasingly blurred color values. What we need now is a method of lowpass filtering those color values in a controlled fashion. It is our good fortune that diffusion
can provide us with a solution.
Let us look at diffusion on a two-dimensional grid in the plane. When the values of a grayscale image are allowed to diffuse across the image, the result is exactly the same as if the
image had been convolved with a Gaussian filter. Larger amounts of blurring (wider
Gaussian filters) are obtained by diffusing for longer periods of time. The relationship
between diffusion for a time t and convolution with a Gaussian kernel of standard deviation
s is t = s2 [Koenderink 84]. This gives us a method of producing our filtered levels 1, 2, and
higher. Texture level k+1 is created by allowing the colors of texture level k to diffuse for
the appropriate amount of time. Figure 5.13 shows three low-pass filtered versions of a spot
- 88 -
Figure 5.13: Increasingly blurred versions of a texture on a sea slug.
texture on a sea slug. Each level’s Gaussian kernel has a standard deviation that is twice that
of the next lower level.
Now that we have several band-limited versions of the texture’s color, we can select between
the appropriate levels based on the size of the textured object on the screen. The texture color
at a point will be a weighted average between the colors from two band-limited texture levels.
We can choose between blur levels and calculate the weighting between the levels at a pixel
from an approximation to the amount of textured surface that is covered by the pixel. This
estimate of surface area can be computed from the distance to the surface and the angle the
surface normal makes with the direction to the eye. The natural unit of length for this area
is r, the repulsion radius for mesh building. Let a be the area of the surface covered by a given
pixel, and let this area be measured in square units of r. Then the proper blur level L at a pixel
is:
L = log2( a)
We have produced short animated sequences using this anti-aliasing technique, and these
show no apparent aliasing of the textures. Figure 5.14 shows some stills from such an
animation. The texture of the figure is a blue-and-red version of the zebra texture shown in
Figure 4.10. Notice that as the horse model becomes smaller the colors blend together
towards purple. Compare this with the textures produced without using blur levels (Figure
5.15).
- 89 -
Figure 5.14: Frames from animation that was anti-aliased using
multiple band-limited versions of a stripe texture.
Figure 5.15: Frames from animation with no anti-aliasing.
- 90 -
5.4.3 Filter Quality
Let us evaluate the texture filter that is described above. We will look at the visual quality,
the computational cost, and the memory cost of the filter. Examining these issues will suggest
possible directions for future research in rendering of reaction-diffusion textures.
As we found earlier, the visual quality of the filter depends on both the reconstruction from
discrete samples and the pre-filter. The reconstruction filter used is a radial cubic weightedaverage filter. Unfortunately, the irregularity of the positions of the sample points makes it
rather difficult to evaluate rigorously the quality of this filter. We can evaluate some of its
properties by examining the shape of the filter in the spatial domain. The upper portion of
Figure 5.16 shows the shape of the weighting function. The function is continuous and has
continuous first and second derivatives. This means that the reconstructed function will be
continuous and will show no discontinuities in its first or second derivative. This is in contrast
to the mip map implementation described earlier which uses a reconstructed function that has
a discontinuous first derivative. We can get more of an idea of the filter’s properties by
examining it in the frequency domain. The lower portion of Figure 5.16 shows the weighting
function’s frequency spectrum. Notice that the filter’s spectrum does preserve most of the
low-frequency components of a signal while attenuating the high-frequency components.
This appears to be a reasonable approximation to the ideal resampling filter, the sinc function,
which has a spectrum that preserves all the low-frequency signal but removes all highfrequency components.
The pre-filter of our texture filter is based on multiple blurred levels of the texture. Using
diffusion, the blurred levels are equivalent to convolution of the original texture with a
Gaussian filter. The top portion of Figure 5.17 shows a Gaussian filter. Gaussian filters have
several favorable properties. First, the frequency spectrum of a Gaussian is another Gaussian.
The bottom portion of Figure 5.17 shows the spectrum of the Gaussian on the right. Notice
that this filter preserves much of the low-frequency information while attenuating the highfrequency components. Unfortunately, the Gaussian filter is not perfect since it attenuates
frequency components at the high end of the baseband that we would like to retain.
Nevertheless, this still compares favorably with the box filter often used in mip maps. The
box filter’s spectrum is a sinc function (Figure 5.18), which means that there are still
significant high-frequency components present in the filtered function. We used a Gaussian
filter because it is an acceptable compromise between quality of filtering and convenience
of computation.
The second important aspect of the pre-filter is the support of the filter, that is, the shape of
the region over which the filter averages samples. The process used to make the blur levels
is isotropic diffusion, which means that the texture is blurred evenly in all directions. This
means that the support of the filter is circular. This is a reasonable support when the textured
surface is nearly facing the viewer in a given scene. When the surface is viewed nearly edgeon, however, a circular support blurs the texture more than necessary. Mip maps also blur
textures for nearly edge-on orientations. A better support shape for nearly edge-on
- 91 -
Figure 5.16: Spatial (top) and frequency (bottom) graph of
the cubic weighting function w.
- 92 -
Figure 5.17: Spatial (top) and frequency (bottom) graph of a Gaussian filter.
- 93 -
Figure 5.18: Spatial (top) and frequency (bottom) graph of a box filter.
- 94 -
orientations is an ellipse. An elliptical support would average together more texture samples
along the direction of the surface that is more steeply angled with respect to the viewer. A
high-quality filter with this property called the Elliptical Weighted Average filter (EWA) is
described in [Greene and Heckbert 86] and [Heckbert 89]. The EWA filter averages together
an arbitrary number of samples within an elliptical region in the texture space, depending on
the orientation of the surface being textured. A similar scheme could be implemented for
reaction-diffusion texture meshes, although this would have a much higher computational
cost. This higher cost would be due to having to filter the texture in many orientations and
at several different ellipse eccentricities.
It is fortunate that images of scenes containing reaction-diffusion textures can be produced
without a dramatic cost in memory or computation time. As was mentioned earlier, the
amount of computation needed for a single evaluation of the texture filter is fixed. The
breakdown of costs is as follows:
1) Roughly a dozen color lookups in a spatial data structure for each of two levels.
2) The same number of evaluations of the weighted-average function w.
3) Linear interpolation between the two levels.
The cost of (3) is negligible compared to (1) and (2). One lookup in the hash table for the
uniform spatial subdivision requires two integer multiplies and a modulo evaluation.
Evaluation of w requires four multiplies and two add/subtracts with one more multiply and
two more adds to keep the running sums for the weighted average. This gives roughly 120
multiplies and 96 add/subtracts per texture evaluation. Several of the multiplies can be
eliminated by pre-computing and storing values of the weighted-average function in a table.
This amount of computation is the same magnitude as is needed to compute Gardner’s sumof-sines texture [Gardner 84] or a fractal texture based on Perlin’s solid noise function [Perlin
85]. As an example of rendering times, the leopard-horse shown in Figure 5.12 took 81
seconds to compute at 512 × 512 resolution on a DECstation 5000-125. This is a workstation
with 32 megabytes of memory and a 25Mhz clock for the CPU/FPU (R3000A/R3010) which
has roughly 26 MIPS and 3 MFLOPS (double precision) performance. The same scene
without texture required 15 seconds to render. The renderer used was a z-buffer polygon
renderer, and the shader in both cases used Phong interpolation of normal vectors and used
the Phong approximation for specular highlights [Phong 75].
The memory cost for a reaction-diffusion texture is, of course, dependent on the number of
cells in the simulation mesh. The mesh for Figure 5.12 had 64,000 cells in the mesh. Both
the positions P1, P2,..., Pn and the colors F1, F2,..., Fn need to be stored for each cell, as well
as a pointer for the hash table. When four different blur levels are stored (a typical number
of levels), this gives a cost of about 30 bytes per sample. This comes out to roughly two
megabytes for the single reaction-diffusion texture of Figure 5.12. For comparison, a 1024
× 1024 texture element mip map requires one megabyte of storage.
- 95 -
The table below gives an overview of some of the properties of the high-quality filter for
reaction-diffusion textures. It gives the same information for mip maps as a point of
comparison.
Reconstruction
Pre-filtering
Computational cost
Additional memory
Mip map
Linear filter
Box filter
Constant
1/3
Texture Meshes
Cubic filter
Gaussian filter
Constant (using spatial subdivision)
Number of blur levels (typically four)
5.4.4 Bump Mapping
Bump mapping (described in section 1.3) is a technique used to make a surface appear rough
or wrinkled without explicitly altering the surface geometry [Blinn 78]. The rough
appearance is created from a gray-scale texture by adding a perturbation vector to the surface
normal and then evaluating the lighting model based on this new surface normal. Perlin
showed that the gradient of a scalar-valued function in R3 can be used as a perturbation vector
to produce convincing surface roughness [Perlin 85]. We can use the gradient of the values
v(P) of a reaction-diffusion simulation to give a perturbation vector at a point P:
Figure 5.19: Bumpy horse created by perturbing the surface normals
based on a reaction-diffusion pattern.
- 96 -
d=rε
gx = (v(P) – v(P + [d,0,0])) / d
gy = (v(P) – v(P + [0,d,0])) / d
gz = (v(P) – v(P + [0,0,d])) / d
perturbation vector = [k gx , k gy , k gz]
The above method for computing the gradient of v evaluates the function at P and at three
nearby points in each of the x, y, and z directions. The value d is taken to be a small fraction
ε of the repulsive radius r to make sure we stay close enough to P that we get an accurate
estimate for the gradient. The gradient can also be computed directly from the definition of
v by calculating exactly the partial derivatives in x, y, and z. The scalar parameter k is used
to scale the bump features, and changing the sign of k causes bumps to become indentations
and vice versa. Figure 5.19 shows bumps created in this manner based on the results of a
reaction-diffusion system.
5.5 Hierarchy of Meshes
Storing information at various levels of detail for the purpose of faster rendering is a common
technique in computer graphics. The mip map is one example of this, where different levels
in the mip map give different amounts of detail of the texture. With mip maps, a low-detailed
level contains one-quarter the number of sample points as the next higher level of detail. In
contrast, the reaction-diffusion texture filter described earlier uses the same number of mesh
points at each of the different levels of texture meshes. In this section we will discuss building
a set of meshes for texturing that contain different numbers of sample points, just as is done
with mip maps. If, for example, we create a reaction-diffusion pattern on a mesh of 64,000
cells, we can also build meshes of 16000, 4000 and 1000 cells that are less-detailed versions
of the same texture. Such a hierarchy of meshes provides a more efficient way to render a
given object. When the object covers a small portion of the screen then one of the low-detail
meshes can be used to render the object. When the object covers much of the screen we can
use the fully-detailed texture mesh to render the object. Such a mesh hierarchy is more
efficient both in rendering time and in the use of memory. The sections below show that a
mesh hierarchy can be used to create several re-tiled models for rapid rendering on polygon
display hardware. To create such a mesh hierarchy, we will first need to create a “nested”
collection of mesh points. We will also determine the way a pattern can be passed down from
the most detailed mesh level to the other levels in the hierarchy.
5.5.1 Building Nested Point Sets
We will say that a set of points S on the surface of an object is nested within a larger point
set L if all the points in S are also present in the larger set L and if the points in L fill in the
spaces between the points in S. This is analogous to hierarchies of points on a regular grid
as is shown in Figure 5.20. In this figure, the solid grid points are a low-detail version of a
grid, and both the solid and hollow grid points taken together give the higher-detail grid. The
hollow points cover the area of the plane between the solid grid points. Figure 5.21 shows
a nested point set where the mesh points are irregular in spacing. It is possible to create several
- 97 -
Figure 5.20: A hierarchy of points on a regular grid.
Figure 5.21: An irregular set of nested points in the plane.
- 98 -
Figure 5.22: Nested points on a minimal surface.
levels of nested points. Let us examine the creation of such a hierarchy of mesh points over
a given polygonal model.
Assume we have a polygonal model and we wish to create four meshes over the surface that
contain 1000, 4000, 16000, and 64000 points. Further assume that we want all the mesh
points in the lower-detailed models to be present in the meshes with more detail. The first
step is to position 1,000 points on the original polygonal surface using point-repulsion. The
4,000 vertex mesh can be created by fixing the positions of the first 1,000 points, then placing
3,000 additional points on the object’s surface, and finally by allowing these new points to
be repelled by one another as well as by the 1,000 fixed points. The next mesh level is made
by fixing these 4,000 vertices and adding 12,000 more in the same manner in which we added
the previous 3,000. Now we have 1,000 points that have the same position in three meshes
and 4,000 points that are present in the same location in two of the meshes. Now 48,000 mesh
points can be positioned in the same manner as the previous two sets of mesh points. Figure
5.22 shows the positions of the points from three such levels of detail that were created in the
manner just described. For visual clarity, the levels in these meshes contain 200, 800 and
3200 points. The large black spots are the 200 initial points, the red spots are 600 additional
points, and the cyan spots are the final 2,400 points. The original object is a portion of a
minimal surface of mathematical interest that was modeled using 2,040 vertices. The spots
in this figure were rendered by changing the color at a given surface position if it is inside a
sphere centered at one of the 3,200 points.
5.5.2 Sharing Patterns Between Levels in Hierarchies
We need to determine a method of sharing patterns between the levels in a hierarchy of
meshes. Let us assume that we have created a reaction-diffusion pattern using a 64,000 point
- 99 -
mesh and we want to pass this pattern on to the mesh levels with 16000, 4000 and 1000 points.
To do this properly we should filter the pattern to match the amount of frequency information
that the different levels can properly represent. That is, we need to band-limit the pattern
appropriately for each level. We can do this by using the same Gaussian filtering (by
diffusion) that we used to create the different color levels for anti-aliasing. The steps for
sharing a pattern between levels are as follows:
1)
2)
3)
4)
Create reaction-diffusion pattern on full 64,000 point mesh.
Convert chemical concentration to a color pattern on this large mesh.
Create different blurred versions of the pattern on the large mesh by diffusion.
Obtain the appropriately band-limited colors for the less detailed meshes (16,000
points and fewer) from the correctly blurred patterns.
The idea behind this process is to pass the color information from the mesh points that only
appear in the high-detail meshes to the points that are in the lower-detailed meshes. Diffusion
over the high-detail mesh is the carrier of this information.
5.5.3 Hierarchies of Polygonal Models
Often for interactive graphics applications it is desirable to have several versions of a model,
each containing different amounts of detail. With such levels of detail we can choose from
among these versions to trade between fast rendering and high image quality. Earlier in this
chapter we saw that surface re-tiling can be used to build a polygonal model that incorporates
a pattern created by simulation. Since we can share pattern information in a hierarchy of
meshes, it is straightforward to create several polygonal models that capture these patterns
at different levels of detail. This gives us a choice of the number of polygons to use to display
the given object. A lower-detailed version of the model can be used to speed up rendering
when a textured object is far from the eyepoint in a given scene. The method described here
to create a hierarchy of polygonal models is based on the work described in [Turk 92].
We can start building a hierarchy of polygonal models by first creating a re-tiled model of
the object using the full set of points in our nested point set. This re-tiled model will have
as its vertices all of the mesh points of the full simulation mesh, and will capture all the detail
of the reaction-diffusion pattern. From the nested point set example above, this re-tiled model
would have 64,000 vertices. Then a 16,000 vertex model can be made by removing the
48,000 vertices in the original model that are not present in the more simple level of detail.
These vertices can be removed using constrained triangulation, just as was used earlier to
create re-tiled models. The vertices of this 16,000 vertex model should be colored according
to the blurred pattern that was described in the previous section. Simplified polygonal models
with 4,000 and 1,000 vertices can then be made by removing more un-shared vertices from
this 16,000 vertex model. Figure 5.23 shows four such polygonal models for a minimal
surface that has a striped texture.
- 100 -
Figure 5.23: Three re-tiled versions of a minimal surface with texturing. From left
to right the models contain 16000, 4000, and 1000 vertices.
- 101 -
6 Conclusion
This dissertation has demonstrated that a wide range of textures can be generated by
simulation of reaction-diffusion systems. These kinds of textures expand the array of patterns
that have been generated by procedural textures. The two sections below list the specific
contributions of this dissertation and outline directions for future work in this area.
6.1 Summary of Contributions
This dissertation demonstrates that reaction-diffusion textures can be integrated into the three
stages of texturing: acquisition, mapping, and rendering. Here is a list of the contributions:
• Introduced reaction-diffusion patterns to the field of computer graphics.
• Demonstrated that cascades of reaction-diffusion systems can produce a variety of twodimensional patterns. Several of these are patterns found in nature and have not previously
been created by any other model of pattern formation: stripes-within-stripes of the lionfish,
the mixed size spots on a cheetah, the rosettes of jaguars and leopards, and the stripe-and-spot
pattern on the thirteen-lined ground squirrel.
• Presented a procedure by which a reaction-diffusion system can be simulated over an
arbitrary polygonal model. This is done by creating a simulation mesh that is tailor-made for
the given model. This mesh is made by generating the Voronoi regions of a set of points that
have been evenly distributed over the surface. Simulating a reaction-diffusion system over
such a mesh results in textures that match the geometry of a model.
• Demonstrated two methods of rendering reaction-diffusion textures created on a simulation
mesh. One of these methods re-tiles the surface into triangles and incorporates a pattern by
specifying the colors at the vertices of this mesh. This results in fast rendering of reasonable
quality. A higher-quality method of rendering retains the original polygonal model and uses
a weighted average of mesh values to color each textured pixel.
• Presented a new method of re-tiling a polygonal model given a new set of vertices. This
technique was used to render reaction-diffusion textures, but it has applications wider than
that of texturing. The basic technique is useful for the automatic simplification of polygonal
models [Turk 92].
6.2 Future Work
A grand challenge of texture synthesis is the ability to create an arbitrary amount of texture
to fit a particular model upon being given a texture sample or a texture description. For
instance, a user might present a scanned image of tree bark to a hypothetical texturing system
and request the creation of more bark for a tree model based on this sample. Such a system
is still a distant goal and should provide fuel for future research on synthetic texturing. Any
attempt to solve this problem must address the aspects of a texture that are important to the
human visual system. A step towards this was taken by Coggins and Jain, who recognized
that texture in the perceptual domain is the local average energy across scales [Coggins and
Jain 85]. A logical step towards bringing together reaction-diffusion textures and perceptual
issues is to examine reaction-diffusion patterns in the frequency domain. Perhaps a bridge
could be formed between the addition of texture detail in cascaded systems and the features
detected by the human visual system at different scales.
There are still a number of areas related to reaction-diffusion textures that can be explored.
One area of research is to increase the variety of patterns that can be generated using reactiondiffusion. New patterns could be created by combining anisotropic systems [Witkin and Kass
91] with the cascade systems described here. It is likely that this would yield a rich set of new
textures. Exploring the patterns created by other equations is another open area of research.
Cascade could be enhanced to allow a user to enter new reaction-diffusion equations that
would cause code to be compiled and dynamically linked into the program. This would make
creating new reaction-diffusion systems easy and would greatly speed their exploration.
This dissertation focuses on two-dimensional reaction-diffusion patterns. It would be useful
to see how three-dimensional reaction-diffusion patterns could benefit computer graphics.
For instance, reaction-diffusion could be incorporated into a system such as Perlin and
Hoffert's hypertextures [Perlin and Hoffert 89]. Hypertextures are a way to extend the
function composition idea for creating solid textures to making three dimensional shapes.
These shapes are created by applying various shape-changing functions to volume elements.
Adding reaction-diffusion to a hypertexture system could add to the variety of available
primitive shapes and could also provide new operators for modifying objects that are defined
by other means.
Reaction-diffusion is only one of many models of physical systems that might be used to
create synthetic textures. The meshes used to simulate reaction-diffusion systems could be
used to simulate some of these other physical systems. These other systems include
chemotaxis (for snake patterns), diffusion-limited aggregation (for dendritic patterns) and
crack propagation (to create dried mud beds or patterns of tree bark). Nature is rich with
patterns that are waiting to be explored, understood and recreated.
- 103 -
Appendix A: Cascade Language
Cascade is an interactive program for exploring cascades of reaction-diffusion systems. At
the core of this program are the routines for simulating three reaction diffusion systems, two
for creating spots and one for making stripes. These simulation routines are provided in
Appendix B. Sitting above these simulation routines is a small language for specifying initial
values of parameters to the reaction-diffusion systems. This appendix describes the
language.
Central to a user’s interaction with Cascade is an interpreter for a language that specifies the
initial values of parameters for a reaction-diffusion system. It is this language that allows a
user to try new ideas about cascade systems without writing new code and performing
program re-compilation. There are three main sources of values for a parameter: 1) a userspecified constant, 2) another parameter in the same system, 3) another parameter in the
previous system. It is this ability to set one parameter based on a parameter in a previous
system that makes it easy to explore new cascade systems. Suppose, as is shown in Figure
3.5, that we are running Cascade with two systems, each having the parameters a and b. We
can set both parameters a and b of the second system to the value 4 by entering the following
in the parameter section:
a: 4.0
b: 4.0
We could just as well specify that b gets its value from the parameter a of the same system:
a: 4.0
b: [a]
The square brackets denote copying from a parameter in the same system. If we wanted b
to acquire its values from b of the previous system, we would enter:
a: 4.0
b: b
The above specification for b causes information from the first system to be passed on to the
second reaction-diffusion system, creating a cascade. Notice that the brackets are omitted if
a value is being copied from the previous system. Cascade also provides a set of arithmetic
operators to form more complex expressions. These operators include: addition, subtraction,
multiplication, division, minimum, maximum. Also included are boolean operators: and, or,
- 104 -
not, as well as relational operators: greater than, less than, equals, not equals. There is a
function that produces random numbers and there is a conditional expression “if” that selects
between two values based on the result of a boolean expression.
It is important to understand that these expressions that specify the initial values of each
parameter are computed only once for a given simulation. This is why these expressions can
be changed easily and evaluated interpretively without sacrificing interactivity. The
reaction-diffusion simulation code, however, is hard-coded into the program, and thus is
compiled. A typical reaction-diffusion system requires several thousand simulation steps
before the system has produced a final pattern, so speed is critical. The simulation routines
for the three basic reaction-diffusion systems that are built into Cascade are provided in
Appendix B. For this particular implementation of Cascade, a MasPar MP-1 parallel
computer is used to perform the simulations. The MasPar is particularly well suited to such
computations. It consists of a 64 × 64 array of processing elements (PEs), all executing the
same code in single-instruction multiple-data (SIMD) fashion. In Cascade, this grid of PEs
maps one-to-one with the simulation grid of the reaction-diffusion system. Each PE retains
a value for each of the parameters in the system. Each of the PEs can rapidly communicate
with its eight nearest neighbors, and this communication makes calculating the diffusion
terms simple and fast. The MasPar can run 2000 simulation steps for a 64 × 64 cell Turing
spot-forming system in under 1.5 seconds. This speed is quite adequate for interactive
exploration of cascade patterns. The same simulation on a 64 × 64 grid takes 160 seconds
on a DECstation 5000-125.
- 105 -
Appendix B: Reaction-Diffusion
Equations
This appendix gives code for the three reaction-diffusion systems that were used to create the
textures in this thesis. The systems are:
Alan Turing’s spot-formation system [Turing 52]:
∂a
2
= s(16 - ab) + Da∇ a
∂t
∂a
2
= s(ab - b - β) + Db∇ b
∂t
Hans Meinhardt’s spot-formation system [Meinhardt 82]:
2
∂a
2
= s(ap1 + 0.01aia + p3) + Da∇ a
∂t
b
∂b
2
= s(bp2 + 0.01aia 2) + Db∇ b
∂t
Hans Meinhardt’s stripe-formation system [Meinhardt 82]:
∂g1 cs2g12
2
= r - αg1 + Dg∇ g1 + ρ0
∂t
∂g2 cs1g22
2
= r - αg2 + Dg∇ g2 + ρ0
∂t
∂r
= cs2g12 + cs1g22 - βr
∂t
∂s1
2
= γ (g1 - s1) + Ds∇ s1 + ρ1
∂t
∂s2
2
= γ (g2 - s2) + Ds∇ s2 + ρ1
∂t
- 106 -
The procedures listed below are written in a variant of C for the Maspar MP-1 that has
extensions for SIMD parallel execution. A variable declared as plural is an indication that
each of the 4096 PEs (processing elements) are to allocate room to store a value for a given
variable name. Expressions that use plural variables look the same as normal C expressions
but they operate in a data-parallel fashion across all processing elements. Portions of
expressions such as xnetN[1].a are near-neighbor communications, using the Maspar’s xnet
communication network. This particular expression gets the value of the variable a from the
neighbor that is one PE to the north across the grid of PEs.
B.1 Turing Spots
/******************************************************************************
Turing's spot-forming reaction-diffusion equations.
Entry:
iters - number of iterations to perform
******************************************************************************/
visible void turing(iters)
int iters;
{
int i;
register plural float a,b;
register plural float beta,ka;
register plural float diff_a,diff_b;
register plural float delta_a,delta_b;
register plural float laplace_a,laplace_b;
register plural float speed;
register plural int frozen;
a
= load_float ("a");
b
= load_float ("b");
diff_a = load_float ("diff_a");
diff_b = load_float ("diff_b");
speed = load_float ("speed");
beta = load_float ("beta");
ka = load_float ("ka");
frozen = load_int ("frozen");
for (i = 0; i < iters; i++) {
/* diffuse */
laplace_a = xnetN[1].a + xnetS[1].a + xnetE[1].a + xnetW[1].a - 4 * a;
laplace_b = xnetN[1].b + xnetS[1].b + xnetE[1].b + xnetW[1].b - 4 * b;
- 107 -
/* react */
delta_a = ka * (16 - a * b) + diff_a * laplace_a;
delta_b = ka * (a * b - b - beta) + diff_b * laplace_b;
/* affect change */
if (!frozen) {
a += speed * delta_a;
b += speed * delta_b;
if (b < 0)
b = 0;
}
}
store_float (a, "a");
store_float (b, "b");
}
B.2 Meinhardt Spots
/******************************************************************************
Meinhardt's spot-making system that uses autocatalysis with lateral inhibition.
Entry:
iters - number of iterations to perform
******************************************************************************/
visible void auto_simulate(iters)
int iters;
{
int i;
register plural float a,b,ai;
register plural float diff1,diff2;
register plural float delta_a,delta_b;
register plural float laplace_a,laplace_b;
register plural float speed;
register plural float ka,kb;
register plural float temp;
register plural float s;
register plural int frozen;
plural float p1,p2,p3;
- 108 -
a
= load_float ("a");
b
= load_float ("b");
ai = load_float ("ai");
diff1 = load_float ("diff1");
diff2 = load_float ("diff2");
speed = load_float ("speed");
p1 = load_float ("p1");
p2 = load_float ("p2");
p3 = load_float ("p3");
s
= load_float ("s");
frozen = load_int ("frozen");
/* initial setup */
ka = -s * p1 - 4 * diff1;
kb = -s * p2 - 4 * diff2;
for (i = 0; i < iters; i++) {
/* diffuse */
laplace_a = xnetN[1].a + xnetS[1].a + xnetE[1].a + xnetW[1].a;
laplace_b = xnetN[1].b + xnetS[1].b + xnetE[1].b + xnetW[1].b;
/* react */
temp = 0.01 * ai * a * a;
delta_a = a * ka + diff1 * laplace_a + s * (temp / b + p3);
delta_b = b * kb + diff2 * laplace_b + s * temp;
/* affect change */
if (!frozen) {
a += speed * delta_a;
b += speed * delta_b;
}
}
store_float (a, "a");
store_float (b, "b");
}
- 109 -
B.3 Meinhardt Stripes
/******************************************************************************
Meinhardt's stripe-making reaction-diffusion system.
Entry:
iters - number of iterations to perform
******************************************************************************/
visible void stripe_simulate(iters)
int iters;
{
int i;
register plural float a,b,c,d,e,ai;
register plural float diff1,diff2;
register plural float delta_a,delta_b,delta_c,delta_d,delta_e;
register plural float laplace_a,laplace_b,laplace_d,laplace_e;
register plural float speed;
register plural float ka,kc,kd;
register plural float temp1,temp2;
register plural int frozen;
plural float p1,p2,p3;
a
= load_float ("a");
b
= load_float ("b");
c
= load_float ("c");
d
= load_float ("d");
e
= load_float ("e");
ai = load_float ("ai");
diff1 = load_float ("diff1");
diff2 = load_float ("diff2");
speed = load_float ("speed");
p1 = load_float ("p1");
p2 = load_float ("p2");
p3 = load_float ("p3");
frozen = load_int ("frozen");
/* initial setup */
ka = -p1 - 4 * diff1;
kc = -p2;
kd = -p3 - 4 * diff2;
- 110 -
for (i = 0; i < iters; i++) {
/* diffuse */
laplace_a = xnetN[1].a + xnetS[1].a + xnetE[1].a + xnetW[1].a;
laplace_b = xnetN[1].b + xnetS[1].b + xnetE[1].b + xnetW[1].b;
laplace_d = xnetN[1].d + xnetS[1].d + xnetE[1].d + xnetW[1].d;
laplace_e = xnetN[1].e + xnetS[1].e + xnetE[1].e + xnetW[1].e;
/* react */
temp1 = 0.01 * a * a * e * ai;
temp2 = 0.01 * b * b * d;
delta_a = a * ka + diff1 * laplace_a + temp1 / c;
delta_b = b * ka + diff1 * laplace_b + temp2 / c;
delta_c = c * kc + temp1 + temp2;
delta_d = d * kd + diff2 * laplace_d + p3 * a;
delta_e = e * kd + diff2 * laplace_e + p3 * b;
/* affect change */
if (!frozen) {
a += speed * delta_a;
b += speed * delta_b;
c += speed * delta_c;
d += speed * delta_d;
e += speed * delta_e;
}
}
store_float (a, "a");
store_float (b, "b");
store_float (c, "c");
store_float (d, "d");
store_float (e, "e");
}
- 111 -
Appendix C: Cascaded Systems
This section provides the exact parameter specifications for the cascade textures presented
in Section 3.4.2. Parameters in the left column are for the first reaction-diffusion system, and
those in the right column are for the second, cascaded system.
Cheetah
system_name: turing_spots
iterations: 13000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/200
system_name: turing_spots
iterations: 3000
interval: 1000
frozen: b < 4
speed: 1.0
a: a
b: b
diff_a: 1/8
diff_b: 1/32
beta: beta
ka: 1/60
Lionfish
system_name: stripes
system_name: stripes
iterations: 20000
iterations: 8000
interval: 4000
interval: 1000
frozen: 0
frozen: b < 0.7
speed: 1.0
speed: 1.0
p1: 0.04
p1: 0.04
p2: 0.06
p2: 0.06
p3: 0.04
p3: 0.04
a: [p2] / (2 * [p1])
a: if([frozen],a,[p2]/(2*[p1]))
b: [a]
b: if([frozen],b,[a])
c: 0.02 * [a] * [a] * [a] / [p2] c: if([frozen],c,0.02*[a]*[a]*[a]/[p2])
d: [a]
d: if([frozen],d,[a])
e: [a]
e: if([frozen],e,[a])
ai: random(1,0.02)
ai: if([frozen],ai,random(1,0.02))
diff1: 0.04
diff1: 0.009
diff2: 0.06
diff2: 0.06
- 112 -
Leopard
system_name: turing_spots
iterations: 28000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 0.05 * 1/16
system_name: turing_spots
iterations: 7000
interval: 1000
frozen: b < 4
speed: 1.0
a: if([frozen],4,a)
b: if([frozen],4,b)
diff_a: 1/8
diff_b: 1/32
beta: beta
ka: 0.2 * 1/16
Autocatalytic Spots
system_name: autocatalysis
iterations: 20000
interval: 4000
frozen: 0
speed: 1.0
p1: 0.03
p2: 0.04
p3: 0.0
a: [p2] / [p1]
b: 0.01 * [a] * [a] / [p2]
ai: random(1,0.2)
diff1: 0.01
diff2: 0.2
s: 0.2
system_name: turing_spots
iterations: 0
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/80
Vary Spots
system_name: autocatalysis
iterations: 6000
interval: 2000
frozen: 0
speed: 1.0
p1: 0.03
p2: 0.04
p3: 0.0
a: [p2] / [p1]
b: 0.01 * [a] * [a] / [p2]
ai: random(1,0.2)
diff1: 0.01
diff2: 0.2
s: x + 0.2
system_name: turing_spots
iterations: 0
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/80
- 113 -
Eroded Stripes
system_name: stripes
system_name: stripes
iterations: 16000
iterations: 4000
interval: 4000
interval: 1000
frozen: 0
frozen: 0
speed: 1.0
speed: 1.0
p1: 0.04
p1: 0.04
p2: 0.06
p2: 0.06
p3: 0.04
p3: 0.04
a: [p2] / (2 * [p1])
a: a + 0 * [p2] / (2 * [p1])
b: [a]
b: b + 0 * [a]
c: 0.02 * [a] * [a] * [a] / [p2] c: c + 0 * 0.02 * [a] * [a] * [a] / [p2]
d: [a]
d: d + 0 * [a]
e: [a]
e: e + 0 * [a]
ai: random(1,0.02)
ai: ai
diff1: 0.04
diff1: 0.01
diff2: 0.06
diff2: 0.06
Thin Lines
system_name: stripes
iterations: 12000
interval: 4000
frozen: 0
speed: 1.0
p1: 0.04
p2: 0.06
p3: 0.04
a: [p2] / (2 * [p1])
b: [a]
c: 0.02 * [a] * [a] * [a] / [p2]
d: [a]
e: [a]
ai: random(1,0.02)
diff1: 0.03
diff2: 0.06
system_name: turing_spots
iterations: 3000
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: 12 + (a - .7) * 2
ka: 1/80
Small Spots
system_name: turing_spots
iterations: 20000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/200
system_name: turing_spots
iterations: 1000
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: a * 2
ka: 1/80
- 114 -
Honeycomb
system_name: turing_spots
iterations: 20000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/200
system_name: turing_spots
iterations: 1000
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: b * 2.7
ka: 1/80
Wide Spots
system_name: turing_spots
iterations: 20000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/250
system_name: stripes
iterations: 2000
interval: 1000
frozen: 0
speed: 1.0
p1: 0.04
p2: 0.06
p3: 0.04
a: [p2] / (2 * [p1])
b: [a] + 0.04 * b
c: 0.02 * [a] * [a] * [a] / [p2]
d: [a]
e: [a]
ai: random(1,0.02)
diff1: 0.02
diff2: 0.06
Plates
system_name: turing_spots
iterations: 20000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/250
system_name: stripes
iterations: 2000
interval: 1000
frozen: 0
speed: 1.0
p1: 0.04
p2: 0.06
p3: 0.04
a: [p2] / (2 * [p1])
b: [a] + 0.04 * b
c: 0.02 * [a] * [a] * [a] / [p2]
d: [a]
e: [a]
ai: random(1,0.02)
diff1: 0.01
diff2: 0.06
- 115 -
Broken Lines
system_name: turing_spots
iterations: 16000
interval: 4000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/250
system_name: turing_spots
iterations: 32000
interval: 4000
frozen: 0
speed: 0.5
a: 4.0
b: 4.0
diff_a: 1/8 + 0.02 * b
diff_b: 1/32
beta: random(12,0.1)
ka: 1/60
Bumpy Stripes
system_name: autocatalysis
iterations: 28000
interval: 4000
frozen: 0
speed: 1.0
p1: 0.03
p2: 0.1
p3: 0.0
a: [p2] / [p1]
b: 0.01 * [a] * [a] / [p2]
ai: random(1,0.1)
diff1: 0.01
diff2: 0.2
s: 0.5
system_name: turing_spots
iterations: 0
interval: 1000
frozen: 0
speed: 1.0
a: 4.0
b: 4.0
diff_a: 1/8
diff_b: 1/32
beta: random(12,0.1)
ka: 1/80
Mixed Spots
system_name: stripes
system_name: autocatalysis
iterations: 12000
iterations: 2000
interval: 4000
interval: 1000
frozen: 0
frozen: 0
speed: 1.0
speed: 1.0
p1: 0.04
p1: 0.03
p2: 0.06
p2: 0.04
p3: 0.04
p3: 0.0
a: [p2] / (2 * [p1])
a: [p2]/[p1]
b: [a]
b: 0.01 * [a] * [a] / [p2]
c: 0.02 * [a] * [a] * [a] / [p2] ai: random(1,0.2)
d: [a]
diff1: 0.01
e: [a]
diff2: 0.2
ai: random(1,0.02)
s: 4.0 * (1.45 - b) + 0.3
diff1: 0.04
diff2: 0.06
- 116 -
Squirrel
system_name: stripes
iterations: 3000
interval: 1000
frozen: 0
speed: 1.0
p1: 0.04
p2: 0.06
p3: 0.04
a: [p2] / (2 * [p1])
b: [a]
c: 0.02 * [a] * [a] * [a] / [p2]
d: [a]
e: [a]
ai: random(1,0.003) + (x > 0.9)
diff1: 0.04
diff2: 0.06
system_name: turing_spots
iterations: 6000
interval: 1000
frozen: b < 0.5
speed: 0.5
a: if([frozen],4.15,a)
b: if([frozen],4.15,b)
diff_a: .25
diff_b: .0625
beta: random(12,0.1)
ka: 0.01875
- 117 -
References
[Alberts et al 89] Alberts, Bruce, Dennis Bray, Julian Lewis, Martin Raff, Keith Roberts and
James D. Watson, Molecular Biology of the Cell, Garland Publishing, Inc., 1989, New York.
[Anderson and Nusslein-Volhard 84] Anderson, K. V. and C. Nusslein-Volhard, “Information for the Dorsal-Ventral Pattern of the Drosophila Embryo is Stored in Maternal mRNA,”
Nature, Vol. 331, pp. 223–227 (1984).
[Bard 81] Bard, Jonathan B. L., “A Model for Generating Aspects of Zebra and Other
Mammalian Coat Patterns,” Journal of Theoretical Biology, Vol. 93, No. 2, pp. 363–385
(November 1981).
[Bard and Lauder 74] Bard, Jonathan and Ian Lauder, “How Well Does Turing’s Theory of
Morphogenesis Work?,” Journal of Theoretical Biology, Vol. 45, No. 2, pp. 501–531 (June
1974).
[Bier and Sloan 86] Bier, Eric A. and Kenneth R. Sloan, Jr., “Two-Part Texture Mapping,”
IEEE Computer Graphics and Applications, Vol. 6, No. 9, pp. 40–53 (September 1986).
[Blinn and Newell 76] Blinn, James F. and Martin E. Newell, “Texture and Reflection in
Computer Generated Images,” Communications of the ACM, Vol. 19, No. 10, pp. 542–547
(October 1976).
[Blinn 77] Blinn, James F., “Models of Light Reflection for Computer Synthesized Pictures,”
SIGGRAPH ’77, pp. 192–198.
[Blinn 78] Blinn, James F., “Simulation of Wrinkled Surfaces,” Computer Graphics, Vol. 12,
No. 3 (SIGGRAPH ’78), pp. 286–292 (August 1978).
[Bloomenthal 85] Bloomenthal, Jules, “Modeling the Mighty Maple,” Computer Graphics,
Vol. 19, No. 3 (SIGGRAPH ’85), pp. 305–311 (July 1985).
[Borgens 82] Borgens, R. B., “What is the Role of Naturally Produced Electric Current in
Vertebrate Regeneration and Healing?” International Review of Cytology, Vol. 76, pp. 245–
300 (1982).
[Burt 81] Burt, Peter J., “Fast Filter Transformations for Image Processing,” Computer
Graphics and Image Processing, Vol. 16, No. 1, pp. 20–51 (May 1981).
- 118 -
[Castleman 79] Castleman, Kenneth R., Digital Image Processing, Prentice-Hall, 1979,
Englewood Cliffs, New Jersey.
[Catmull 74] Catmull, Edwin E., “A Subdivision Algorithm for Computer Display of Curved
Surfaces,” Ph.D. Thesis, Department of Computer Science, University of Utah (December
1974).
[Child 41] Child, Charles Manning, Patterns and Problems of Development, University of
Chicago Press, 1941, Chicago, Illinois.
[Coggins and Jain 85] Coggins, James M. and Anil K. Jain, “A Spatial Filtering Approach
to Texture Analysis,” Pattern Recognition Letters, Vol. 3, No. 3, pp. 195–203 (May 1985).
[Cook 84] Cook, Robert L., “Shade Trees,” Computer Graphics, Vol. 18, No. 3 (SIGGRAPH
’84), pp. 223–231 (July 1984).
[Cook 86] Cook, Robert L., “Stochastic Sampling in Computer Graphics,” ACM Transactions on Graphics, Vol. 5, No. 1, (January 1986).
[Crow 84] Crow, Franklin C., “Summed-Area Tables for Texture Mapping,” Computer
Graphics, Vol. 18, No. 3 (SIGGRAPH ’84), pp. 207–212 (July 1984).
[de Reffye 88] de Reffye, Phillippe, Claude Edelin, Jean Francon, Marc Jaeger and Claude
Puech, “Plant Models Faithful to Botanical Structure and Development,” Computer Graphics, Vol. 22, No. 4 (SIGGRAPH ’88), pp. 151–158 (August 1988).
[Fournier and Fiume 88] Fournier, Alan and Eugene Fiume, “Constant-Time Filtering with
Space-Variant Kernels,” Computer Graphics, Vol. 22, No. 4 (SIGGRAPH ’88), pp. 229–238
(August 1988).
[Fowler et al 92] Fowler, Deborah R., Hans Meinhardt and Przemyslaw Prusinkiewicz,
“Modeling Seashells,” Computer Graphics, Vol. 26, No. 2 (SIGGRAPH ’92), pp. 379–387
(July 1992).
[Fuchs et al 89] Fuchs, Henry, John Poulton, John Eyles, Trey Greer, Jack Goldfeather, David
Ellsworth, Steve Molnar, Greg Turk, Brice Tebbs and Laura Israel, “Pixel-Planes 5: A
Heterogeneous Multiprocessor Graphics System Using Processor-Enhanced Memories,”
Computer Graphics, Vol. 23, No. 3 (SIGGRAPH ’89), pp. 79–88 (July 1989).
[Gardner 84] Gardner, Geoffrey Y., “Simulation of Natural Scenes Using Textured Quadric
Surfaces,” Computer Graphics, Vol. 18, No. 3 (SIGGRAPH ’84), pp. 11–20 (July 1984).
[Gardner 85] Gardner, Geoffrey Y., “Visual Simulation of Clouds,” Computer Graphics,
Vol. 19, No. 3 (SIGGRAPH ’85), pp. 297–303 (July 1985).
- 119 -
[Gilbert 88] Gilbert, Scott F., Developmental Biology, Sinauer Associates, Inc., 1988,
Sunderland, Massachusetts.
[Glassner 86] Glassner, Andrew, “Adaptive Precision in Texture Mapping,” Computer
Graphics, Vol. 20, No. 4 (SIGGRAPH ’86), pp. 297–306 (August 1986).
[Greene and Heckbert 86] Greene, Ned and Paul S. Heckbert, “Creating Raster Omnimax
Images from Multiple Perspective Views Using The Elliptical Weighted Average Filter,”
IEEE Computer Graphics and Applications, Vol. 6, No. 6, pp. 21–27 (June 1986).
[Harris 73] Harris, Albert K., “Behavior of Cultured Cells on Substrate of Various Adhesiveness,” Experimental Cell Research, Vol. 77, pp. 285–297 (1973).
[Harris et al 84] Harris, Albert K., David Stopak and Patricia Warner, “Generation of
Spatially Periodic Patterns by a Mechanical Instability: A Mechanical Alternative to the
Turing Model,” Journal of Embryology and Experimental Morphology, Vol. 80, pp. 1–20
(1984).
[Harris 92] Harris, Albert K., personal communication.
[He et al 91] He, Xiao D., Kenneth E. Torrance, Francois X. Sillion and Donald P. Greenberg,
“A Comprehensive Physical Model for Light Reflection,” Computer Graphics, Vol. 25, No.
4 (SIGGRAPH ’91), pp. 175–186 (July 1991).
[Heckbert 86] Heckbert, Paul S., “Filtering by Repeated Integration,” Computer Graphics,
Vol. 20, No. 4 (SIGGRAPH ’86), pp. 317–321 (August 1986).
[Heckbert 89] Heckbert, Paul S., “Fundamentals of Texture Mapping and Image Warping,”
M.S. Thesis, Department of Electrical Engineering and Computer Science, University of
California at Berkeley (June 1989).
[Ho-Le 88] Ho-Le, K., “Finite Element Mesh Generation Methods: A Review and
Classification,” Computer Aided Design, Vol. 20, No. 1, pp. 27–38 (January/February 1988).
[Hubel and Wiesel 79] Hubel, David H. and Torsten N. Wiesel, “Brain Mechanisms of
Vision,” Scientific American, Vol. 241, No. 3, pp. 150–162 (September 1979).
[Hunding 90] Hunding, Axel, Stuart A. Kauffman, and Brian C. Goodwin, “Drosophila
Segmentation: Supercomputer Simulation of Prepattern Hierarchy,” Journal of Theoretical
Biology, Vol. 145, pp. 369–384 (1990).
[Jaffe and Stern 79] Jaffe, L. F. and C. D. Stern, “Strong Electrical Currents Leave the
Primitive Streak of Check Embryos,” Science, Vol. 206, pp. 569–571 (1979).
- 120 -
[Kauffman et al 78] Kauffman, Stuart A., Ronald M. Shymko and Kenneth Trabert, “Control
of Sequential Compartment Formation in Drosophila,” Science, Vol. 199, No. 4326, pp.
259–270 (January 20, 1978).
[Koenderink 84] Koenderink, Jan J., “The Structure of Images,” Biological Cybernetics, Vol.
50, No. 5, pp. 363–370 (August 1984).
[Lacalli 90] Lacalli, Thurston C., “Modeling the Drosophila Pair-Rule Pattern by ReactionDiffusion: Gap Input and Pattern Control in a 4-Morphogen System,” Journal of Theoretical
Biology, Vol. 144, pp. 171–194 (1990).
[Lengyel and Epstein 91] Lengyel, István and Irving R. Epstein, “Modeling of Turing
Structures in the Chlorite–Iodide–Malonic Acid–Starch Reaction System,” Science, Vol.
251, No. 4994, pp. 650–652 (February 8, 1991).
[Levoy and Whitted 85] Levoy, Marc and Turner Whitted, “The Use of Points as a Display
Primitive,” Technical Report TR 85-022, University of North Carolina at Chapel Hill (1985).
[Lewis 84] Lewis, John-Peter, “Texture Synthesis for Digital Painting,” Computer Graphics,
Vol. 18, No. 3 (SIGGRAPH ’84), pp. 245–252 (July 1984).
[Lewis 89] Lewis, J. P., “Algorithms for Solid Noise Synthesis,” Computer Graphics, Vol.
23, No. 3 (SIGGRAPH ’89), pp. 263–270 (July 1989).
[Lorensen and Cline 87] Lorensen, William E. and H. E. Cline, “Marching Cubes: A High
Resolution 3D Surface Construction Algorithm,” Computer Graphics, Vol. 21, No. 3
(SIGGRAPH ’87), pp. 163–169 (July 1987).
[Max 81] Max, Nelson, “Vectorized Procedural Models for Natural Terrain: Waves and
Islands in the Sunset,” Computer Graphics, Vol. 15, No. 3 (SIGGRAPH ’81), pp. 317–324
(August 1981).
[Meinhardt 82] Meinhardt, Hans, Models of Biological Pattern Formation, Academic Press,
London, 1982.
[Meinhardt and Klinger 87] Meinhardt, Hans and Martin Klinger, “A Model for Pattern
Formation on the Shells of Molluscs,” Journal of Theoretical Biology, Vol. 126, No. 1, pp.
63–89 (May 1987).
[Melhorn 84] Melhorn, Kurt, Multi-dimensional Searching and Computational Geometry,
Springer-Verlag, 1984.
[Mitchell 87] Mitchell, Don P., “Generating Antialiased Images at Low Sampling Densities,”
Computer Graphics, Vol. 21, No. 4 (SIGGRAPH ’87), pp. 65–72 (July 1987).
- 121 -
[Mitchell and Netravali 88] Mitchell, Don P. and Arun N. Netravali, “Reconstruction filters
in Computer Graphics,” Computer Graphics, Vol. 22, No. 4 (SIGGRAPH ’88), pp. 221–228
(August 1988).
[Mount 85] Mount, David M., “Voronoi Diagrams on the Surface of a Polyhedron,”
Technical Report 1496, University of Maryland (1985).
[Murray and Kirschner 89] Murray, Andrew W. and Marc W. Kirschner, “Dominoes and
Clocks: The Union of Two Views of the Cell Cycle,” Science, Vol. 246, No. 4930, pp. 614–
621 (November 3, 1989).
[Murray 81] Murray, J. D., “On Pattern Formation Mechanisms for Lepidopteran Wing
Patterns and Mammalian Coat Markings,” Philosophical Transactions of the Royal Society
B, Vol. 295, pp. 473–496.
[Murray and Myerscough 91] Murray, J. D. and M. R. Myerscough, “Pigmentation Pattern
Formation on Snakes,” Journal of Theoretical Biology, Vol. 149, pp. 339–360 (1991).
[O’Neill 66] O’Neill, Barrett, Elementary Differential Geometry, Academic Press, 1966,
New York.
[Oppenheim and Schafer 75] Oppenheim, A. V. and R. W. Schafer, Digital Signal Processing, Prentice-Hall, 1975, Englewood Cliffs, New Jersey.
[Oster 88] Oster, George F., “Lateral Inhibition Models of Developmental Processes,”
Mathematical Biosciences, Vol. 90, No. 1 & 2, pp. 265–286 (1988).
[Oster, Murray and Harris 83] Oster, G. F., J. D. Murray and A. K. Harris, “Mechanical
Aspects of Mesenchymal Morphogenesis,” Journal of Embryology and Experimental
Morphology, Vol. 78, pp. 83–125 (1983).
[Peachey 85] Peachey, Darwyn R., “Solid Texturing of Complex Surfaces,” Computer
Graphics, Vol. 19, No. 3 (SIGGRAPH ’85), pp. 279–286 (July 1985).
[Perlin 85] Perlin, Ken, “An Image Synthesizer,” Computer Graphics, Vol. 19, No. 3
(SIGGRAPH ’85), pp. 287–296 (July 1985).
[Perlin and Hoffert 89] Perlin, Ken and Eric M. Hoffert, “Hypertexture,” Computer
Graphics, Vol. 23, No. 3 (SIGGRAPH ’89), pp. 253–262 (July 1989).
[Phong 75] Bui-Tuong, Phong, “Illumination for Computer Generated Pictures,” Communications of the ACM, Vol. 18, No. 6, pp. 311–317 (June 1975).
- 122 -
[Poole and Steinberg 82] Poole, T. J. and M. S. Steinberg, “Evidence for the Guidance of
Pronephric Duct Migration by a Cranio-caudally Traveling Adhesive Gradient,” Developmental Biology, Vol. 92, pp. 144–158 (1982).
[Preparata and Shamos 85] Preparata, Franco P. and Michael Ian Shamos, Computational
Geometry: An Introduction, Springer-Verlag, 1985, New York.
[Press 88] Press, William H., Brian P. Flannery, Saul A. Teukolsky and William T.
Vetterling, Numerical Recipes in C, Cambridge University Press, 1988.
[Rhoades et al 92] Rhoades, John, Greg Turk, Andrew Bell, Andrei State, Ulrich Neumann
and Amitabh Varshney, “Real-Time Procedural Textures,” 1992 Symposium on Interactive
3D Graphics, Cambridge, Massachusetts, March 29 – April 1, 1992.
[Rosavio et al 83] Rosavio, R. A., A. Delouvee, K. M. Yamada, R. Timpl and J.-P. Thiery,
“Neural Crest Cell Migration: Requirements for Exogenous Fibronectin and High Cell
Density,” Journal of Cell Biology, Vol. 96, pp. 462–473 (1983).
[Samek 86] Samek, Marcel, Cheryl Slean and Hank Weghorst, “Texture Mapping and
Distortion in Digital Graphics,” The Visual Computer, Vol. 2, No. 5, pp. 313–320 (September
1986).
[Schachter 80] Schachter, Bruce, “Long Crested Wave Models,” Computer Graphics and
Image Processing, Vol. 12, pp. 187–201 (1980).
[Schachter 83] Schachter, Bruce, Computer Image Generation, Wiley, 1983, New York.
[Stopak and Harris 82] Stopak, David and Albert K. Harris, “Connective Tissue Morphogenesis by Fibroblast Traction,” Developmental Biology, Vol. 90, No. 2, pp. 383–398 (April
1982).
[Swindale 80] Swindale, N. V., “A Model for the Formation of Ocular Dominance Stripes,”
Proceedings of the Royal Society of London, Series B, Vol. 208, pp. 243–264 (1980).
[Thompson et al 85] Thompson, Joe F., Z. U. A. Warsi and C. Wayne Mastin, Numerical Grid
Generation, North Holland, 1985, New York.
[Turing 52] Turing, Alan, “The Chemical Basis of Morphogenesis,” Philosophical Transactions of the Royal Society B, Vol. 237, pp. 37–72 (August 14, 1952).
[Turk 90] Turk, Greg, “Generating Random Points in Triangles,” in Graphics Gems, edited
by Andrew Glassner, Academic Press, 1990.
[Turk 91] Turk, Greg, “Generating Textures on Arbitrary Surfaces Using Reaction-Diffusion,” Computer Graphics, Vol. 25, No. 4 (SIGGRAPH ’91) pp. 289–298.
- 123 -
[Turk 92] Turk, Greg, “Re-Tiling Polygonal Surfaces,” Computer Graphics, Vol. 26. No. 2
(SIGGRAPH ’92), pp. 55–64 (July 1992).
[Weiss 34] Weiss, P., “In Vitro Experiments on the Factors Determining the course of the
Outgrowing Verve Fiber,” Journal of Experimental Zoology, Vol. 68, pp. 393–448 (1934).
[Westover 90] Westover, Lee, “Footprint Evaluation for Volume Rendering,” Computer
Graphics, Vol. 24, No. 4 (SIGGRAPH ’90), pp. 367–376 (August 1990).
[Whitted 80] Whitted, Turner, “An Improved Illumination Model for Shaded Display,”
Communications of the ACM, Vol. 23, No. 6, pp. 343–349 (June 1980).
[Williams 83] Williams, Lance, “Pyramidal Parametrics,” Computer Graphics, Vol. 17, No.
3 (SIGGRAPH ’83), pp. 1–11 (July 1983).
[Witkin and Kass 91] Witkin, Andrew and Michael Kass, “Reaction-Diffusion Textures,”
Computer Graphics, Vol. 25, No. 4 (SIGGRAPH ’91), pp. 299–308 (July 1991).
[Wolpert 71] Wolpert, Lewis, “Positional Information and Pattern Formation,” Current
Topics in Developmental Biology, Vol. 6, Edited by A. A. Moscona and Alberto Monroy,
Academic Press, 1971.
[Yeager and Upson] Yeager, Larry and Craig Upson, “Combining Physical and Visual
Simulation — Creation of the Planet Jupiter for the Film 2010,” Computer Graphics, Vol.
20, No. 4 (SIGGRAPH ’86), pp. 85–93 (August 1986).
[Young 84] Young, David A., “A Local Activator-Inhibitor Model of Vertebrate Skin
Patterns,” Mathematical Biosciences, Vol. 72, pp. 51–58 (1984).
- 124 -
Download