Struct bevy_xpbd_3d::plugins::PhysicsPlugins
source · pub struct PhysicsPlugins { /* private fields */ }
Expand description
A plugin group containing all of Bevy XPBD’s plugins.
By default, the following plugins will be added:
PhysicsSetupPlugin
: Sets up the physics engine by initializing the necessary schedules, sets and resources.PreparePlugin
: Runs systems at the start of each physics frame; initializes rigid bodies and colliders and updates components.ColliderBackendPlugin
: Handles generic collider backend logic, like initializing colliders and AABBs and updating related components.BroadPhasePlugin
: Collects pairs of potentially colliding entities intoBroadCollisionPairs
using AABB intersection checks.NarrowPhasePlugin
: Computes contacts between entities and sends collision events.ContactReportingPlugin
: Sends collision events and updatesCollidingEntities
.IntegratorPlugin
: Integrates Newton’s 2nd law of motion, applying forces and moving entities according to their velocities.SolverPlugin
: Solves positional and angular constraints, updates velocities and solves velocity constraints (dynamic friction and restitution).SleepingPlugin
: Controls when bodies should be deactivated and marked asSleeping
to improve performance.SpatialQueryPlugin
: Handles spatial queries like raycasting and shapecasting.SyncPlugin
: KeepsPosition
andRotation
in sync withTransform
.PhysicsDebugPlugin
: Renders physics objects and events like AABBs and contacts for debugging purposes (only withdebug-plugin
feature enabled).
Refer to the documentation of the plugins for more information about their responsibilities and implementations.
You can also find more information regarding the engine’s general plugin architecture here.
§Custom schedule
You can run the PhysicsSchedule
in any schedule you want by specifying the schedule when adding the plugin group:
use bevy::prelude::*;
use bevy_xpbd_3d::prelude::*;
fn main() {
App::new()
.add_plugins((DefaultPlugins, PhysicsPlugins::new(FixedUpdate)))
.run();
}
Note that using FixedUpdate
with a fixed physics timestep can produce unexpected results due to two separate
fixed timesteps. However, using FixedUpdate
can be useful for networking usage
when you need to keep the client and server in sync.
§Custom plugins
First, create a new plugin. If you want to run your systems in the engine’s schedules, get either the PhysicsSchedule
or the SubstepSchedule
. Then you can add your systems to that schedule and control system ordering with
PhysicsSet
or SubstepSet
.
Here we will create a custom broad phase plugin that will replace the default BroadPhasePlugin
:
use bevy::prelude::*;
use bevy_xpbd_3d::{prelude::*, PhysicsSchedule, PhysicsStepSet};
pub struct CustomBroadPhasePlugin;
impl Plugin for CustomBroadPhasePlugin {
fn build(&self, app: &mut App) {
// Make sure the PhysicsSchedule is available
let physics_schedule = app
.get_schedule_mut(PhysicsSchedule)
.expect("add PhysicsSchedule first");
// Add the system into the broad phase system set
physics_schedule.add_systems(collect_collision_pairs.in_set(PhysicsStepSet::BroadPhase));
}
}
fn collect_collision_pairs() {
// Implementation goes here
}
Next, when creating your app, simply disable the default BroadPhasePlugin
and add your custom plugin:
use bevy::prelude::*;
use bevy_xpbd_3d::prelude::*;
fn main() {
let mut app = App::new();
app.add_plugins(DefaultPlugins);
// Add PhysicsPlugins and replace default broad phase with our custom broad phase
app.add_plugins(
PhysicsPlugins::default()
.build()
.disable::<BroadPhasePlugin>()
.add(CustomBroadPhasePlugin),
);
app.run();
}
You can find a full working example here.
Implementations§
source§impl PhysicsPlugins
impl PhysicsPlugins
sourcepub fn new(schedule: impl ScheduleLabel) -> Self
pub fn new(schedule: impl ScheduleLabel) -> Self
Creates a PhysicsPlugins
plugin group using the given schedule for running the PhysicsSchedule
.
The default schedule is PostUpdate
.
Trait Implementations§
source§impl Default for PhysicsPlugins
impl Default for PhysicsPlugins
source§impl PluginGroup for PhysicsPlugins
impl PluginGroup for PhysicsPlugins
Auto Trait Implementations§
impl !RefUnwindSafe for PhysicsPlugins
impl Send for PhysicsPlugins
impl Sync for PhysicsPlugins
impl Unpin for PhysicsPlugins
impl !UnwindSafe for PhysicsPlugins
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
T
[ShaderType
] for self
. When used in [AsBindGroup
]
derives, it is safe to assume that all images in self
exist.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Self
using data from the given [World
].§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.