-
-
Notifications
You must be signed in to change notification settings - Fork 121
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Until MechanicalWorld::step
is called, GeometricalWorld::interferences_with_point
uses old collider positions
#279
Comments
My workaround of using a timestep of After some false positives, I narrowed it to this chunk: bodies.foreach_mut(&mut |_, b: &mut dyn Body<N>| {
b.clear_forces();
b.validate_advancement();
}); I transplanted this into my sync with step function and it works! My theory is that even though I was setting the body and collider position to the new position, the old body position is temporarily cached and used to reset the attached collider position before the broad phase based point interference is run. The call to pub fn sync(&mut self) {
self.mech.maintain(&mut self.geo, &mut self.bodies, &mut self.colliders, &mut self.joints);
self.bodies.foreach_mut(&mut |_, b| {
b.validate_advancement();
});
self.geo.sync_colliders(&self.bodies, &mut self.colliders);
self.geo.perform_broad_phase(&self.colliders);
} I'm not sure if this is a supported use case or if it will continue to work, so it would be nice to get some input from a maintainer, but I'm basically happy with my solution. Thanks for taking a look. |
For context, I am writing a level editor that uses
interferences_with_point
to determine the entities the user are clicking on. When the user moves an entity, the underlying body's position is moved. However, the call tointerferences_with_point
still seems to be using the old object's position until the next timestep
is called. I have tried both updating the collider position along with the body and usingGeometricalWorld::sync_colliders
, which has had no effect. Reading through the source ofstep
, I have taken a few stabs in the dark on what will finally allowinterferences_with_point
to work (without actually callingstep
), culminating with this:Still, this did not work. In the end, my workaround was this:
This feels like a bit of a hack, especially in the presence of all those other functions which I expected to work, having read the source, but I am all out of leads.
Is there a specific algorithm that users of nphysics are supposed to use to ensure
interferences_with_point
is querying an up to date world, or is this perhaps a bug in the library?The text was updated successfully, but these errors were encountered: