pub struct ContactProblem {
pub n: usize,
pub delassus: Vec<f64>,
pub free_velocity: Vec<f64>,
pub rows: Vec<ContactRow>,
pub bodies: Vec<(usize, usize)>,
}Expand description
The assembled convex contact problem.
delassus is row-major 3n x 3n, ordered [n, u, w] per contact.
Fields§
§n: usizeNumber of contacts.
delassus: Vec<f64>A = J M^-1 J^T, row-major 3n x 3n.
free_velocity: Vec<f64>Free contact-space velocity b, length 3n.
rows: Vec<ContactRow>Per-contact parameters.
bodies: Vec<(usize, usize)>The body pair each contact acts between, (body_i, body_j), with
usize::MAX for the static world — the same sentinel
phyz_collision::Collision uses.
Only ContactCoupling::PerBody reads this; it is what decides
whether two contacts share a body and therefore whether their
off-diagonal block is one the GPU can afford.
A map whose length is not n means “body structure unknown”, and
PerBody then degrades to ContactCoupling::Full rather than
dropping blocks it cannot justify dropping. Failing toward more
coupling is the safe direction: it costs time, where the other
direction silently changes the physics. Hand-built problems in the
tests take this path.
Implementations§
Source§impl ContactProblem
impl ContactProblem
Sourcepub fn effective_restitution(e: f64, approach_speed: f64, v_rest: f64) -> f64
pub fn effective_restitution(e: f64, approach_speed: f64, v_rest: f64) -> f64
Effective restitution after the smooth low-speed ramp.
smoothstep between v_rest and 2*v_rest keeps this C^1 in the
approach speed; a hard if |v_n| < eps { 0 } would not be, and a
gradient through it would be wrong exactly at rest.
Sourcepub fn impact_weight(approach_speed: f64, v_rest: f64) -> f64
pub fn impact_weight(approach_speed: f64, v_rest: f64) -> f64
The restitution ramp alone: how much of an impact an approach at this
speed is, 0 at and below v_rest, 1 at and above 2 * v_rest.
This is what ContactRow::impact carries.
Trait Implementations§
Source§impl Clone for ContactProblem
impl Clone for ContactProblem
Source§fn clone(&self) -> ContactProblem
fn clone(&self) -> ContactProblem
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more