Rigid Bodies¶
STARK’s rigid body system handles articulated mechanisms.
The main entry point is simulation.rigidbodies.
To declare a rigid body without a preset (no mesh, no collision), you can use:
Eigen::Matrix3d I = stark::inertia_tensor_box(mass, size);
RigidBodyHandler rb = simulation.rigidbodies->add(mass, I);
Helper functions cover common shapes: inertia_tensor_box, inertia_tensor_sphere, inertia_tensor_cylinder, inertia_tensor_torus.
RigidBodyHandler¶
RigidBodyHandler is the primary handle for controlling a single rigid body.
Transforms (pre-simulation setup)¶
rb.set_translation({0.0, 0.0, 1.0});
rb.add_translation({0.0, 0.0, 0.5});
rb.set_rotation(45.0, {0.0, 0.0, 1.0}); // angle_deg, axis
rb.add_rotation(10.0, {0.0, 1.0, 0.0});
Velocities¶
rb.set_velocity({1.0, 0.0, 0.0});
rb.set_angular_velocity({0.0, 0.0, 3.14});
External forces and torques¶
Forces and torques accumulate across calls and are reset each time step.
rb.add_force_at_centroid({0.0, 0.0, -9.81 * mass});
rb.add_force_at(force_world, application_point_world); // also induces torque
rb.add_torque({0.0, 0.0, 1.0});
Coordinate transforms¶
Eigen::Vector3d x_world = rb.transform_local_to_global_point({0.0, 0.0, 0.5});
Eigen::Vector3d d_world = rb.transform_local_to_global_direction({1.0, 0.0, 0.0});
Eigen::Matrix3d R = rb.get_rotation_matrix();
Scripting Rigid Bodies¶
The most common pattern is to fix a body and drive it with a prescribed trajectory. A scripted box spinning over time looks like:
auto fix = simulation.rigidbodies->add_constraint_fix(rb);
simulation.add_time_event(0.0, duration, [&](double t) {
fix.set_transformation(
Eigen::Vector3d(0, 0, 0),
t * 90.0,
Eigen::Vector3d(0, 0, 1)
);
});
Output¶
Rigid body mesh output is handled by the presets automatically. For custom rigid bodies, register the mesh explicitly:
simulation.presets->rigidbodies->add(
"my_body", mass, I,
collision_vertices, collision_triangles,
render_vertices, render_triangles
);