Banjo API 0.0.1
C99 game development API
Loading...
Searching...
No Matches
2D Physics
Collaboration diagram for 2D Physics:

Data Structures

struct  bj_particle_2d
struct  bj_angular_2d
struct  bj_rigid_body_2d

Functions

struct bj_vec2 bj_compute_kinematics_2d (struct bj_vec2 position, struct bj_vec2 velocity, struct bj_vec2 acceleration, bj_real time)
struct bj_vec2 bj_compute_kinematics_velocity_2d (struct bj_vec2 velocity, struct bj_vec2 acceleration, bj_real time)
void bj_apply_particle_force_2d (struct bj_particle_2d *particle, const struct bj_vec2 force)
void bj_step_particle_2d (struct bj_particle_2d *particle, bj_real dt)
void bj_apply_gravity_2d (struct bj_particle_2d *particle, bj_real gravity)
void bj_apply_point_gravity_2d (struct bj_particle_2d *restrict particle_from, const struct bj_particle_2d *restrict particle_to, const bj_real gravity_factor)
void bj_apply_point_gravity_softened_2d (struct bj_particle_2d *restrict particle_from, const struct bj_particle_2d *restrict particle_to, const bj_real gravity_factor, const bj_real epsilon)
void bj_apply_drag_2d (struct bj_particle_2d *particle, bj_real k1, bj_real k2)
bj_real bj_compute_particle_drag_coefficient_2d (const struct bj_vec2 vel, const bj_real k1, const bj_real k2)
struct bj_vec2 bj_compute_particle_drag_force_2d (struct bj_vec2 vel, const bj_real k1, const bj_real k2)
void bj_apply_angular_torque_2d (struct bj_angular_2d *angular, bj_real torque)
void bj_step_angular_2d (struct bj_angular_2d *angular, double delta_time)
void bj_apply_rigidbody_force_2d (struct bj_rigid_body_2d *body, const struct bj_vec2 force)
void bj_step_rigid_body_2d (struct bj_rigid_body_2d *body, double delta_time)

Detailed Description

2D physics utilities (point masses, forces, kinematics).

This header provides small helpers for common 2D physics operations. By default, quantities are interpreted in SI units (meters, seconds), but formulas are dimensionally homogeneous: results are correct for any consistent unit system (e.g., km and s; cm and s), provided all inputs use the same system.

Dimensionality uses the base dimensions L (length) and T (time). For example:

  • position: [L]
  • velocity: [L T^-1]
  • acceleration: [L T^-2]
  • time: [T]

Data Structure Documentation

◆ bj_particle_2d

struct bj_particle_2d

2D point mass state and physical properties.

Positions, velocities, accelerations and force accumulator are expressed in world space. Damping is a unitless velocity decay factor applied per-step. Mass is represented as inverse mass; use 0 to represent an immovable object.

Parameters
positionCurrent 2D position [L]
velocityCurrent 2D velocity [L T^-1]
accelerationCurrent 2D acceleration [L T^-2]
forcesAccumulated force for the next integration step [M L T^-2]
dampingVelocity damping factor in [0, 1]
inverse_massInverse of mass [M^-1]; 0 means infinite mass
Collaboration diagram for bj_particle_2d:
Data Fields
struct bj_vec2 acceleration
bj_real damping
struct bj_vec2 forces
bj_real inverse_mass
struct bj_vec2 position
struct bj_vec2 velocity

◆ bj_angular_2d

struct bj_angular_2d

Angular.

2D angular state and properties (scalar angle about Z).

Angle units are radians. Damping is unitless per-step decay on angular velocity. Inertia is represented via inverse inertia; use 0 for infinite inertia.

Parameters
valueAngle theta [rad]
velocityAngular velocity omega [rad T^-1]
accelerationAngular acceleration alpha [rad T^-2]
torqueAccumulated torque tau for next step [M L^2 T^-2]
dampingAngular velocity damping factor in [0, 1]
inverse_inertiaInverse moment of inertia I^-1 [M^-1 L^-2]
Data Fields
bj_real acceleration
bj_real damping
bj_real inverse_inertia
bj_real torque
bj_real value
bj_real velocity

◆ bj_rigid_body_2d

struct bj_rigid_body_2d

Rigid body with translational and angular components.

Particle terms are in world space. Angle is about +Z.

Parameters
particleLinear state (position, velocity, forces)
angularAngular state (theta, omega, tau)
Collaboration diagram for bj_rigid_body_2d:
Data Fields
struct bj_angular_2d angular
struct bj_particle_2d particle

Function Documentation

◆ bj_apply_angular_torque_2d()

void bj_apply_angular_torque_2d ( struct bj_angular_2d * angular,
bj_real torque )

Add torque to the angular accumulator.

Parameters
angularAngular state to modify
torqueTorque to add tau [M L^2 T^-2]

◆ bj_apply_drag_2d()

void bj_apply_drag_2d ( struct bj_particle_2d * particle,
bj_real k1,
bj_real k2 )

Apply quadratic + linear drag to a particle's accumulator.

Drag magnitude = k1 * |v| + k2 * |v|^2 along -v_hat.

Parameters
particleParticle to affect
k1Linear drag coefficient [M T^-1]
k2Quadratic drag coefficient [M L^-1]

