Skip to main content

SpringJoint

Struct SpringJoint 

Source
pub struct SpringJoint {
    pub body_a: usize,
    pub body_b: usize,
    pub local_anchor_a: Vec3Fix,
    pub local_anchor_b: Vec3Fix,
    pub rest_length: Fix128,
    pub stiffness: Fix128,
    pub damping: Fix128,
    pub break_force: Option<Fix128>,
}
Expand description

Spring joint: a spring-damper between two anchor points

The joint applies the force (on B; A receives the opposite)

  • rest_length == 0: F = −k d − c u, with d = anchor_b − anchor_a and u = d' the relative anchor velocity. Spring and damper are both isotropic, so the damper removes the tangential relative velocity as well as the radial one and a body held by the spring does not orbit its anchor.
  • rest_length > 0: F = −(k (|d| − L) + c (u · n)) n, n = d / |d|, the usual spring with a dashpot along its axis. The direction across the axis is free (a pendulum stays a pendulum), as for a physical spring-damper element; use rest_length = 0 to hold a body at a point.

For a body of mass m held against a static or kinematic anchor (or two bodies with m_eff = 1 / (1/m_a + 1/m_b)), angular frequency ω and damping ratio ζ, use stiffness = m_eff ω² and damping = 2 ζ m_eff ω; ζ = 1 (damping = 2 √(k m_eff)) is critical damping, x(t) = (x0 + (v0 + ω x0) t) e^(−ωt) with no overshoot.

It is solved once per substep as an XPBD constraint with damping (Macklin, Müller, Chentanez 2016, eq. 26), which is a backward Euler step of the force law: the result converges to the same continuous solution for any substeps, does not depend on iterations, and is stable for any k and c. Each joint carries its own stiffness / damping, so springs of different ω can share one world. SolverConfig::damping and the per-body damping factors are applied on top, once per frame.

Fields§

§body_a: usize

Index of the first body

§body_b: usize

Index of the second body

§local_anchor_a: Vec3Fix

Anchor point in body A’s local space

§local_anchor_b: Vec3Fix

Anchor point in body B’s local space

§rest_length: Fix128

Rest length L of the spring in metres. 0 makes the spring and the damper isotropic (see the type doc)

§stiffness: Fix128

Spring stiffness k in newtons per metre (m_eff ω² for angular frequency ω). Independent of the step length and of substeps

§damping: Fix128

Damping coefficient c in newton-seconds per metre, acting on the relative anchor velocity (every component for rest_length = 0, the component along the spring otherwise). Critical damping is c = 2 √(k m_eff)

§break_force: Option<Fix128>

Maximum spring force |k (|d| − L)| in newtons before the joint breaks (None = unbreakable), see solve_joints_breakable

Implementations§

Source§

impl SpringJoint

Source

pub const fn new( body_a: usize, body_b: usize, anchor_a: Vec3Fix, anchor_b: Vec3Fix, rest_length: Fix128, stiffness: Fix128, damping: Fix128, ) -> Self

Create a new spring joint

Source

pub const fn with_break_force(self, force: Fix128) -> Self

Set break force threshold

Trait Implementations§

Source§

impl Clone for SpringJoint

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SpringJoint

Source§

impl Debug for SpringJoint

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for SpringJoint

Source§

impl PartialEq for SpringJoint

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for SpringJoint

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.