1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use crate::math::Real; use crate::query::{ DefaultQueryDispatcher, NonlinearRigidMotion, QueryDispatcher, Unsupported, TOI, }; use crate::shape::Shape; /// Computes the smallest time of impact of two shapes under translational an rotational movements. /// /// # Parameters /// * `motion1` - The motion of the first shape. /// * `g1` - The first shape involved in the query. /// * `motion2` - The motion of the second shape. /// * `g2` - The second shape involved in the query. /// * `start_time` - The starting time of the interval where the motion takes place. /// * `end_time` - The end time of the interval where the motion takes place. /// * `stop_at_penetration` - If the casted shape starts in a penetration state with any /// collider, two results are possible. If `stop_at_penetration` is `true` then, the /// result will have a `toi` equal to `start_time`. If `stop_at_penetration` is `false` /// then the nonlinear shape-casting will see if further motion wrt. the penetration normal /// would result in tunnelling. If it does not (i.e. we have a separating velocity along /// that normal) then the nonlinear shape-casting will attempt to find another impact, /// at a time `> start_time` that could result in tunnelling. pub fn nonlinear_time_of_impact( motion1: &NonlinearRigidMotion, g1: &dyn Shape, motion2: &NonlinearRigidMotion, g2: &dyn Shape, start_time: Real, end_time: Real, stop_at_penetration: bool, ) -> Result<Option<TOI>, Unsupported> { DefaultQueryDispatcher.nonlinear_time_of_impact( motion1, g1, motion2, g2, start_time, end_time, stop_at_penetration, ) }