JSim 2026.06.01-p(1)
Loading...
Searching...
No Matches
frcsim::RigidBody Class Reference

Simulated rigid body with translational/angular dynamics and optional aero metadata. More...

#include <rigid_body.hpp>

Classes

struct  AerodynamicGeometry
 Geometric metadata used to estimate drag reference area. More...

Public Types

enum class  CylinderAxis { kX , kY , kZ }
 Principal axis selection for cylindrical aerodynamic geometry. More...

Public Member Functions

 RigidBody (double mass_kg=1.0)
 Constructs a rigid body with a sanitized positive mass.
double massKg () const
 Returns mass in kilograms.
double inverseMass () const
 Returns inverse mass in 1/kg.
void setMassKg (double mass_kg)
 Sets mass in kilograms.
const Vector3position () const
 Returns world position in meters.
void setPosition (const Vector3 &position_m)
 Sets world-space position in meters.
void setPosition (double x_m, double y_m, double z_m)
 Sets world-space position in meters from scalar components.
void position (double *x_m, double *y_m, double *z_m) const
 Gets world-space position in meters via scalar output pointers.
const Quaternionorientation () const
 Returns body orientation as a unit quaternion.
void setOrientation (const Quaternion &orientation)
 Sets body orientation quaternion.
const Vector3linearVelocity () const
 Returns world linear velocity in meters per second.
void setLinearVelocity (const Vector3 &velocity_mps)
 Sets world linear velocity in meters per second.
void setLinearVelocity (double vx_mps, double vy_mps, double vz_mps)
 Sets world linear velocity in meters per second from scalars.
void linearVelocity (double *vx_mps, double *vy_mps, double *vz_mps) const
 Gets world linear velocity in meters per second via pointers.
const Vector3angularVelocity () const
 Returns world angular velocity in radians per second.
void setAngularVelocity (const Vector3 &angular_velocity_radps)
 Sets world angular velocity in radians per second.
void setAngularVelocity (double wx_radps, double wy_radps, double wz_radps)
 Sets world angular velocity in radians per second from scalars.
void angularVelocity (double *wx_radps, double *wy_radps, double *wz_radps) const
 Gets world angular velocity in radians per second via pointers.
const Matrix3bodyInertiaTensor () const
 Returns inertia tensor in body frame.
void setBodyInertiaTensor (const Matrix3 &inertia)
 Sets body-frame inertia tensor and cached inverse tensor.
BodyFlagsflags ()
 Mutable access to runtime body flags.
const BodyFlagsflags () const
 Const access to runtime body flags.
void setMaterial (const Material &material)
 Sets optional physical material properties.
const Materialmaterial () const
 Gets material if configured, otherwise returns null.
void setMaterialId (std::int32_t material_id)
 Sets numeric material identifier used by world interaction tables.
std::int32_t materialId () const
 Gets numeric material identifier used by world interaction tables.
void setCollisionLayer (std::uint32_t layer_bits)
 Sets broad-phase collision layer bits for this body.
std::uint32_t collisionLayer () const
 Gets broad-phase collision layer bits.
void setCollisionMask (std::uint32_t mask_bits)
 Sets broad-phase collision mask bits for this body.
std::uint32_t collisionMask () const
 Gets broad-phase collision mask bits.
void setAerodynamicGeometry (const AerodynamicGeometry &geometry)
 Sets optional aerodynamic geometry metadata.
const AerodynamicGeometryaerodynamicGeometry () const
 Gets aerodynamic geometry if configured, otherwise returns null.
void setCylinderAxisLocal (CylinderAxis axis)
 Sets cylinder axis in local coordinates via canonical enum axis.
void setCylinderAxisWorld (const Vector3 &axis_world)
 Sets cylinder axis from world-space direction.
void setCylinderAxisWorld (double x, double y, double z)
 Sets cylinder axis from world-space scalar direction components.
double dragReferenceAreaM2 (const Vector3 &velocity_world) const
 Computes effective drag reference area for current geometry and motion direction.
void applyForce (const Vector3 &force_n)
 Adds force at center of mass in newtons.
void applyForce (double fx_n, double fy_n, double fz_n)
 Adds force at center of mass in newtons from scalar components.
