Fix the physics integrator

The velocity component never got updated. Instead, the system was only
calculating the current frame's deltaV. That instantaneous dV and any
velocity that *did* get assigned (bundle insertion, keyboard control)
would be added to the position.

Now forces are integrated into velocity, and velocity is integrated into
position. You know... like a real integration function.
This commit is contained in:
2025-09-02 15:44:39 -05:00
parent a6240c844a
commit 69403bc6ca

View File

@@ -1,16 +1,23 @@
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Component, Deref, DerefMut)] #[derive(Component, Default, Deref, DerefMut)]
pub struct Velocity(pub Vec3); pub struct Velocity(pub Vec3);
#[derive(Component, Default, Deref, DerefMut, PartialEq, Debug)] #[derive(Component, Default, Deref, DerefMut, PartialEq, Debug)]
pub struct Force(pub Vec3); pub struct Force(pub Vec3);
pub fn apply_velocity(mut query: Query<(&mut Transform, &Velocity, &mut Force)>, time: Res<Time>) { pub fn apply_velocity(
for (mut transform, velocity, mut acceleration) in &mut query { mut query: Query<(&mut Transform, &mut Velocity, &mut Force)>,
let delta_v = **acceleration * time.delta_secs(); time: Res<Time>,
**acceleration = Vec3::ZERO; ) {
let delta_position = (**velocity + delta_v) * time.delta_secs(); for (mut transform, mut velocity, mut force) in &mut query {
transform.translation += delta_position; // integrate forces into new velocity (assume mass of 1kg)
let delta_v = **force * time.delta_secs();
velocity.0 += delta_v;
force.0 = Vec3::ZERO; // clear force value
// integrate velocity into position
let delta_p = **velocity * time.delta_secs();
transform.translation += delta_p;
} }
} }