ABSTRACT
The purpose of this project is to create 3D engine
that displays the interaction of non-rigid bodies. As a part
of our project we researched existing models for elastic and
deformable bodies and algorithms for their collision detection
and collision response. We have created a model of the object
as a set of points connected by springs of given elasticity factor
k. The model uses spring forces and damping to give elasticity
to the objects. Object collisions are determined using our collision
detection engine. After collision occurs the response is calculated
using physics laws.
MODEL
OF A SINGLE OBJECT
- Overview
The
objects we are working with are elastic and deformable bodies.
They change their shape under the influence of outside forces
and then return to their original shapes. Considering gravity
as an
external force, in the real world situation, even in a state
of rest, for example sitting on a table, this type of object
will
have a slight deformation of shape and due to it the springs
will not be in equilibrium. This can be used to model objects
made out
of rubber, jell, metal or other similar substances.
These objects behave according to a set of rules commonly used
in physics models. They maintain constant velocity and shape
if no external forces are applied (Newton’s First Law).
Without deformation the object has six degrees of freedom (three
for translation
and three for rotation). If an external force is applied to
some part of the object it deforms to find a state of rest
where its
internal energy is balanced by its external forces. If the
influence of the force stops, the object returns to its previous
shape, after
any vibrations have dampened. We will assume that objects are
non-breakable, do not change their elasticity over time, and
do not deform permanently.
- Prior
Work
Over the past two decades, people in academia and industry
have been working on simulating physically realistic
elastic objects.
Different models have been developed over time. Most of
them use some kind of elasticity rule combined with different
constraints Terzopoulos and Witkin presented the Hybrid
model [4], where
an object has a reference component, which represent shape
and displacement
components. These components represent a deformation from
the initial shape. In later research other models and ideas
were introduced,
including the concept of local and global deformations
[5]; using extra layer coatings [8]; using elastic grids with
additional constraints.
Recently, adaptive models for elastic and deformable bodies
were developed; some of them use mass-spring system similar
to the one
we used for our project [6]. Compared to these models,
our
model is quite simple; however it includes all the main
factors needed
to animate and provide interaction between elastic and
deformable bodies.
- Description
For our models an object is represented as a mesh of polygons,
namely triangles. The edges of the triangles possess
the physical qualities of springs. Vertices have properties
of rigid bodies
that are connected by springs. Vertices have only three
degrees of freedom – they can move in space but cannot
rotate. If a distance between two adjacent vertices shortens,
the spring
which
connects them forces them to move farther from each other
and vice versa.
The principal idea behind our model is that each point
behaves as an independent body, or particle, and only spring
forces
of its direct neighbors affect velocity and acceleration
of this point.
In our model we do not maintain information about linear
and angular acceleration or the velocity of the object,
and instead we only
store the accelerations and velocities of each particle.
-
Physics Involved
As mentioned earlier, the main forces that move and deform
the objects are the internal spring forces of is
edges. The force applied
on each vertex is calculated by the spring equation
[1]:

Where
k is elasticity constant of the object and Dx is the displacement
of the length of
the edge, and n is
number of
direct neighbors
of the vertex. Although we work in
3D, this force is calculated as projection on 1D space of each
edge.
While working with springs the problem of damping
arises. In a real world,
springs do not oscillate forever because
of the
loss
of internal energy. In graphics
and mechanics the loss can be simulated by applying
a damping on the spring.
There are
several ways to
do damping: viscous damping,
linear damping, or Rayleigh’s
damping [1]. For this project
we have chosen the viscous damping. After including
damping
the formula for the force
applied to
each vertex changes to the
following:

Where c is a damping constant and v is the velocity
of a vertex.
The displacement of each
vertex is calculated
using Newton’s
Laws and basic
formulas for the motion of the body
[2]:

