Skip to main content

rigid_body_velocity

The velocity of a dynamic rigid-body controls how fast it is moving in time. The velocity is applied at the center-of-mass of the rigid-body, and is composed of two independent parts:

  1. The linear velocity is specified as a vector representing the direction and magnitude of the movement.
  2. In 3D, the angular velocity is given as a vector representing the rotation axis multiplied by the rotation angular speed in rad/s (axis-angle representation). In 2D, the angular velocity is given as a real representing the angular speed in rad/s.
info

The velocity is only relevant to dynamic rigid-bodies. It has no effect on fixed rigid-bodies, and the velocity of kinematic rigid-bodies are automatically computed at each timestep based on their next kinematic positions.

The velocity of a rigid-body is automatically updated by the physics pipeline after taking forces, contacts, and joints into account. It can be set when the rigid-body is created or after its creation:

/* Set the velocities when the rigid-body is created. */
let rigid_body = RigidBodyBuilder::dynamic()
// The linear velocity of this body.
// Default: zero velocity.
.linvel(vector![1.0, 3.0])
// The angular velocity of this body.
// Default: zero velocity.
.angvel(3.0)
// All done, actually build the rigid-body.
.build();
/* Set the velocities after the rigid-body creation. */
let rigid_body = rigid_body_set.get_mut(rigid_body_handle).unwrap();
// The `true` argument makes sure the rigid-body is awake.
rigid_body.set_linvel(vector![1.0, 3.0], true);
rigid_body.set_angvel(3.0, true);
assert_eq!(*rigid_body.linvel(), vector![1.0, 3.0]);
assert_eq!(rigid_body.angvel(), 3.0);
/* Set the velocities when the rigid-body is created. */
commands.spawn(RigidBody::Dynamic).insert(Velocity {
linvel: Vec2::new(0.0, 2.0),
angvel: 0.4,
});
/* Set the velocities inside of a system. */
fn modify_body_velocity(mut velocities: Query<&mut Velocity>) {
for mut vel in velocities.iter_mut() {
vel.linvel = Vec2::new(0.0, 2.0);
vel.angvel = 0.4;
}
}
/* Set the velocities when the rigid-body is created. */
let rigidBodyDesc = RAPIER.RigidBodyDesc.dynamic()
// The linear velocity of this body.
// Default: zero velocity.
.setLinvel(1.0, 3.0)
// The angular velocity of this body.
// Default: zero velocity.
.setAngvel(3.0);
let rigidBody = world.createRigidBody(rigidBodyDesc);
/* Set the velocities after the rigid-body creation. */
// The `true` argument makes sure the rigid-body is awake.
rigidBody.setLinvel({ x: 1.0, y: 3.0 }, true);
rigidBody.setAngvel(3.0, true);

Alternatively, the velocity of a dynamic rigid-body can be altered indirectly by applying a force or an impulse.