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. */
R2RigidBodyDesc rigid_body = r2DynamicRigidBodyDesc();
// The linear velocity of this body.
// Default: zero velocity.
rigid_body.linvel = r2Vector(1.0, 3.0);
// The angular velocity of this body.
// Default: zero velocity.
rigid_body.angvel = 3.0;
/* Set the velocities after the rigid-body creation. */
// The last `1` argument makes sure the rigid-body is awake.
r2RigidBody_SetLinvel(rigid_body_handle, r2Vector(1.0, 3.0), 1);
r2RigidBody_SetAngvel(rigid_body_handle, 3.0, 1);
R2Vector linvel = r2RigidBody_Linvel(rigid_body_handle);
assert(linvel.x == 1.0 && linvel.y == 3.0);
assert(r2RigidBody_Angvel(rigid_body_handle) == 3.0);

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