pub struct Spring {
pub stiffness: f32,
pub damping: f32,
pub mass: f32,
}Expand description
A damped spring, solved in closed form so a position is a function of time rather than of how many frames happened to be delivered.
Fields§
§stiffness: f32§damping: f32§mass: f32Implementations§
Source§impl Spring
impl Spring
pub fn new(stiffness: f32, damping: f32, mass: f32) -> Self
Sourcepub fn perceptual(duration: Duration, bounce: f32) -> Self
pub fn perceptual(duration: Duration, bounce: f32) -> Self
A spring described the way a design decision is: how long it takes and how much it overshoots.
Stiffness, damping and mass are three numbers for two decisions, and
neither decision is either of the three. This is the same
parameterisation as SwiftUI’s Spring(duration:bounce:), and it is a
change of variables rather than an approximation:
- mass is fixed at 1. A spring’s behaviour depends on stiffness and
damping only through
k/mandc/m, so nothing is lost by it; durationis the period of the undamped oscillation, which is what sets the pace whatever the damping does:omega = 2 * PI / duration, andstiffness = omega^2 * mass;bounceis the damping ratio turned inside out, so that 0 is critically damped whichever side of it the value is on:zeta = 1 - bouncefor a positive bounce, which reaches the undampedzeta = 0at 1, andzeta = 1 / (1 + bounce)for a negative one, which grows without bound toward -1. Damping follows from the ratio:damping = 2 * zeta * sqrt(stiffness * mass), which with the frequency above is4 * PI * zeta * mass / duration.
So a bounce of 0 settles without passing its target, a positive bounce
overshoots and comes back, and a negative one crawls in. The bounce is
held inside -0.99..=0.99.
Spring::new is unchanged and remains the way in for a spring whose
three constants are already known, a token preset included.
pub fn preset(theme: &Theme, preset: SpringPreset) -> Self
Sourcepub fn damping_ratio(self) -> f32
pub fn damping_ratio(self) -> f32
Damping ratio: below one oscillates, one settles fastest, above one crawls.
Sourcepub fn perceptual_duration(self) -> Duration
pub fn perceptual_duration(self) -> Duration
The duration half of Spring::perceptual, for a spring built any
other way: the period of the undamped oscillation.
It is not the settle time. A spring is still perceptibly arriving after
its perceptual duration — at a bounce of 0 it is roughly 99% of the way
there — and Spring::settle_time is the honest end of the motion.
Sourcepub fn value(self, elapsed: Duration) -> f32
pub fn value(self, elapsed: Duration) -> f32
Normalized step response: 0 at rest, approaching 1 as it settles.
Sourcepub fn value_at(self, elapsed: Duration, velocity: f32) -> (f32, f32)
pub fn value_at(self, elapsed: Duration, velocity: f32) -> (f32, f32)
Normalized step response for a spring that was already moving when it was aimed here.
velocity is the speed carried into the motion, in units of the full
distance per second and positive toward the target. The pair is the
value and its own velocity, so a caller that retargets again can hand
the motion on rather than restarting it.
Sourcepub fn settle_time(self) -> Duration
pub fn settle_time(self) -> Duration
How long until the spring stays within one part in a thousand of its target.
Sourcepub fn settle_time_at(self, velocity: f32) -> Duration
pub fn settle_time_at(self, velocity: f32) -> Duration
The same, for a spring released with velocity already carried into
the motion: one that is travelling fast needs longer to come to rest.
Trait Implementations§
impl Copy for Spring
Source§impl From<SpringTokens> for Spring
impl From<SpringTokens> for Spring
Source§fn from(tokens: SpringTokens) -> Self
fn from(tokens: SpringTokens) -> Self
impl StructuralPartialEq for Spring
Auto Trait Implementations§
impl Freeze for Spring
impl RefUnwindSafe for Spring
impl Send for Spring
impl Sync for Spring
impl Unpin for Spring
impl UnsafeUnpin for Spring
impl UnwindSafe for Spring
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more