-
-
Notifications
You must be signed in to change notification settings - Fork 132
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
Physics Interpolation and Extrapolation #566
Conversation
Is there a reason this isn't enabled by default using the default physics plugin? I was making the switch from rapier to avian, and I had a problem with duplication and ghosting when moving on my 144Hz monitor. I thought it's bug in the physics engine, took me a while into rabbit holes until I found this was the solution. I'm giving you a perspective of someone who is new to all of this. If there is a reason to not turn it on by default, then it needs to be mentioned at the beginning of the guides, or troubleshooting section. |
I added the For now, I don't think interpolation should be on by default. Just looking at some prior art, it must be enabled manually in:
Interpolation does have a small overhead, and you might not want it enabled for absolutely everything. There are also some (small) caveats currently, see the Caveats section at the end of this PR's description. We can always reconsider the defaults in the future though once we get peoples' experiences with this and see if interpolation causes any issues in practice. I added an FAQ section to the docs for this though, good call :) |
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
PhysicsInterpolationPlugin
is included inPhysicsPlugins
by default, but the actual interpolation/extrapolation is opt-in.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.