void applyForceAtPoint (const Vector3 &force_n, const Vector3 &world_point_m)
 Adds force at world-space point, accumulating both force and torque.
void applyForceAtPoint (double fx_n, double fy_n, double fz_n, double px_m, double py_m, double pz_m)
 Adds force at world-space point from scalar components.
void clearAccumulators ()
 Clears accumulated force and torque buffers.
void integrate (double dt_s, IntegrationMethod method, const Vector3 &gravity_mps2, double linear_damping_per_s, double angular_damping_per_s)
 Advances translational and rotational state by one fixed timestep.

Detailed Description

Simulated rigid body with translational/angular dynamics and optional aero metadata.

This type stores canonical rigid-body state (pose, linear velocity, angular velocity, mass, inertia) and supports force/torque accumulation followed by fixed-step integration.

Key behavior:

  • Forces accumulate until integrate is called.
  • Gravity application is controlled by per-body flags and world config.
  • Optional material metadata informs contact response in PhysicsWorld.
  • Optional aerodynamic geometry supports runtime drag-area estimation.

Member Enumeration Documentation

◆ CylinderAxis

Principal axis selection for cylindrical aerodynamic geometry.

Enumerator
kX 

Local +X axis.

kY 

Local +Y axis.

kZ 

Local +Z axis.

Constructor & Destructor Documentation

◆ RigidBody()

frcsim::RigidBody::RigidBody ( double mass_kg = 1.0)
inlineexplicit

Constructs a rigid body with a sanitized positive mass.

Parameters
mass_kgBody mass in kilograms.

Member Function Documentation

◆ aerodynamicGeometry()

const AerodynamicGeometry * frcsim::RigidBody::aerodynamicGeometry ( ) const
inline

Gets aerodynamic geometry if configured, otherwise returns null.

◆ angularVelocity() [1/2]

const Vector3 & frcsim::RigidBody::angularVelocity ( ) const
inline

Returns world angular velocity in radians per second.

◆ angularVelocity() [2/2]

void frcsim::RigidBody::angularVelocity ( double * wx_radps,
double * wy_radps,
double * wz_radps ) const
inline

Gets world angular velocity in radians per second via pointers.

Parameters
wx_radpsOptional output pointer for world-space angular velocity x.
wy_radpsOptional output pointer for world-space angular velocity y.
wz_radpsOptional output pointer for world-space angular velocity z.

◆ applyForce() [1/2]

void frcsim::RigidBody::applyForce ( const Vector3 & force_n)
inline

Adds force at center of mass in newtons.

◆ applyForce() [2/2]

void frcsim::RigidBody::applyForce ( double fx_n,
double fy_n,
double fz_n )
inline

Adds force at center of mass in newtons from scalar components.

Parameters
fx_nWorld-space x force in newtons.
fy_nWorld-space y force in newtons.
fz_nWorld-space z force in newtons.

◆ applyForceAtPoint() [1/2]

void frcsim::RigidBody::applyForceAtPoint ( const Vector3 & force_n,
const Vector3 & world_point_m )
inline

Adds force at world-space point, accumulating both force and torque.

Parameters
force_nApplied force in newtons.
world_point_mApplication point in world meters.

◆ applyForceAtPoint() [2/2]

void frcsim::RigidBody::applyForceAtPoint ( double fx_n,
double fy_n,
double fz_n,
double px_m,
double py_m,
double pz_m )
inline

Adds force at world-space point from scalar components.

Parameters
fx_nWorld-space x force in newtons.
fy_nWorld-space y force in newtons.
fz_nWorld-space z force in newtons.
px_mWorld-space x application point in meters.
py_mWorld-space y application point in meters.
pz_mWorld-space z application point in meters.

◆ bodyInertiaTensor()

const Matrix3 & frcsim::RigidBody::bodyInertiaTensor ( ) const
inline

Returns inertia tensor in body frame.

◆ clearAccumulators()

void frcsim::RigidBody::clearAccumulators ( )
inline

Clears accumulated force and torque buffers.

◆ collisionLayer()

std::uint32_t frcsim::RigidBody::collisionLayer ( ) const
inline

