Main Page   Class Hierarchy   Compound List   File List   Compound Members  

SimSimulator Class Reference

An implementation of Baraff & Witkin's cloth simulation algorithm. More...

#include <freecloth/simulator/simSimulator.h>

Inheritance diagram for SimSimulator:

Inheritance graph
[legend]
Collaboration diagram for SimSimulator:

Collaboration graph
[legend]
List of all members.

Public Types

enum  ForceType {
  F_STRETCH, F_SHEAR, F_BEND, F_GRAVITY,
  F_DRAG, NB_FORCES
}
 The individual classes of forces.


Public Methods

 SimSimulator (const GeMesh &initialMesh)
const GeMeshgetMesh () const
const RCShdPtr< GeMesh > & getMeshPtr () const
void rewind ()
 Rewind simulation time to zero, and return the mesh to its initial state.

void step ()
 Advance the simulation by one timestep. step() is equivalent to calling - preSubSteps() - repeated subStep() calls - postSubSteps().

BaTime::Instant getTime () const
 Retrieve the current simulation time.

void removeAllConstraints ()
 Remove all constraints on all vertices.

void setPosConstraintPlane (GeMesh::VertexId, const GeVector &)
 Constrain movement of the vertex to the plane defined by the given normal.

void setPosConstraintLine (GeMesh::VertexId, const GeVector &)
 Constrain movement of the vertex to the given line.

void setPosConstraintFull (GeMesh::VertexId)
 Completely constrain the vertex, allowing no movement.

void setVelConstraint (GeMesh::VertexId, const GeVector &)
 Force the vertex to move with the specified velocity. This overrides any position constraints.

bool subStepsDone () const
 Finer grained simulation control - allows the client more control over the computation. See step() for details.

void preSubSteps ()
 Finer grained simulation control - allows the client more control over the computation. See step() for details.

void subStep ()
 Finer grained simulation control - allows the client more control over the computation. See step() for details.

void postSubSteps ()
 Finer grained simulation control - allows the client more control over the computation. See step() for details.

void setTimestep (Float)
 Mutator.

void setParams (const Params &)
 Mutator.

void setDensity (Float rho)
 Mutator.

void setPCGTolerance (Float)
 Mutator.

Float getTimestep () const
 Accessor.

const ParamsgetParams () const
 Accessor.

Float getDensity () const
 Accessor.

Float getPCGTolerance () const
 Accessor.

GeVector getVelocity (GeMesh::VertexId vid) const
 Only exposed for debugging purposes.

GeVector getForce (GeMesh::VertexId vid) const
 Only exposed for debugging purposes.

Float getEnergy (ForceType) const
 Only exposed for debugging purposes.

Float getTriEnergy (ForceType, GeMesh::FaceId) const
 Only exposed for debugging purposes.

GeVector getForce (ForceType type, GeMesh::VertexId vid) const
 Only exposed for debugging purposes.

GeVector getDampingForce (ForceType type, GeMesh::VertexId vid) const
 Only exposed for debugging purposes.

void setMesh (const GeMesh &)
 Only exposed for debugging purposes.


Private Types

typedef SimMatrix Matrix
typedef SimMatrix SymMatrix
typedef SimMatrix TridiagMatrix

Private Methods

void setupMass ()
 Fill the mass matrix (_M) using the initial mesh's triangles areas and the density parameter, as per [BarWit98] section 2.2.

void calcStretchShear (const GeMesh::FaceWrapper &face)
 Calculate values common to the stretch and shear conditions.

void calcStretch (const GeMesh::FaceWrapper &face, const CommonVars &cv, const GePoint x[3], const GePoint tp[3], const GeVector v0[3])
 Calculate the stretch condition and its derivatives.

void calcShear (const GeMesh::FaceWrapper &face, const CommonVars &cv, const GePoint x[3], const GePoint tp[3], const GeVector v0[3])
 Calculate the shear condition and its derivatives.

void calcBend (const GeMeshWingedEdge::HalfEdgeWrapper &edge)
 Calculate the bend condition and its derivatives.


Private Attributes

RCShdPtr< GeMesh_initialMesh
RCShdPtr< GeMeshWingedEdge_initialMeshWingedEdge
RCShdPtr< GeMesh_mesh
Params _params
Float _rho
 Density of cloth ( kg / m^2 ).

Float _h
 Timestep.

Float _time
 Current time.

TridiagMatrix _M
 Variables from the [BarWit98], as defined in equations (6) and (14).

Float _totalMass
 Sum of diagonals of _M.

SimVector _f0
SymMatrix _df_dx
SymMatrix _df_dv
SimVector _v0
SimVector _z0
ModPCGSolver _modPCG
SimVector _f0i [NB_FORCES]
 For debugging.

SimVector _d0i [NB_FORCES]
 For debugging.

SymMatrix _df_dxi [NB_FORCES]
 For debugging.

SymMatrix _dd_dvi [NB_FORCES]
 For debugging.

SymMatrix _dd_dxi [NB_FORCES]
 For debugging.

Float _fenergy [NB_FORCES]
 Total energy of cloth.

Float _venergy
 Total energy of cloth.

Float _energy
 Total energy of cloth.

std::vector< Float > _trienergy [NB_FORCES]
 Total energy of cloth.


Detailed Description

An implementation of Baraff & Witkin's cloth simulation algorithm.

Using the simulation is fairly straightforward. The client supplies an initial mesh, which must have disc topology. The client also specifies the density of the cloth, which indirectly defines the mass of each triangle of the mesh. The client can also specify constraints on the cloth motion, constraining both the position and the velocity of individual nodes of the mesh.

Time starts at zero, and is advanced by a fixed timestep by calls to step(). The client can retrieve the mesh after each timestep. The simulation can be rewound to the beginning by calling rewind().

There are many parameters for the simulation algorithm. See [BarWit98] or the description in SimSimulator::Params for details.

Test:

References:

Definition at line 106 of file simSimulator.h.


The documentation for this class was generated from the following files:
Generated on Fri May 2 16:51:31 2003 for Freecloth by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002