diff options
Diffstat (limited to 'src/dynamics/integration_parameters.rs')
| -rw-r--r-- | src/dynamics/integration_parameters.rs | 74 |
1 files changed, 18 insertions, 56 deletions
diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 8c0f26c..e039bfc 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -6,6 +6,17 @@ use crate::math::Real; pub struct IntegrationParameters { /// The timestep length (default: `1.0 / 60.0`) pub dt: Real, + /// Minimum timestep size when using CCD with multiple substeps (default `1.0 / 60.0 / 100.0`) + /// + /// When CCD with multiple substeps is enabled, the timestep is subdivided + /// into smaller pieces. This timestep subdivision won't generate timestep + /// lengths smaller than `min_dt`. + /// + /// Setting this to a large value will reduce the opportunity to performing + /// CCD substepping, resulting in potentially more time dropped by the + /// motion-clamping mechanism. Setting this to an very small value may lead + /// to numerical instabilities. + pub min_ccd_dt: Real, // /// If `true` and if rapier is compiled with the `parallel` feature, this will enable rayon-based multithreading (default: `true`). // /// @@ -15,9 +26,9 @@ pub struct IntegrationParameters { // /// Note that using only one thread with `multithreading_enabled` set to `true` will result on a slower // /// simulation than setting `multithreading_enabled` to `false`. // pub multithreading_enabled: bool, - /// If `true`, the world's `step` method will stop right after resolving exactly one CCD event (default: `false`). - /// This allows the user to take action during a timestep, in-between two CCD events. - pub return_after_ccd_substep: bool, + // /// If `true`, the world's `step` method will stop right after resolving exactly one CCD event (default: `false`). + // /// This allows the user to take action during a timestep, in-between two CCD events. + // pub return_after_ccd_substep: bool, /// The Error Reduction Parameter in `[0, 1]` is the proportion of /// the positional error to be corrected at each time step (default: `0.2`). pub erp: Real, @@ -27,6 +38,8 @@ pub struct IntegrationParameters { /// Each cached impulse are multiplied by this coefficient in `[0, 1]` /// when they are re-used to initialize the solver (default `1.0`). pub warmstart_coeff: Real, + /// Correction factor to avoid large warmstart impulse after a strong impact (default `10.0`). + pub warmstart_correction_slope: Real, /// 0-1: how much of the velocity to dampen out in the constraint solver? /// (default `1.0`). @@ -51,49 +64,14 @@ pub struct IntegrationParameters { pub max_linear_correction: Real, /// Maximum angular correction during one step of the non-linear position solver (default: `0.2`). pub max_angular_correction: Real, - /// Maximum nonlinear SOR-prox scaling parameter when the constraint - /// correction direction is close to the kernel of the involved multibody's - /// jacobian (default: `0.2`). - pub max_stabilization_multiplier: Real, /// Maximum number of iterations performed by the velocity constraints solver (default: `4`). pub max_velocity_iterations: usize, /// Maximum number of iterations performed by the position-based constraints solver (default: `1`). pub max_position_iterations: usize, /// Minimum number of dynamic bodies in each active island (default: `128`). pub min_island_size: usize, - /// Maximum number of iterations performed by the position-based constraints solver for CCD steps (default: `10`). - /// - /// This should be sufficiently high so all penetration get resolved. For example, if CCD cause your - /// objects to stutter, that may be because the number of CCD position iterations is too low, causing - /// them to remain stuck in a penetration configuration for a few frames. - /// - /// The higher this number, the higher its computational cost. - pub max_ccd_position_iterations: usize, /// Maximum number of substeps performed by the solver (default: `1`). pub max_ccd_substeps: usize, - /// Controls the number of Proximity::Intersecting events generated by a trigger during CCD resolution (default: `false`). - /// - /// If false, triggers will only generate one Proximity::Intersecting event during a step, even - /// if another colliders repeatedly enters and leaves the triggers during multiple CCD substeps. - /// - /// If true, triggers will generate as many Proximity::Intersecting and Proximity::Disjoint/Proximity::WithinMargin - /// events as the number of times a collider repeatedly enters and leaves the triggers during multiple CCD substeps. - /// This is more computationally intensive. - pub multiple_ccd_substep_sensor_events_enabled: bool, - /// Whether penetration are taken into account in CCD resolution (default: `false`). - /// - /// If this is set to `false` two penetrating colliders will not be considered to have any time of impact - /// while they are penetrating. This may end up allowing some tunelling, but will avoid stuttering effect - /// when the constraints solver fails to completely separate two colliders after a CCD contact. - /// - /// If this is set to `true`, two penetrating colliders will be considered to have a time of impact - /// equal to 0 until the constraints solver manages to separate them. This will prevent tunnelling - /// almost completely, but may introduce stuttering effects when the constraints solver fails to completely - /// separate two colliders after a CCD contact. - // FIXME: this is a very binary way of handling penetration. - // We should provide a more flexible solution by letting the user choose some - // minimal amount of movement applied to an object that get stuck. - pub ccd_on_penetration_enabled: bool, } impl IntegrationParameters { @@ -101,28 +79,20 @@ impl IntegrationParameters { #[deprecated = "Use `IntegrationParameters { dt: 60.0, ..Default::default() }` instead"] pub fn new( dt: Real, - // multithreading_enabled: bool, erp: Real, joint_erp: Real, warmstart_coeff: Real, - _restitution_velocity_threshold: Real, allowed_linear_error: Real, allowed_angular_error: Real, max_linear_correction: Real, max_angular_correction: Real, prediction_distance: Real, - max_stabilization_multiplier: Real, max_velocity_iterations: usize, max_position_iterations: usize, - max_ccd_position_iterations: usize, max_ccd_substeps: usize, - return_after_ccd_substep: bool, - multiple_ccd_substep_sensor_events_enabled: bool, - ccd_on_penetration_enabled: bool, ) -> Self { IntegrationParameters { dt, - // multithreading_enabled, erp, joint_erp, warmstart_coeff, @@ -131,14 +101,9 @@ impl IntegrationParameters { max_linear_correction, max_angular_correction, prediction_distance, - max_stabilization_multiplier, max_velocity_iterations, max_position_iterations, - max_ccd_position_iterations, max_ccd_substeps, - return_after_ccd_substep, - multiple_ccd_substep_sensor_events_enabled, - ccd_on_penetration_enabled, ..Default::default() } } @@ -193,19 +158,19 @@ impl Default for IntegrationParameters { fn default() -> Self { Self { dt: 1.0 / 60.0, + min_ccd_dt: 1.0 / 60.0 / 100.0, // multithreading_enabled: true, - return_after_ccd_substep: false, erp: 0.2, joint_erp: 0.2, velocity_solve_fraction: 1.0, velocity_based_erp: 0.0, warmstart_coeff: 1.0, + warmstart_correction_slope: 10.0, allowed_linear_error: 0.005, prediction_distance: 0.002, allowed_angular_error: 0.001, max_linear_correction: 0.2, max_angular_correction: 0.2, - max_stabilization_multiplier: 0.2, max_velocity_iterations: 4, max_position_iterations: 1, // FIXME: what is the optimal value for min_island_size? @@ -214,10 +179,7 @@ impl Default for IntegrationParameters { // However we don't want it to be too small and end up with // tons of islands, reducing SIMD parallelism opportunities. min_island_size: 128, - max_ccd_position_iterations: 10, max_ccd_substeps: 1, - multiple_ccd_substep_sensor_events_enabled: false, - ccd_on_penetration_enabled: false, } } } |