To
achieve the best performance, some assumptions
should be made about
the object. As each
vertex of an object
is assumed
to have
the same
mass, the
distances between
adjacent vertices should be approximately
equal to each other. So even
if it is not needed for
the appearance,
the mesh
of the object
should
be equally
distributed
over the object’s surface,
otherwise a more sophisticated
algorithm is needed
to compute
mass
of each vertex so
that mass of the body is
uniform.
-
Algorithms
and Other Issues
After deriving the formulas for the
vertex forces there
are two problems that need
to be solved: creating
a data structure for
the object
and applying linear
algebra for projection
of 3D space to 2D or 1D.
The data structure of the model
includes a set of vertices
with velocities
and accelerations for each
vertex. Each vertex
also
holds a list
of its direct neighbors
as well as the initial (rest)
distances to each of them.
So in order to update
the position of a vertex, we
calculate the force
applied
(using
the difference
between the current and initial
distances between the vertex
and each neighbor),
then update acceleration and
velocity, and finally
compute
the displacement
from previous position. There
is also set of faces (triangles)
and
edges stored
for
each object and are used later
for the collision detection
and rendering.
The principal advantage of
our model is that natural behavior
of the elastic
object can be achieved using
a number of easily computed
algebraic
physics
equations of degree at most
two.
The object mesh is easy to
create using standard
3D graphics
tool, for example 3D
Studio Max [13]. Note that our model
does not necessarily
preserve the volume of the
body. If this is desired,
additional constrains
must be added. Also the elasticity
constant depends on the complexity
of the object
and has to be calculated for
each different object. One
of the
disadvantages
of our model is that creating
objects with no elasticity
(rigid bodies)
results in strong oscillation
which damping cannot
handle.
For this
reason, non-elastic
objects are handled by a different method.
MECHANICS
BEHIND OBJECT INTERACTION
- Overview
Given the object model presented in the previous section,
the next building block to consider is how to combine them
into a
single world. One of the factors involved in this is updating
movements between objects, namely applying the appropriate
forces to each object and updating their coordinates over
some time
step. Following any type of non-predetermined movement, some
sort of collision detection algorithm is run between all
appropriate pairs of objects. If any contact is detected,
all of the information
regarding the collision must be extracted and the appropriate
collision response mechanism is applied.
Typically in complex rendering programs or games, the objects
in space would be contained in some type of data structure,
such as an octree or kd-tree as proposed by Samet [11]. Such
an implementation
can provide several performance gains, including rendering
of objects and limiting the pairs of objects to which the
collision test must be applied. In the rendering process
these data structures
can help to determine whether an object needs to be drawn
on the screen. For example the partitioning nature of these
structures
organizes spatial information such as objects in such a way
that
they can determine when other objects are very close to it
or when one is occluded behind another. These properties
help when
trying to decide what objects need to be drawn or need to
have complex operations applied to them such namely collision
detection.
Inaccuracies in the collision detection can arise when the
time step between screen updates is large enough that the
physical forces would place them on opposite sides of each
other. To
compensate
for this scenario the objects typically require being sufficiently
scaled in size or a smaller time step has to be used in the
collision detection process.
- Prior
Work
There are many methods that have been proposed for collision
detection. Generally all objects have some sort of
boundary or more commonly a radius in which they are contained
within,
and
whenever another object comes sufficiently near, a
series of calculations are performed to see if there was
an actual
collision.
When dealing with convex objects, this method works
well because the object can be simplified to a sphere or
ellipse
and your
chances of finding a collision are higher in an early
time step. With concave objects there is a chance that
the object
could
be very complex and a collision might not be found
until several time steps later. To get around this problem
this
idea has
been taken to another level with the use of hierarchal
collision detection
[12]. As the name suggests, there are layers of boundaries
or radii that have to be penetrated before a collision
is detected. In the case of concave objects this works
well
because, after
the primary radius has been penetrated, the collision
detection is done against the next set of radii and so
forth, as necessary.
This works well when the nature of the object is sparse
or has
convex substructures, because it increases the accuracy
of the collision detection while reducing the need for
computationally
expensive algorithms.
When it is determined that the collision boundary has
been penetrated, it is required to be known exactly
if there was
a collision and
where. There are various algorithms that can calculate
this but the overall method used by most of them is
to compare
all the
faces or edges of one object and see if any of them
lie within the boundaries of the other object. While
simple in concept,
most techniques require several floating-point calculations
to check against many edges and points of every polygon
in one object
to the other. Typically there is a check to see if
either point of any edge in one object penetrates any
polygon in
the other
object. This procedure is run twice, reversing the
roles of edges and polygons between the two objects.
If this does
not
reveal
an intersection, all the individual faces and edges
are checked to see if they are coplanar and/or coincident.
When naively
implemented, this technique will still work but can
be very expensive if the
object consists of a large number of edges. In this
instance some type of selection against the object
is done in order
to select a minimal set of edges and polygons to check
against. For example, if the relative centers of two
objects can be
determined
and the two points used as a vector and treated as
the normal of a plane, then it suffices to test only
points that lie
on one side of that plane. In the situation where the
objects are represented by polynomial equations, it
is common to
check
if
the surfaces defined by these equations intersect using
any of several techniques based on integral calculus.
After it has been determined that a collision has occurred,
we need to know where the collision has occurred and
make an appropriate
response to the point of intersection. In this stage,
the need for accuracy in the location of the collision
is the
driving
factor for what collision information should collected.
In one case we can attempt to calculate the actual
point of
collision and try to isolate all the elements involved,
such as the direction
of the collision and the force being applied at that
point. At
the time of collision, if it is determined that the
two objects have penetrated each other, somewhere between
the previous
time step and the current step there was a point in
time when the
collision first occurs. So in order to find the instance
of collision, the collision data is recalculated using
a time
step that is
a half of the current time step and the previous. This
process is repeated until there is collision without
penetration
or until some threshold is met. While this solution
provides accuracy
in the collision data, it is computationally expensive
to repeat several calculations, which can produce redundant
information
between iterations. What can happen instead is that
all the
information
about the collision can be collected and then approximate
what the real collision information data should be.
- Algorithms Used
In our implementation we maintain a collection of objects,
and then at arbitrary time intervals we update their
positions in
space, check for collisions and respond appropriately
to them and repeat this process as necessary [10].
For the collision
detection step, we used a variation of a ray to triangle
intersection
algorithm. For any two objects that we find to be
within each other’s collision boundary, we iterate over the edges of
one object and check for any intersection with any of the planes
of the triangles that make up the other object. If the edge has
been found to be crossing or touching the plane, the point of
intersection with the plane is then calculated. If that point
is contained within the triangle on that plane then we have detected
a collision. As we continue to iterate over the rest of the edges,
we mark all the edges and points of one object that were found
to have intersected the other object. Then with this set of edges,
we run a depth-first search against the graph of the object’s
polygonal mesh to collect all the points that are
contained within the other object. Once this set
is complete, we apply
our collision
response system with the appropriate physics, as
described in the previous section.
IMPLEMENTATION
DETAILS
In order
to illustrate the models and algorithms we created and used,
we developed an application that takes text file
of meshes and their initial velocities as input and animates
the behavior
of these objects. This application was developed using
C++ under the Microsoft Visual C++ .NET Compiler and the
Standard C, OpenGL,
STL libraries and the Win32 API. The program structure
is intended to be cross platform compatible so there are
areas where things
such as the timing mechanism is abstracted away into
its own object.
You can download the source code here and
text files with model meshes here.
The most general class in our program is World, which contains
list of objects displayed on the screen (EObject).
Each object has list of faces (Triangle), edges (Edge), and
points (GLPoint).
The principal functional elements of the program, including
collision detection, collision response, and each point location
update
can be found in the source file EObject.cpp. In the
main loop for our program, after all models have been loaded
into memory
and initialized, we iterate over our collection of
objects calling an update on their movements using the time
span between the
last iteration and the current as the time step. After
the updates, we check all appropriate objects for collisions
against each
other. If a collision is found, we apply the appropriate
collision response mechanism for that collision.
In Windows, the standard timing library did not allow
for precision in timing beyond seconds so we had to
use the WIN32 API to achieve
greater precision. Our program uses a single thread
for execution. Rather than using the timestamps from
the system clock which
would include time allocated to other programs by the
processor, we used the timestamp for the lifetime of
the thread.
CONCLUSIONS
AND SCREENSHOTS
In the project
we presented a 3D engine for the animation of non-rigid bodies.
We were able to achieve natural
behavior of
elastic bodies and their collisions. Here is set
of screen shots which were taken from the engine:
Animation of multiple objects falling on the
ground and interaction with each other.
A
box falling on the ground and flipping over.
POSSIBLE FUTURE WORK
There are several ways to extend
this project. The first is to improve current engine. This
might include adding
global constraints
such as preserving object volume; optimizing the collision
detection algorithm by creating more sophisticated bounding
boxes for each object, improving the algorithm for spring
damping. The other possible direction is to use a similar system
to
create other types of flexible objects, for example cloth
[9] or hair. As longer term work, it might be possible to extend
our approach to create a model for much more general classes
of substances. That would require adding more physically
realistic
elements into the model, creating uniform mesh over all
the volume of the object, and finding specific constraints to
satisfy properties of different types of the material
REFERENCES
- Tongue, Benson H., “Principles of Vibration,” 1996
- Hibbeler, R. C., “Engineering mechanics. Dynamics,” 8th
ed, 1997
- Bourge, David M. “Physics for Game Developers”,
November 2001
- Terzopoulos,
D., Witkin, A, “Physically based models
with rigid and deformable components,”
Computer Graphics
and Applications, IEEE, Volume: 8 Issue: 6, Nov 1988, Page(s):
41 -51
- Metaxas,
D., Terzopoulos, D., ”Dynamic 3D models with
local and global deformations: deformable superquadrics,”
Pattern
Analysis and Machine Intelligence, IEEE Transactions, Volume:
13 Issue: 7, Jul 1991, Page(s): 703 -714
- Barr,
A., Cani, M.-P., Debunne, G., Desbrun, M.,”Adaptive
simulation of soft bodies in real-time,”
Computer Animation
2000. Proceedings, 2000, Page(s): 15 -20
- Wang,
J.-F., Wang, Y.F., “Surface reconstruction using
deformable models with interior and boundary constraints,”
Computer
Vision, 1990. Proceedings, Third International Conference,
4-7 Dec 1990, Page(s): 300 -303
- Cani-Gascuel,
M., Desbrun, M., “Animation of deformable
models using implicit surfaces,”
Visualization and Computer
Graphics, IEEE Transactions, Volume: 3 Issue: 1, Jan-Mar 1997,
Page(s): 39 -50
- Eberhardt,
B., Strasser, W., Weber, A., “A fast, flexible,
particle-system model for cloth draping,”
Computer Graphics
and Applications, IEEE, Volume: 16 Issue: 5, Sep 1996, Page(s):
52 -59
- Miller,
Kurt “flipCode - Tutorial - Collision Detection” Jan
2000. Jul 14, 2002
- Samet, Hanan, “Design and Analysis of Spatial Data Structures,” Addison-Wesley,
Reading MA.
- Ramaekers,
Marc, “Hierarchical Collision Detection Methods” May
1999. Jul 12, 2002
- “Discreet products - 3ds max” http://www.discreet.com/products/3dsmax/

|