Simulation structures
This page describes all the data structures needed for stepping the simulation as illustrated by the basic simulation example.
#
GravityGravity is represented as a vector. It affects every dynamic rigid-body taking part of the simulation. The gravity
can be altered at each timestep (by passing a different vector to PhysicsPipeline::step
).
Learn more about per-rigid-body gravity modification in the dedicated section.
#
Integration parametersThe IntegrationParameters
controls various aspects of the physics simulation, including the timestep length,
number of solver iterations, number of CCD substeps, etc. The default integration parameters are set to
achieve a good balance between performance and accuracy for games. They can be changed to make the simulation more
accurate at the expanse of a bit of performance. Learn more about each integration parameter in
the API docs.
#
Island managerThe IslandManager
is responsible for tracking the set of dynamic rigid-bodies that are still moving
and these that are no longer moving (and can ignored by subsequent timesteps to avoid useless computations).
The island manager is automatically updated by PhysicsPipeline::step
and can be queried to retrieve
the list of all the rigid-bodies modified by the physics engine during the last timestep. This can be useful
to update the rendering of only the rigid-bodies that moved:
Learn more about sleeping rigid-bodies in the dedicated section.
#
Physics pipelineThe PhysicsPipeline
is responsible for tying everything together in order to run the physics simulation.
It will take care of updating every data-structures mentioned in this page (except the other pipelines), running the collision-detection,
running the force computation and integration, and running CCD resolution.
Usage of PhysicsPipeline::step
is illustrated in the basic simulation example.
It has two useful methods:
PhysicsPipeline::step
executes one timestep. This is the method you should use most of the time, unless you are trying to use your own containers instead of the predefinedRigidBodySet
andColliderSet
.PhysicsPipeline::step_generic
also executes one timestep, but is generic wrt. the rigid-body and collider containers. It is strongly discouraged to use this method unless you understand what is expected from your custom containers (more documentation on this topic will be added in the future). Our bevy_rapier plugin for the Bevy game engine is one example that usesPhysicsPipeline::step_generic
to use Bevy's queries as rigid-bodies and collider containers.
#
Collision pipelineThe CollisionPipeline
is similar to the PhysicsPipeline
except that it will only run collision-detection.
It won't perform any dynamics (force computation, integration, CCD, etc.) It is generally used instead of
the PhysicsPipeline
when one only needs collision-detection.
info
Running both the CollisionPipeline
and the PhysicsPipeline
is useless because the PhysicsPipeline
already
does collision-detection.
#
Query pipelineThe QueryPipeline
is responsible for efficiently running scene queries, e.g., ray-casting,
shape-casting (sweep tests), intersection tests, on all the colliders of the scene.
Before it is used, the QueryPipeline
needs to be updated in order to take the new colliders' positions into account.
The QueryPipeline
can be used alone, but it is very common to use the QueryPipeline
alongside the CollisionPipeline
or PhysicsPipeline
:
Learn more about scene queries with the QueryPipeline
in the dedicated page.
#
Rigid-body setThe RigidBodySet
contains all the rigid-bodies that needs to be simulated. This set is represented as a
generational-arena, i.e., a vector where each element is indexed using a handle that combines
an u32
index and an u32
generation number. This ensures that every rigid-body is given a unique handle.
Learn more about rigid-bodies in the dedicated page.
#
Collider setThe ColliderSet
contains all the colliders that needs to be simulated. This set is represented as a
generational-arena, i.e., a vector where each element is indexed using a handle that combines
an u32
index and an u32
generation number. This ensures that every collider is
given a unique handle.
Learn more about colliders in the dedicated page.
#
Joint setThe ImpulseJointSet
contains all the impulse-based joints that needs to be simulated. This set is represented as a
generational-arena, i.e., a vector where each element is indexed using a handle that combines
an u32
index and an u32
generation number. This ensures that every joint is
given a unique handle.
Learn more about joints in the dedicated page.
#
CCD solverThe CCD solver is responsible for the resolution of Continuous-Collision-Detection. By itself, this structure
doesn't expose any feature useful. So it should simply be passed to the PhysicsPipeline::step
method.
Learn more about CCD in the dedicated section.
#
Physics hooksThe physics hooks are trait-objects implementing the PhysicsHooks
trait. They can be used to apply arbitrary
rules to ignore collision detection between some pairs of colliders. They can also be used to modify the contacts
processed by the constraints solver for computing forces.
Learn more about physics hooks in the dedicated section.
#
Event handlerThe event handlers are trait-objects implementing the EventHandler
trait. They can be used to get notified
when two non-sensor colliders start/stop having contacts, and when one sensor collider and one other collider
start/stop intersecting. Learn more about collision events in
the dedicated section.