Gets broad-phase collision layer bits.

Returns
Layer membership bitset.

◆ collisionMask()

std::uint32_t frcsim::RigidBody::collisionMask ( ) const
inline

Gets broad-phase collision mask bits.

Returns
Interaction acceptance bitset.

◆ dragReferenceAreaM2()

double frcsim::RigidBody::dragReferenceAreaM2 ( const Vector3 & velocity_world) const
inline

Computes effective drag reference area for current geometry and motion direction.

Parameters
velocity_worldWorld-space velocity vector used to infer projected area.
Returns
Effective reference area in square meters.

Behavior by geometry mode:

  • No geometry configured: returns 0.
  • Explicit reference area > 0: returns explicit value.
  • Sphere: returns pi * r^2.
  • Box: estimates projected area from local velocity direction and face areas.
  • Cylinder: blends end-cap and side projected areas using axis alignment.

For zero velocity vectors, a stable fallback direction is used to avoid NaN behavior during normalization.

◆ flags() [1/2]

BodyFlags & frcsim::RigidBody::flags ( )
inline

Mutable access to runtime body flags.

◆ flags() [2/2]

const BodyFlags & frcsim::RigidBody::flags ( ) const
inline

Const access to runtime body flags.

◆ integrate()

void frcsim::RigidBody::integrate ( double dt_s,
IntegrationMethod method,
const Vector3 & gravity_mps2,
double linear_damping_per_s,
double angular_damping_per_s )
inline

Advances translational and rotational state by one fixed timestep.

Parameters
dt_sTimestep duration in seconds.
methodTranslation integration strategy.
gravity_mps2World-space gravity acceleration in m/s^2.
linear_damping_per_sLinear damping coefficient in 1/s.
angular_damping_per_sAngular damping coefficient in 1/s.

Integration sequence:

  1. Early-out for kinematic bodies (accumulators are still cleared).
  2. Sum accumulated forces and optional gravity contribution.
  3. Integrate linear state using selected method.
  4. Apply linear damping attenuation.
  5. Integrate angular velocity and orientation.
  6. Apply angular damping attenuation.
  7. Clear accumulated force/torque buffers.

◆ inverseMass()

double frcsim::RigidBody::inverseMass ( ) const
inline

Returns inverse mass in 1/kg.

◆ linearVelocity() [1/2]

const Vector3 & frcsim::RigidBody::linearVelocity ( ) const
inline

Returns world linear velocity in meters per second.

◆ linearVelocity() [2/2]

void frcsim::RigidBody::linearVelocity ( double * vx_mps,
double * vy_mps,
double * vz_mps ) const
inline

Gets world linear velocity in meters per second via pointers.

Parameters
vx_mpsOptional output pointer for world-space x velocity in m/s.
vy_mpsOptional output pointer for world-space y velocity in m/s.
vz_mpsOptional output pointer for world-space z velocity in m/s.

◆ massKg()

double frcsim::RigidBody::massKg ( ) const
inline

Returns mass in kilograms.

◆ material()

const Material * frcsim::RigidBody::material ( ) const
inline

Gets material if configured, otherwise returns null.

◆ materialId()

std::int32_t frcsim::RigidBody::materialId ( ) const
inline

Gets numeric material identifier used by world interaction tables.

Returns
Material id currently assigned to this body.

◆ orientation()

const Quaternion & frcsim::RigidBody::orientation ( ) const
inline

Returns body orientation as a unit quaternion.

◆ position() [1/2]

const Vector3 & frcsim::RigidBody::position ( ) const
inline

Returns world position in meters.

◆ position() [2/2]

void frcsim::RigidBody::position ( double * x_m,
double * y_m,
double * z_m ) const
inline

Gets world-space position in meters via scalar output pointers.

Parameters
x_mOptional output pointer for world-space x position in meters.
y_mOptional output pointer for world-space y position in meters.
z_mOptional output pointer for world-space z position in meters.

◆ setAerodynamicGeometry()

void frcsim::RigidBody::setAerodynamicGeometry ( const AerodynamicGeometry & geometry)
inline

Sets optional aerodynamic geometry metadata.

