Skip to content

Until MechanicalWorld::step is called, GeometricalWorld::interferences_with_point uses old collider positions #279

Open
@zachreizner

Description

@zachreizner

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 to interferences_with_point still seems to be using the old object's position until the next time step is called. I have tried both updating the collider position along with the body and using GeometricalWorld::sync_colliders, which has had no effect. Reading through the source of step, I have taken a few stabs in the dark on what will finally allow interferences_with_point to work (without actually calling step), culminating with this:

mech: DefaultMechanicalWorld<f32>,
geo: DefaultGeometricalWorld<f32>,
bodies: DefaultBodySet<f32>,
colliders: DefaultColliderSet<f32>,
joints: DefaultJointConstraintSet<f32>,
forces: DefaultForceGeneratorSet<f32>,
...
self.mech.maintain(&mut self.geo, &mut self.bodies, &mut self.colliders, &mut self.joints);
self.geo.clear_events();
self.geo.sync_colliders(&self.bodies, &mut self.colliders);
self.geo.perform_broad_phase(&self.colliders);
self.geo.perform_narrow_phase(&self.colliders);
self.colliders.foreach_mut(|_, c| c.clear_update_flags());

Still, this did not work. In the end, my workaround was this:

let old_timestep = self.mech.timestep();
self.mech.set_timestep(0.0);
self.mech.step(
    &mut self.geo,
    &mut self.bodies,
    &mut self.colliders,
    &mut self.joints,
    &mut self.forces,
);
self.mech.set_timestep(old_timestep);

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions