|
World of Rigid Bodies (WoRB)
|
Encapsulates a system of rigid bodies. More...
#include <WoRB.h>

Data Structures | |
| class | RigidBodies |
| Represents a rigid body iterator for the WorldOfRigidBodies class. More... | |
Public Member Functions | |
| WorldOfRigidBodies () | |
| Constructs an instance of WoRB class. | |
| void | RemoveObjects () |
| Removes all objects from the system. | |
| void | Add (Geometry *object) |
| Adds new object to the system. | |
| void | Add (Geometry &object) |
| Adds new object to the system. | |
| void | InitializeODE () |
| Prepares ODE (recalculates derived quantities) | |
| void | SolveODE (double h) |
| Solves (integrates) equations of motion for the whole system. | |
Data Fields | |
| Quaternion | Gravity |
| Holds common gravity applied to all objects (set to 0 to disable). | |
| double | Time |
Holds the system local time, in s. | |
| unsigned long | TimeStepCount |
| Holds the number of integrator time-steps, from the simulation start. | |
| double | TotalKineticEnergy |
Holds the total kinetic energy of the system, in J. | |
| double | TotalPotentialEnergy |
Holds the total potential energy of the system, in J. | |
| Quaternion | TotalLinearMomentum |
Holds the total linear momentum of the system, in kg m^2 s^-1. | |
| Quaternion | TotalAngularMomentum |
Holds the total angular momentum of the system, in kg m^2 s^-1. | |
| CollisionResolver | Collisions |
| Holds the collision data for all registered collisions. | |
| Collision | CollisionRegistry [MaxCollisions] |
| Holds the memory parcel where collisions are registered. | |
Private Attributes | |
| unsigned | ObjectCount |
| Holds the number of the objects in the system. | |
| Geometry * | Object [MaxObjects] |
| Points to an array of the objects handled by the system. | |
Friends | |
| class | RigidBodies |
Encapsulates a system of rigid bodies.
| WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::WorldOfRigidBodies | ( | ) | [inline] |
Constructs an instance of WoRB class.
Definition at line 160 of file WoRB.h.
: Collisions( CollisionRegistry, MaxCollisions ) { }
| void WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Add | ( | Geometry * | object | ) | [inline] |
Adds new object to the system.
Definition at line 176 of file WoRB.h.
Referenced by WoRB_MexFunction::Parse().
{
Object[ ObjectCount++ ] = object;
}
| void WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Add | ( | Geometry & | object | ) | [inline] |
Adds new object to the system.
Definition at line 183 of file WoRB.h.
{
Object[ ObjectCount++ ] = &object;
}
| void WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::InitializeODE | ( | ) | [inline] |
Prepares ODE (recalculates derived quantities)
Definition at line 192 of file WoRB.h.
Referenced by WoRB_MexFunction::Parse().
{
Time = 0;
TimeStepCount = 0;
Collisions.Initialize ();
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
body->CalculateDerivedQuantities ();
body->ClearAccumulators ();
}
TotalKineticEnergy = 0;
TotalPotentialEnergy = 0;
TotalLinearMomentum = 0;
TotalAngularMomentum = 0;
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
TotalKineticEnergy += body->KineticEnergy;
TotalPotentialEnergy += body->PotentialEnergy;
TotalLinearMomentum += body->LinearMomentum;
TotalAngularMomentum += body->TotalAngularMomentum;
}
}
| void WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RemoveObjects | ( | ) | [inline] |
| void WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::SolveODE | ( | double | h | ) | [inline] |
Solves (integrates) equations of motion for the whole system.
Solves ODE for all the objects in the system, performs the contact generation and then resolves detected contacts.
| h | Integrator time-step length |
Definition at line 224 of file WoRB.h.
{
/////////////////////////////////////////////////////////////////////////////
// Calculate and accumulate all external and internal forces
//
// Add gravity
//
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
Quaternion f_g = body->Mass() * Gravity;
double E_p = - f_g.Dot( body->Position );
body->AddExternalForce( f_g, E_p );
}
/////////////////////////////////////////////////////////////////////////////
// Solve ODE for every object in the system
//
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
body->SolveODE( h );
}
// Solve system local time (avoiding `Time += h` cause of rounding-errors).
//
Time = h * (++TimeStepCount);
/////////////////////////////////////////////////////////////////////////////
// Calculate derived quantities
TotalKineticEnergy = 0;
TotalPotentialEnergy = 0;
TotalLinearMomentum = 0;
TotalAngularMomentum = 0;
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
TotalKineticEnergy += body->KineticEnergy;
TotalPotentialEnergy += body->PotentialEnergy;
TotalLinearMomentum += body->LinearMomentum;
TotalAngularMomentum += body->TotalAngularMomentum;
}
/////////////////////////////////////////////////////////////////////////////
// Collision Detection
Collisions.Initialize ();
// Detect and register collisions between all objects in the system
//
for ( unsigned i = 0; i < ObjectCount; ++i )
{
for ( unsigned j = i + 1; j < ObjectCount; ++j )
{
Object[i]->Detect( Collisions, Object[j] );
}
}
Collisions.UpdateDerivedQuantities( h );
/////////////////////////////////////////////////////////////////////////////
// Collision Response
Collisions.ImpulseTransfers( h );
Collisions.PositionProjections ();
/////////////////////////////////////////////////////////////////////////////
// Prepare force and torque accumulators for the next time-step
//
for ( RigidBodies body = RigidBodies(this); body.Exists(); ++body )
{
body->ClearAccumulators ();
}
}
friend class RigidBodies [friend] |
Definition at line 102 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| Collision WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::CollisionRegistry[MaxCollisions] |
| CollisionResolver WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Collisions |
Holds the collision data for all registered collisions.
Definition at line 150 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), WoRB_MexFunction::Parse(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| Quaternion WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Gravity |
Holds common gravity applied to all objects (set to 0 to disable).
Definition at line 118 of file WoRB.h.
Referenced by WoRB_MexFunction::Parse(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
Geometry* WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Object[MaxObjects] [private] |
Points to an array of the objects handled by the system.
Definition at line 110 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::Add(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Exists(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Next(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::operator->(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::RigidBodies(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
unsigned WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::ObjectCount [private] |
Holds the number of the objects in the system.
Definition at line 106 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::Add(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Clear(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Count(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Exists(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::Next(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::operator->(), WoRB::WorldOfRigidBodies< 256, 1024 >::RemoveObjects(), WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::RigidBodies::RigidBodies(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| double WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::Time |
Holds the system local time, in s.
Definition at line 124 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| unsigned long WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::TimeStepCount |
Holds the number of integrator time-steps, from the simulation start.
Definition at line 128 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| Quaternion WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::TotalAngularMomentum |
Holds the total angular momentum of the system, in kg m^2 s^-1.
Definition at line 144 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| double WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::TotalKineticEnergy |
Holds the total kinetic energy of the system, in J.
Definition at line 132 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| Quaternion WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::TotalLinearMomentum |
Holds the total linear momentum of the system, in kg m^2 s^-1.
Definition at line 140 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().
| double WoRB::WorldOfRigidBodies< MaxObjects, MaxCollisions >::TotalPotentialEnergy |
Holds the total potential energy of the system, in J.
Definition at line 136 of file WoRB.h.
Referenced by WoRB::WorldOfRigidBodies< 256, 1024 >::InitializeODE(), WoRB_MexFunction::OnProcessData(), and WoRB::WorldOfRigidBodies< 256, 1024 >::SolveODE().