diff options
| author | Crozet Sébastien <developer@crozet.re> | 2021-02-01 17:19:27 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2021-02-01 17:19:27 +0100 |
| commit | 16ba01be16fbf86cf51dab4eea30ae49b7cbea0d (patch) | |
| tree | a38cb52b725cbe92500cd20977ebdead8965867b /src/dynamics/solver/constraint_regularization.rs | |
| parent | 3805943067713ce881ec479bfce2b7af5d334414 (diff) | |
| download | rapier-16ba01be16fbf86cf51dab4eea30ae49b7cbea0d.tar.gz rapier-16ba01be16fbf86cf51dab4eea30ae49b7cbea0d.tar.bz2 rapier-16ba01be16fbf86cf51dab4eea30ae49b7cbea0d.zip | |
More experiments with velocity-based error correction.
Diffstat (limited to 'src/dynamics/solver/constraint_regularization.rs')
| -rw-r--r-- | src/dynamics/solver/constraint_regularization.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/dynamics/solver/constraint_regularization.rs b/src/dynamics/solver/constraint_regularization.rs new file mode 100644 index 0000000..4c67145 --- /dev/null +++ b/src/dynamics/solver/constraint_regularization.rs @@ -0,0 +1,34 @@ +use crate::math::Real; +use na::RealField; + +pub struct SpringRegularization { + pub angular_frequency: Real, + pub damping: Real, +} + +impl Default for SpringRegularization { + fn default() -> Self { + SpringRegularization { + angular_frequency: 30.0 * Real::two_pi(), + damping: 1.0, + } + } +} + +impl SpringRegularization { + pub fn erp_cfm_impulse_scale(&self, dt: Real) -> (Real, Real, Real) { + let freq_dt = self.angular_frequency * dt; + let erp = self.angular_frequency / (freq_dt + self.damping * 2.0); + let extra = 1.0 / (freq_dt * (freq_dt + self.damping * 2.0)); + let cfm = 1.0 / (1.0 + extra); + let impulse_scale = extra * cfm; + + let kd = 1.0; + let kp = 10.0; + let erp = 0.2 / dt; // kp / (dt * kp + kd); + let cfm = 1.0e-5 / dt; // 1.0 / (dt * kp + kd); + let impulse_scale = 0.9; + + (erp, cfm, impulse_scale) + } +} |
