From 7306821c460ca3f77e697c89a79393e61c126624 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sun, 28 Mar 2021 11:26:53 +0200 Subject: Attenuate the warmstart impulse for CCD contacts. CCD contacts result in very strong, instantaneous, impulses. So it is preferable to attenuate their contribution to subsequent timesteps to avoid overshooting. --- src/dynamics/integration_parameters.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 8c0f26c..136e345 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -27,6 +27,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. + pub warmstart_correction_slope: Real, /// 0-1: how much of the velocity to dampen out in the constraint solver? /// (default `1.0`). @@ -200,6 +202,7 @@ impl Default for IntegrationParameters { velocity_solve_fraction: 1.0, velocity_based_erp: 0.0, warmstart_coeff: 1.0, + warmstart_correction_slope: 1.0, allowed_linear_error: 0.005, prediction_distance: 0.002, allowed_angular_error: 0.001, -- cgit From a733f97028f5cd532212572f9561ab64e09f002b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 29 Mar 2021 17:21:49 +0200 Subject: Implement the ability to run multiple CCD substeps. --- src/dynamics/integration_parameters.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 136e345..615bfee 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`). // /// @@ -195,6 +206,7 @@ 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, -- cgit From 80f487fd4a34f815bdaaf0441fdefaae3ecefd1b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 31 Mar 2021 16:35:33 +0200 Subject: Test to see how the warmstart correction affect the benchmarks. --- src/dynamics/integration_parameters.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 615bfee..30728db 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -214,7 +214,7 @@ impl Default for IntegrationParameters { velocity_solve_fraction: 1.0, velocity_based_erp: 0.0, warmstart_coeff: 1.0, - warmstart_correction_slope: 1.0, + warmstart_correction_slope: 1.0e7, allowed_linear_error: 0.005, prediction_distance: 0.002, allowed_angular_error: 0.001, -- cgit From ab876964a05aa1828be7d979a4f862df184a8fd2 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 31 Mar 2021 16:55:33 +0200 Subject: Revert the warmstart_correction_slope to its previous value. --- src/dynamics/integration_parameters.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 30728db..615bfee 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -214,7 +214,7 @@ impl Default for IntegrationParameters { velocity_solve_fraction: 1.0, velocity_based_erp: 0.0, warmstart_coeff: 1.0, - warmstart_correction_slope: 1.0e7, + warmstart_correction_slope: 1.0, allowed_linear_error: 0.005, prediction_distance: 0.002, allowed_angular_error: 0.001, -- cgit From 1b073e98b45915abe3c727696e8b49753a03d7ee Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 31 Mar 2021 18:41:02 +0200 Subject: Remove the IntegrationParameters field we don't use. --- src/dynamics/integration_parameters.rs | 59 ++-------------------------------- 1 file changed, 3 insertions(+), 56 deletions(-) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index 615bfee..e4373c0 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -26,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, @@ -64,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 { @@ -114,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, @@ -144,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() } } @@ -208,7 +160,6 @@ impl Default for IntegrationParameters { 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, @@ -220,7 +171,6 @@ impl Default for IntegrationParameters { 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? @@ -229,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, } } } -- cgit From 0ecc302971e353f181c5319504124c3967c89d15 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Thu, 1 Apr 2021 10:11:32 +0200 Subject: Some small performance improvements. --- src/dynamics/integration_parameters.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/dynamics/integration_parameters.rs') diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs index e4373c0..e039bfc 100644 --- a/src/dynamics/integration_parameters.rs +++ b/src/dynamics/integration_parameters.rs @@ -38,7 +38,7 @@ 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. + /// 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? @@ -165,7 +165,7 @@ impl Default for IntegrationParameters { velocity_solve_fraction: 1.0, velocity_based_erp: 0.0, warmstart_coeff: 1.0, - warmstart_correction_slope: 1.0, + warmstart_correction_slope: 10.0, allowed_linear_error: 0.005, prediction_distance: 0.002, allowed_angular_error: 0.001, -- cgit