Physics Simulations
Springs, friction, gravity, and clamped simulations with completion rules.
All simulations expose position(t), velocity(t), is_done(t).
| Simulation | Motion | Done when |
|---|---|---|
SpringSimulation | Damped spring to target | Within distance + velocity tolerance |
FrictionSimulation | Exponential decay | Velocity below tolerance |
GravitySimulation | Constant acceleration | Past the end in fall direction |
ClampedSimulation | Inner sim with hard bounds | Inner done |
Spring
use incular::prelude::*;
fn main() {
let spring =
SpringDescription::with_damping_ratio(1.0, 100.0, 0.7);
println!("spring: {:?}", spring.spring_type());
let sim = SpringSimulation::new(spring, 0.0, 100.0, 0.0, Tolerance::DEFAULT);
let at = std::time::Duration::from_millis(100);
println!("pos: {}, done: {}", sim.position(at), sim.is_done(at));
let fall = GravitySimulation::new(980.0, 0.0, 500.0, 0.0);
println!("fall done: {}", fall.is_done(at));
}SpringSimulation::new(spring, 0.0, 100.0, 0.0, Tolerance::DEFAULT) ScrollSpringSimulation::new(..) // scroll-tuned variant ClampedSimulation::new(inner, min, max) BoundedFrictionSimulation::new(..)
Invalid mass/stiffness/damping fall back to 1 / 100 / 10. Done when
|pos - end| <= distance and |vel| <= velocity tolerance.
SpringType: CriticallyDamped / UnderDamped / OverDamped.
Friction and gravity
Exponential decay (FrictionSimulation::new(drag, start, velocity, tolerance); invalid drag falls back to 0.135) and constant acceleration
(GravitySimulation::new(acceleration, start, end, velocity)) — the gravity
case runs in the program above.
Tolerance
Tolerance::DEFAULT (distance 0.001, time 1ms, velocity 0.001) or
Tolerance::new(distance, time, velocity).
Related: AnimationController,
ScrollController.