◆ setAngularVelocity() [1/2]

void frcsim::RigidBody::setAngularVelocity ( const Vector3 & angular_velocity_radps)
inline

Sets world angular velocity in radians per second.

Parameters
angular_velocity_radpsWorld-space angular velocity in radians per second.

◆ setAngularVelocity() [2/2]

void frcsim::RigidBody::setAngularVelocity ( double wx_radps,
double wy_radps,
double wz_radps )
inline

Sets world angular velocity in radians per second from scalars.

Parameters
wx_radpsWorld-space angular velocity x in radians per second.
wy_radpsWorld-space angular velocity y in radians per second.
wz_radpsWorld-space angular velocity z in radians per second.

◆ setBodyInertiaTensor()

void frcsim::RigidBody::setBodyInertiaTensor ( const Matrix3 & inertia)
inline

Sets body-frame inertia tensor and cached inverse tensor.

◆ setCollisionLayer()

void frcsim::RigidBody::setCollisionLayer ( std::uint32_t layer_bits)
inline

Sets broad-phase collision layer bits for this body.

Parameters
layer_bitsLayer membership bitset.

◆ setCollisionMask()

void frcsim::RigidBody::setCollisionMask ( std::uint32_t mask_bits)
inline

Sets broad-phase collision mask bits for this body.

Parameters
mask_bitsInteraction acceptance bitset.

◆ setCylinderAxisLocal()

void frcsim::RigidBody::setCylinderAxisLocal ( CylinderAxis axis)
inline

Sets cylinder axis in local coordinates via canonical enum axis.

◆ setCylinderAxisWorld() [1/2]

void frcsim::RigidBody::setCylinderAxisWorld ( const Vector3 & axis_world)
inline

Sets cylinder axis from world-space direction.

Parameters
axis_worldWorld-space direction to convert into local body space.

The provided axis is transformed into local body space and normalized. Zero-length input falls back to local +Z.

◆ setCylinderAxisWorld() [2/2]

void frcsim::RigidBody::setCylinderAxisWorld ( double x,
double y,
double z )
inline

Sets cylinder axis from world-space scalar direction components.

Parameters
xWorld-space x direction component.
yWorld-space y direction component.
zWorld-space z direction component.

◆ setLinearVelocity() [1/2]

void frcsim::RigidBody::setLinearVelocity ( const Vector3 & velocity_mps)
inline

Sets world linear velocity in meters per second.

Parameters
velocity_mpsWorld-space linear velocity in meters per second.

◆ setLinearVelocity() [2/2]

void frcsim::RigidBody::setLinearVelocity ( double vx_mps,
double vy_mps,
double vz_mps )
inline

Sets world linear velocity in meters per second from scalars.

Parameters
vx_mpsWorld-space x velocity in meters per second.
vy_mpsWorld-space y velocity in meters per second.
vz_mpsWorld-space z velocity in meters per second.

◆ setMassKg()

void frcsim::RigidBody::setMassKg ( double mass_kg)
inline

Sets mass in kilograms.

Note
Non-positive inputs are clamped to 1.0 kg.

◆ setMaterial()

void frcsim::RigidBody::setMaterial ( const Material & material)
inline

Sets optional physical material properties.

◆ setMaterialId()

void frcsim::RigidBody::setMaterialId ( std::int32_t material_id)
inline

Sets numeric material identifier used by world interaction tables.

Parameters
material_idApplication-defined material id.

◆ setOrientation()

void frcsim::RigidBody::setOrientation ( const Quaternion & orientation)
inline

Sets body orientation quaternion.

Parameters
orientationNew world-space body orientation quaternion.

◆ setPosition() [1/2]

void frcsim::RigidBody::setPosition ( const Vector3 & position_m)
inline

Sets world-space position in meters.

Parameters
position_mWorld-space position in meters.

◆ setPosition() [2/2]

void frcsim::RigidBody::setPosition ( double x_m,
double y_m,
double z_m )
inline

Sets world-space position in meters from scalar components.

Parameters
x_mWorld-space x position in meters.
y_mWorld-space y position in meters.
z_mWorld-space z position in meters.

The documentation for this class was generated from the following file: