Collision Pipelines
Collision between objects is split in several phases, each implemented in a different component. Each phase is scheduled by a collision pipeline. The collision pipelines are executed in an animation loop.
The Steps
The collision pipeline follows three steps:
- reset of the collision
- a collision detection
- a collision response
Implementation
A collision pipeline is called from an animation loop through a CollisionVisitor executing the 3 steps of the pipeline in CollisionVisitor::processCollisionPipeline
.
The visitor executes the following functions, each corresponding to a step of the pipeline:
/// Detect new collisions. Note that this step must not modify the simulation graph
void Pipeline::computeCollisionDetection()
Each of these functions will call a delegate, available in the Pipeline:
/// Detect new collisions. Note that this step must not modify the simulation graph
void doCollisionDetection(const sofa::helper::vector<core::CollisionModel*>& collisionModels) override;
The 3 delegate functions describe the 3 different steps, and are usually overriden in derived classes. See an example in DefaultPipeline.
Notes: In some cases, the 3 steps are called manually by the animation loop through 3 dedicated visitors (CollisionResetVisitor, CollisionDetectionVisitor and CollisionResponseVisitor). Each of these visitors executes only one step (instead of the 3). This is to avoid race conditions in a multithreaded environment.
Examples of Components
The following components are all collision pipelines, and can be placed in a simulation scene:
The default collision detection and modeling pipeline.
Target: Sofa.Component.Collision.Detection.Algorithm
namespace: sofa::component::collision::detection::algorithm
parents:
- Pipeline
Data
Name | Description | Default value |
---|---|---|
name | object name | unnamed |
printLog | if true, emits extra messages at runtime. | 0 |
tags | list of the subsets the object belongs to | |
bbox | this object bounding box | |
componentState | The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). | Undefined |
listening | if true, handle the events, otherwise ignore the events | 0 |
verbose | Display extra information at each computation step. (default=false) | 0 |
depth | Max depth of bounding trees. (default=6, min=?, max=?) | 6 |
Visualization | ||
draw | Draw the detected collisions. (default=false) | 0 |
Links
Name | Description | Destination type name |
---|---|---|
context | Graph Node containing this object (or BaseContext::getDefault() if no graph is used) | BaseContext |
slaves | Sub-objects used internally by this object | BaseObject |
master | nullptr for regular objects, or master object for which this object is one sub-objects | BaseObject |