aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/ccd
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-05-31 10:22:28 +0200
committerGitHub <noreply@github.com>2022-05-31 10:22:28 +0200
commitfb1bfc762c89cd8c5bd745a82998c1662a1bf196 (patch)
tree0ece4f99d458f47f1408c78f79b85345036d3671 /src/dynamics/ccd
parentc630635e57624385123b4a0fb658018bc6fdba91 (diff)
parent0640f5e660aef579a9e6b134b7066e9bcae32b8b (diff)
downloadrapier-fb1bfc762c89cd8c5bd745a82998c1662a1bf196.tar.gz
rapier-fb1bfc762c89cd8c5bd745a82998c1662a1bf196.tar.bz2
rapier-fb1bfc762c89cd8c5bd745a82998c1662a1bf196.zip
Merge pull request #334 from dimforge/fixes
Some CCD and debug-render improvements
Diffstat (limited to 'src/dynamics/ccd')
-rw-r--r--src/dynamics/ccd/ccd_solver.rs34
-rw-r--r--src/dynamics/ccd/toi_entry.rs34
2 files changed, 48 insertions, 20 deletions
diff --git a/src/dynamics/ccd/ccd_solver.rs b/src/dynamics/ccd/ccd_solver.rs
index bdde135..9e0ab8e 100644
--- a/src/dynamics/ccd/ccd_solver.rs
+++ b/src/dynamics/ccd/ccd_solver.rs
@@ -60,12 +60,20 @@ impl CCDSolver {
let min_toi = (rb.ccd.ccd_thickness
* 0.15
- * crate::utils::inv(rb.ccd.max_point_velocity(&rb.vels)))
+ * crate::utils::inv(rb.ccd.max_point_velocity(&rb.integrated_vels)))
.min(dt);
- // println!("Min toi: {}, Toi: {}", min_toi, toi);
- let new_pos = rb
- .vels
- .integrate(toi.max(min_toi), &rb.pos.position, &local_com);
+ // println!(
+ // "Min toi: {}, Toi: {}, thick: {}, max_vel: {}",
+ // min_toi,
+ // toi,
+ // rb.ccd.ccd_thickness,
+ // rb.ccd.max_point_velocity(&rb.integrated_vels)
+ // );
+ let new_pos = rb.integrated_vels.integrate(
+ toi.max(min_toi),
+ &rb.pos.position,
+ &local_com,
+ );
rb.pos.next_position = new_pos;
}
}
@@ -95,7 +103,7 @@ impl CCDSolver {
} else {
None
};
- let moving_fast = rb.ccd.is_moving_fast(dt, &rb.vels, forces);
+ let moving_fast = rb.ccd.is_moving_fast(dt, &rb.integrated_vels, forces);
rb.ccd.ccd_active = moving_fast;
ccd_active = ccd_active || moving_fast;
}
@@ -131,7 +139,7 @@ impl CCDSolver {
let predicted_body_pos1 = rb1.pos.integrate_forces_and_velocities(
dt,
&rb1.forces,
- &rb1.vels,
+ &rb1.integrated_vels,
&rb1.mprops,
);
@@ -256,7 +264,7 @@ impl CCDSolver {
let predicted_body_pos1 = rb1.pos.integrate_forces_and_velocities(
dt,
&rb1.forces,
- &rb1.vels,
+ &rb1.integrated_vels,
&rb1.mprops,
);
@@ -491,7 +499,10 @@ impl CCDSolver {
let local_com1 = &rb1.mprops.local_mprops.local_com;
let frozen1 = frozen.get(&b1);
let pos1 = frozen1
- .map(|t| rb1.vels.integrate(*t, &rb1.pos.position, local_com1))
+ .map(|t| {
+ rb1.integrated_vels
+ .integrate(*t, &rb1.pos.position, local_com1)
+ })
.unwrap_or(rb1.pos.next_position);
pos1 * co_parent1.pos_wrt_parent
} else {
@@ -504,7 +515,10 @@ impl CCDSolver {
let local_com2 = &rb2.mprops.local_mprops.local_com;
let frozen2 = frozen.get(&b2);
let pos2 = frozen2
- .map(|t| rb2.vels.integrate(*t, &rb2.pos.position, local_com2))
+ .map(|t| {
+ rb2.integrated_vels
+ .integrate(*t, &rb2.pos.position, local_com2)
+ })
.unwrap_or(rb2.pos.next_position);
pos2 * co_parent2.pos_wrt_parent
} else {
diff --git a/src/dynamics/ccd/toi_entry.rs b/src/dynamics/ccd/toi_entry.rs
index 4591825..6f5a47d 100644
--- a/src/dynamics/ccd/toi_entry.rs
+++ b/src/dynamics/ccd/toi_entry.rs
@@ -56,14 +56,14 @@ impl TOIEntry {
return None;
}
- let linvel1 =
- frozen1.is_none() as u32 as Real * rb1.map(|b| b.vels.linvel).unwrap_or(na::zero());
- let linvel2 =
- frozen2.is_none() as u32 as Real * rb2.map(|b| b.vels.linvel).unwrap_or(na::zero());
- let angvel1 =
- frozen1.is_none() as u32 as Real * rb1.map(|b| b.vels.angvel).unwrap_or(na::zero());
- let angvel2 =
- frozen2.is_none() as u32 as Real * rb2.map(|b| b.vels.angvel).unwrap_or(na::zero());
+ let linvel1 = frozen1.is_none() as u32 as Real
+ * rb1.map(|b| b.integrated_vels.linvel).unwrap_or(na::zero());
+ let linvel2 = frozen2.is_none() as u32 as Real
+ * rb2.map(|b| b.integrated_vels.linvel).unwrap_or(na::zero());
+ let angvel1 = frozen1.is_none() as u32 as Real
+ * rb1.map(|b| b.integrated_vels.angvel).unwrap_or(na::zero());
+ let angvel2 = frozen2.is_none() as u32 as Real
+ * rb2.map(|b| b.integrated_vels.angvel).unwrap_or(na::zero());
#[cfg(feature = "dim2")]
let vel12 = (linvel2 - linvel1).norm()
@@ -114,6 +114,20 @@ impl TOIEntry {
// because the colliders may be in a separating trajectory.
let stop_at_penetration = is_pseudo_intersection_test;
+ // let pos12 = motion_c1
+ // .position_at_time(start_time)
+ // .inv_mul(&motion_c2.position_at_time(start_time));
+ // let vel12 = linvel2 - linvel1;
+ // let res_toi = query_dispatcher
+ // .time_of_impact(
+ // &pos12,
+ // &vel12,
+ // co1.shape.as_ref(),
+ // co2.shape.as_ref(),
+ // end_time - start_time,
+ // )
+ // .ok();
+
let res_toi = query_dispatcher
.nonlinear_time_of_impact(
&motion_c1,
@@ -144,8 +158,8 @@ impl TOIEntry {
NonlinearRigidMotion::new(
rb.pos.position,
rb.mprops.local_mprops.local_com,
- rb.vels.linvel,
- rb.vels.angvel,
+ rb.integrated_vels.linvel,
+ rb.integrated_vels.angvel,
)
} else {
NonlinearRigidMotion::constant_position(rb.pos.next_position)