Physics Interpolation and Extrapolation #566
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Objective
Closes #444.
To produce frame rate independent behavior and deterministic results, Avian runs at a fixed timestep in
FixedPostUpdate
by default. However, this can often lead to visual stutter when the fixed timestep does not match the display refresh rate, especially at low physics tick rates.Avian should support
Transform
interpolation to visually smooth out movement in between fixed timesteps.Solution
Add a
PhysicsInterpolationPlugin
powered by my new cratebevy_transform_interpolation
! It supports:A new
interpolation
example has been added to demonstrate the new interpolation and extrapolation functionality.interpolation.mp4
Note: You can see that restitution doesn't work as well for low tick rates; this is expected.
Overview
To enable interpolation/extrapolation functionality, add the
PhysicsInterpolationPlugin
:Interpolation and extrapolation can be enabled for individual entities using the
TransformInterpolation
andTransformExtrapolation
components respectively:Now, any changes made to the
Transform
of the entity inFixedPreUpdate
,FixedUpdate
, orFixedPostUpdate
will automatically be smoothed in between fixed timesteps.Transform properties can also be interpolated individually by adding the
TranslationInterpolation
,RotationInterpolation
, andScaleInterpolation
components, and similarly for extrapolation.If you want all rigid bodies to be interpolated or extrapolated by default, you can use
PhysicsInterpolationPlugin::interpolate_all()
orPhysicsInterpolationPlugin::extrapolate_all()
:When interpolation or extrapolation is enabled for all entities by default, you can still opt out of it for individual entities by adding the
NoTransformEasing
component, or the individualNoTranslationEasing
,NoRotationEasing
, andNoScaleEasing
components.Note that changing
Transform
manually in any schedule that doesn't use a fixed timestep is also supported, but it is equivalent to teleporting, and disables interpolation for the entity for the remainder of that fixed timestep.Caveats
big_space
should sort of work withbevy_transform_interpolation
, but transitions between grid cells aren't eased correctly. Avian itself doesn't supportbig_space
yet either, but it's something to keep in mind. This should be fixable on thebevy_transform_interpolation
side.bevy_transform_interpolation
technically stores duplicate position data, since we could use the existingPosition
andRotation
components for the current "gameplay transform". However, these physics components are in global space whileTransform
isn't, which could complicate hierarchies. For now, I chose to accept this small amount of duplication; if it is an issue, we could makebevy_transform_interpolation
accept arbitrary "position sources" similar to the "velocity sources" it already has.Note
This PR should probably not be merged yet, as
bevy_transform_interpolation
hasn't been released on crates.io yet, and this PR is also depending on a branch that is blocked on either Bevy 0.15 or a new RC releasing. I will merge this for the upcoming Avian release though.