From 97157c9423f3360c5e941b4065377689221014ae Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Fri, 26 Mar 2021 18:16:27 +0100 Subject: First working version of non-linear CCD based on single-substep motion-clamping. --- src_testbed/testbed.rs | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index bc5cd6c..0463da8 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -769,11 +769,38 @@ impl Testbed { } #[cfg(feature = "dim3")] - fn handle_special_event(&mut self, window: &mut Window, _event: Event) { + fn handle_special_event(&mut self, window: &mut Window, event: Event) { + use rapier::dynamics::RigidBodyBuilder; + use rapier::geometry::ColliderBuilder; + if window.is_conrod_ui_capturing_mouse() { return; } + match event.value { + WindowEvent::Key(Key::Space, Action::Release, _) => { + let cam_pos = self.graphics.camera().view_transform().inverse(); + let forward = cam_pos * -Vector::z(); + let vel = forward * 1000.0; + + let bodies = &mut self.harness.physics.bodies; + let colliders = &mut self.harness.physics.colliders; + + let collider = ColliderBuilder::cuboid(4.0, 2.0, 0.4).density(20.0).build(); + // let collider = ColliderBuilder::ball(2.0).density(1.0).build(); + let body = RigidBodyBuilder::new_dynamic() + .position(cam_pos) + .linvel(vel.x, vel.y, vel.z) + .ccd_enabled(true) + .build(); + + let body_handle = bodies.insert(body); + colliders.insert(collider, body_handle, bodies); + self.graphics.add(window, body_handle, bodies, colliders); + } + _ => {} + } + /* match event.value { WindowEvent::MouseButton(MouseButton::Button1, Action::Press, modifier) => { @@ -1454,6 +1481,20 @@ Hashes at frame: {} fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) { for pair in nf.contact_pairs() { for manifold in &pair.manifolds { + for contact in &manifold.data.solver_contacts { + let color = if contact.dist > 0.0 { + Point3::new(0.0, 0.0, 1.0) + } else { + Point3::new(1.0, 0.0, 0.0) + }; + + let p = contact.point; + let n = manifold.data.normal; + + use crate::engine::GraphicsWindow; + window.draw_graphics_line(&p, &(p + n * 0.4), &Point3::new(0.5, 1.0, 0.5)); + } + /* for pt in manifold.contacts() { let color = if pt.dist > 0.0 { Point3::new(0.0, 0.0, 1.0) @@ -1474,6 +1515,7 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) window.draw_graphics_line(&start, &(start + n * 0.4), &Point3::new(0.5, 1.0, 0.5)); window.draw_graphics_line(&start, &end, &color); } + */ } } } -- cgit 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_testbed/testbed.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 0463da8..404912e 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -24,7 +24,7 @@ use rapier::dynamics::{ use rapier::geometry::{ColliderHandle, ColliderSet, NarrowPhase}; #[cfg(feature = "dim3")] use rapier::geometry::{InteractionGroups, Ray}; -use rapier::math::{Isometry, Vector}; +use rapier::math::Vector; use rapier::pipeline::PhysicsHooks; #[cfg(all(feature = "dim2", feature = "other-backends"))] @@ -1478,16 +1478,10 @@ Hashes at frame: {} } } -fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) { +fn draw_contacts(window: &mut Window, nf: &NarrowPhase, _colliders: &ColliderSet) { for pair in nf.contact_pairs() { for manifold in &pair.manifolds { for contact in &manifold.data.solver_contacts { - let color = if contact.dist > 0.0 { - Point3::new(0.0, 0.0, 1.0) - } else { - Point3::new(1.0, 0.0, 0.0) - }; - let p = contact.point; let n = manifold.data.normal; -- cgit From d2ee6420538d7ee524f2096995d4f44fcfef4551 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 30 Mar 2021 17:08:51 +0200 Subject: CCD: take angular motion and penetration depth into account in various thresholds. --- src_testbed/testbed.rs | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 404912e..d8ac9e3 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -125,7 +125,6 @@ pub struct Testbed { nsteps: usize, camera_locked: bool, // Used so that the camera can remain the same before and after we change backend or press the restart button. plugins: Vec>, - hide_counters: bool, // persistant_contacts: HashMap, font: Rc, cursor_pos: Point2, @@ -185,7 +184,6 @@ impl Testbed { graphics, nsteps: 1, camera_locked: false, - hide_counters: true, // persistant_contacts: HashMap::new(), font: Font::default(), cursor_pos: Point2::new(0.0f32, 0.0), @@ -225,14 +223,6 @@ impl Testbed { self.state.can_grab_behind_ground = allow; } - pub fn hide_performance_counters(&mut self) { - self.hide_counters = true; - } - - pub fn show_performance_counters(&mut self) { - self.hide_counters = false; - } - pub fn integration_parameters_mut(&mut self) -> &mut IntegrationParameters { &mut self.harness.physics.integration_parameters } @@ -1342,14 +1332,6 @@ impl State for Testbed { for plugin in &mut self.plugins { plugin.run_callbacks(window, &mut self.harness.physics, &self.harness.state); } - - // if true { - // // !self.hide_counters { - // #[cfg(not(feature = "log"))] - // println!("{}", self.world.counters); - // #[cfg(feature = "log")] - // debug!("{}", self.world.counters); - // } } } @@ -1478,9 +1460,12 @@ Hashes at frame: {} } } -fn draw_contacts(window: &mut Window, nf: &NarrowPhase, _colliders: &ColliderSet) { +fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) { + use rapier::math::Isometry; + for pair in nf.contact_pairs() { for manifold in &pair.manifolds { + /* for contact in &manifold.data.solver_contacts { let p = contact.point; let n = manifold.data.normal; @@ -1488,7 +1473,7 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, _colliders: &ColliderSet use crate::engine::GraphicsWindow; window.draw_graphics_line(&p, &(p + n * 0.4), &Point3::new(0.5, 1.0, 0.5)); } - /* + */ for pt in manifold.contacts() { let color = if pt.dist > 0.0 { Point3::new(0.0, 0.0, 1.0) @@ -1509,7 +1494,6 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, _colliders: &ColliderSet window.draw_graphics_line(&start, &(start + n * 0.4), &Point3::new(0.5, 1.0, 0.5)); window.draw_graphics_line(&start, &end, &color); } - */ } } } -- 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_testbed/testbed.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index d8ac9e3..a2d20d0 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1215,18 +1215,18 @@ impl State for Testbed { } } - if self - .state - .prev_flags - .contains(TestbedStateFlags::SUB_STEPPING) - != self.state.flags.contains(TestbedStateFlags::SUB_STEPPING) - { - self.harness - .physics - .integration_parameters - .return_after_ccd_substep = - self.state.flags.contains(TestbedStateFlags::SUB_STEPPING); - } + // if self + // .state + // .prev_flags + // .contains(TestbedStateFlags::SUB_STEPPING) + // != self.state.flags.contains(TestbedStateFlags::SUB_STEPPING) + // { + // self.harness + // .physics + // .integration_parameters + // .return_after_ccd_substep = + // self.state.flags.contains(TestbedStateFlags::SUB_STEPPING); + // } if self.state.prev_flags.contains(TestbedStateFlags::SHAPES) != self.state.flags.contains(TestbedStateFlags::SHAPES) -- cgit