From 283a0bdde390dce489896a715470f69d8e401ca0 Mon Sep 17 00:00:00 2001 From: Robert Garrett Date: Mon, 15 Jul 2024 10:10:56 -0500 Subject: [PATCH] Add separation_force function --- src/birdoids_plugin.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/birdoids_plugin.rs b/src/birdoids_plugin.rs index ef1b25d4..3043f6cc 100644 --- a/src/birdoids_plugin.rs +++ b/src/birdoids_plugin.rs @@ -9,7 +9,7 @@ const PLAYERBOID_COLOR: Color = Color::srgb(1.0, 0.0, 0.0); const TURN_FACTOR: f32 = 1.0; const BOID_VIEW_RANGE: f32 = 50.0; const COHESION_FACTOR: f32 = 1.0; -const SEPARATION_FACTOR: f32 = 100.0; +const SEPARATION_FACTOR: f32 = 1.0; const ALIGNMENT_FACTOR: f32 = 500.0; const SPACEBRAKES_COEFFICIENT: f32 = 0.01; @@ -218,17 +218,19 @@ fn separation( Vec3::ZERO, |accumulator, neighbor| { let force = separation_force(boid_transform.translation.xy(), neighbor.xy()); - accumulator + *force + accumulator + *force * SEPARATION_FACTOR }, ); boid_acceleration.0 += accel; } } -// TODO: Make this an exponential so force gets stronger faster as the points approach. +// f(x) = -x^2 + 1 fn separation_force(us: Vec2, neighbor: Vec2) -> Force { let distance = neighbor - us; - Force(-(distance * SEPARATION_FACTOR).extend(0.0)) + let scaled = distance / BOID_VIEW_RANGE; + let force_vec = -scaled.powf(2.0) + Vec2::ONE; + Force(force_vec.extend(0.0)) } fn alignment(