◆ bj_apply_gravity_2d()

void bj_apply_gravity_2d ( struct bj_particle_2d * particle,
bj_real gravity )

Apply constant downward gravity in world space to a particle.

Adds force F = m * g * (0, -1) assuming -Y is "down".

Parameters
particleParticle to affect
gravityGravitational acceleration magnitude g >= 0 [L T^-2]

◆ bj_apply_particle_force_2d()

void bj_apply_particle_force_2d ( struct bj_particle_2d * particle,
const struct bj_vec2 force )

Add a force to a particle's accumulator.

The force will be used on the next integration step, then should be cleared by the step routine.

Parameters
particleParticle to modify
forceForce to add [M L T^-2]

◆ bj_apply_point_gravity_2d()

void bj_apply_point_gravity_2d ( struct bj_particle_2d *restrict particle_from,
const struct bj_particle_2d *restrict particle_to,
const bj_real gravity_factor )

Apply point gravity from one particle to another.

Adds a Newtonian attraction from particle_to to particle_from. Uses F = Gm1m2 r_hat / r^2 with gravity_factor = G.

Parameters
particle_fromParticle receiving the force
particle_toSource particle
gravity_factorGravitational constant G [L^3 M^-1 T^-2]

◆ bj_apply_point_gravity_softened_2d()

void bj_apply_point_gravity_softened_2d ( struct bj_particle_2d *restrict particle_from,
const struct bj_particle_2d *restrict particle_to,
const bj_real gravity_factor,
const bj_real epsilon )

Apply softened point gravity to avoid singularities at small r.

Uses F proportional to r / (r^2 + epsilon^2)^(3/2).

Parameters
particle_fromParticle receiving the force
particle_toSource particle
gravity_factorGravitational constant G [L^3 M^-1 T^-2]
epsilonSoftening length epsilon >= 0 [L]

◆ bj_apply_rigidbody_force_2d()

void bj_apply_rigidbody_force_2d ( struct bj_rigid_body_2d * body,
const struct bj_vec2 force )

Apply a world-space force at the center of mass.

Only affects linear state. Use external torque to affect rotation.

Parameters
bodyRigid body to modify
forceForce to add [M L T^-2]

◆ bj_compute_kinematics_2d()

struct bj_vec2 bj_compute_kinematics_2d ( struct bj_vec2 position,
struct bj_vec2 velocity,
struct bj_vec2 acceleration,
bj_real time )

Integrate constant-acceleration 2D kinematics: position at time t.

Uses: out = position + velocity * time + 0.5 * acceleration * time^2.

Parameters
positionInitial position [L]
velocityInitial velocity [L T^-1]
accelerationConstant acceleration [L T^-2]
timeElapsed time t [T]
Returns
Output position at time t [L]

◆ bj_compute_kinematics_velocity_2d()

struct bj_vec2 bj_compute_kinematics_velocity_2d ( struct bj_vec2 velocity,
struct bj_vec2 acceleration,
bj_real time )

Integrate constant-acceleration 2D kinematics: velocity at time t.

Uses: out = velocity + acceleration * time.

Parameters
velocityInitial velocity [L T^-1]
accelerationConstant acceleration [L T^-2]
timeElapsed time t [T]
Returns
Output velocity at time t [L T^-1]

◆ bj_compute_particle_drag_coefficient_2d()

bj_real bj_compute_particle_drag_coefficient_2d ( const struct bj_vec2 vel,
const bj_real k1,
const bj_real k2 )

Return scalar drag coefficient for a velocity.

Computes c = k1 * |v| + k2 * |v|^2.

Parameters
velVelocity vector [L T^-1]
k1Linear drag coefficient [M T^-1]
k2Quadratic drag coefficient [M L^-1]
Returns
c >= 0 [M T^-1]

◆ bj_compute_particle_drag_force_2d()

struct bj_vec2 bj_compute_particle_drag_force_2d ( struct bj_vec2 vel,
const bj_real k1,
const bj_real k2 )

Compute drag force for a velocity.

result = -c * v_hat with c as above. Zero if vel is near zero.

Parameters
velVelocity vector [L T^-1]
k1Linear drag coefficient [M T^-1]
k2Quadratic drag coefficient [M L^-1]
Returns
Output force [M L T^-2]

◆ bj_step_angular_2d()

void bj_step_angular_2d ( struct bj_angular_2d * angular,
double delta_time )

Semi-implicit Euler step for angular motion.

Integrates alpha and omega, applies damping, and advances theta. Clears torque.

Parameters
angularAngular state to integrate
delta_timeTime step [T]

◆ bj_step_particle_2d()

void bj_step_particle_2d ( struct bj_particle_2d * particle,
bj_real dt )

Semi-implicit Euler step for a particle.

Integrates acceleration and velocity, applies damping, and advances position. Clears the force accumulator after use.

Parameters
particleParticle to integrate
dtTime step [T]

◆ bj_step_rigid_body_2d()

void bj_step_rigid_body_2d ( struct bj_rigid_body_2d * body,
double delta_time )

Step rigid body linear and angular states.

Calls the corresponding particle and angular integrators. Clears accumulators.

Parameters
bodyRigid body to integrate
delta_timeTime step [T]