pub struct ContactConstraint {
pub body_a: BodyHandle,
pub body_b: BodyHandle,
pub contact_point: Vec2,
pub normal: Vec2,
pub penetration: f32,
pub restitution: f32,
pub friction: f32,
pub baumgarte: f32,
pub slop: f32,
pub cached_normal: f32,
pub cached_tangent: f32,
/* private fields */
}Expand description
Contact constraint: normal impulse (non-penetration) + friction impulse.
Uses Baumgarte stabilization and warm-starting of cached impulses.
Fields§
§body_a: BodyHandle§body_b: BodyHandle§contact_point: Vec2Contact point in world space.
normal: Vec2Contact normal (from A to B).
penetration: f32Penetration depth (positive = overlap).
restitution: f32Restitution (bounciness).
friction: f32Friction coefficient.
baumgarte: f32Baumgarte bias factor.
slop: f32Penetration slop — small overlaps are allowed.
cached_normal: f32Warm-started normal impulse.
cached_tangent: f32Warm-started friction impulse.
Implementations§
Source§impl ContactConstraint
impl ContactConstraint
pub fn new( body_a: BodyHandle, body_b: BodyHandle, contact_point: Vec2, normal: Vec2, penetration: f32, restitution: f32, friction: f32, ) -> Self
Sourcepub fn solve_contact(
&mut self,
bodies: &mut HashMap<BodyHandle, BodyState>,
dt: f32,
)
pub fn solve_contact( &mut self, bodies: &mut HashMap<BodyHandle, BodyState>, dt: f32, )
Solve both normal and friction in one call, handling warm-starting.
Trait Implementations§
Source§impl Clone for ContactConstraint
impl Clone for ContactConstraint
Source§fn clone(&self) -> ContactConstraint
fn clone(&self) -> ContactConstraint
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Constraint for ContactConstraint
impl Constraint for ContactConstraint
Source§fn prepare(&mut self, bodies: &HashMap<BodyHandle, BodyState>, dt: f32)
fn prepare(&mut self, bodies: &HashMap<BodyHandle, BodyState>, dt: f32)
Prepare the constraint for the current step (pre-compute cached values).
Source§fn compute_cdot(&self, bodies: &HashMap<BodyHandle, BodyState>) -> f32
fn compute_cdot(&self, bodies: &HashMap<BodyHandle, BodyState>) -> f32
Compute the velocity constraint violation (Cdot = J * v).
Source§fn compute_c(&self, _bodies: &HashMap<BodyHandle, BodyState>) -> f32
fn compute_c(&self, _bodies: &HashMap<BodyHandle, BodyState>) -> f32
Compute the position constraint violation (C).
Source§fn effective_mass(&self, bodies: &HashMap<BodyHandle, BodyState>) -> f32
fn effective_mass(&self, bodies: &HashMap<BodyHandle, BodyState>) -> f32
Compute effective constraint mass (1 / (J M^-1 J^T)).
Source§fn bias(&self, _bodies: &HashMap<BodyHandle, BodyState>, _dt: f32) -> f32
fn bias(&self, _bodies: &HashMap<BodyHandle, BodyState>, _dt: f32) -> f32
Baumgarte position bias.
Source§fn apply_impulse(
&self,
bodies: &mut HashMap<BodyHandle, BodyState>,
lambda: f32,
)
fn apply_impulse( &self, bodies: &mut HashMap<BodyHandle, BodyState>, lambda: f32, )
Apply the corrective impulse to body states.
Source§fn solve_velocity(
&mut self,
bodies: &mut HashMap<BodyHandle, BodyState>,
dt: f32,
)
fn solve_velocity( &mut self, bodies: &mut HashMap<BodyHandle, BodyState>, dt: f32, )
Solve velocity constraint (one iteration).
Source§fn impulse_bounds(&self) -> (f32, f32)
fn impulse_bounds(&self) -> (f32, f32)
Whether this constraint has an upper/lower impulse clamp.
Source§fn accumulated_impulse(&self) -> f32
fn accumulated_impulse(&self) -> f32
Accumulated impulse for warm starting.
fn reset_accumulated(&mut self)
fn add_accumulated(&mut self, d: f32)
Source§fn body_handles(&self) -> Vec<BodyHandle>
fn body_handles(&self) -> Vec<BodyHandle>
Bodies involved in this constraint.
Source§fn get_compliance(&self) -> f32
fn get_compliance(&self) -> f32
XPBD compliance (inverse stiffness). 0 = rigid.
Source§fn solve_position(
&mut self,
bodies: &mut HashMap<BodyHandle, BodyState>,
dt: f32,
)
fn solve_position( &mut self, bodies: &mut HashMap<BodyHandle, BodyState>, dt: f32, )
Solve position constraint using XPBD (one sub-step).
Auto Trait Implementations§
impl Freeze for ContactConstraint
impl RefUnwindSafe for ContactConstraint
impl Send for ContactConstraint
impl Sync for ContactConstraint
impl Unpin for ContactConstraint
impl UnsafeUnpin for ContactConstraint
impl UnwindSafe for ContactConstraint
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.