Fixed timestep interpolation gdscript addon for Godot 3.2
If you were wondering how to use that new function Engine.get_physics_interpolation_fraction()
in 3.2, feel free to use this as is, or to get ideas from for your own version.
If you find bugs / have suggestions, please add an issue to the issue tracker and I will look into it! :)
The smoothing addon adds 2 new nodes to Godot, 'Smoothing' (for 3d) and 'Smoothing2d' (for 2d). They allow for fixed timestep interpolation without writing any code. See here for an explanation of fixed timestep interpolation:
https://www.gamedev.net/blogs/entry/2265460-fixing-your-timestep-and-evaluating-godot/
https://www.youtube.com/watch?v=lWhHBAcH4sM
This repository contains the addon (in the addons folder) and an example demo project as a zip file. To examine the demo simply unzip it to a new folder, copy the addons folder into the demo project, and open it from Godot.
To use the addon in your own project:
- Create a new project in Godot or use an existing project.
- Copy the 'addons' folder from this repository to your Godot project folder.
- Go to 'Project Settings' plugins tab.
- Find the smoothing plugin and set status to 'Active'.
- You would usually in a game choose to create a Spatial, RigidBody, Kinematic body etc node for a game object, and have a visual representation (e.g. a MeshInstance) as a child of this node.
- Do this as normal so that you can see the object moving in the game.
- Add the new 'Smoothing' node to the scene.
- Drag the visual representation from being a child of the gameobject node, to being a child of the Smoothing node.
- The final step is to 'link' the Smoothing node to the gameobject, such that the gameobject is the target, which the smoothing node will follow.
- Do this by looking in the inspector panel for the Smoothing node, and select the 'Target' to be the gameobject node.
- That is mainly it! Just run the game and now hopefully the visual representation will follow the gameobject, but now with interpolation. You can test this is working by running at a low physics tick rate (physics_fps in project settings->physics).
The procedure for 2D is pretty much the same as with 3D except you would be using a node derived from Node2D as the gameobject (target) and the 'Smoothing2D' node should be used instead of 'Smoothing'.
The one special case when using smoothing nodes is the case when you want a target to instantaneously move from one location to another (for instance respawning a player, or at level start) where you do not want interpolation from the previous position. In this special case, you should move the target node (by setting the translation or position), and then call the 'teleport' function in the Smoothing node. This ensures that interpolation will be switched off temporarily for the move.
As well as choosing the Target, in the inspector for the Smoothing nodes there are a set of flags.
- enabled - chooses whether the smoothing node is active
- translate - interpolation will be done for the position
- basis - interpolation will be done for rotation and scale
- slerp - this will do quaternion slerping instead of the simpler basis lerping. Note that this only works with no scaling applied to the target.
- enabled - as above
- translate - as above
- rotate - interpolation of the node angle
- scale - interpolation of the node scale (x and y)
- global in - will read the global transform of the target instead of local
- global out - will set the global transform of the smoothing node instead of local
(in most cases local transform will be the best choice)
- Processing will also be turned off automatically for the smoothing nodes if they are hidden (either directly or through a parent).
- You can also set the target for the smoothing node from script, using the
set_target
function and passing a NodePath argument (e.g.mynode.get_path()
). - If you are using this addon (or indeed your own interpolation using
Engine.get_physics_interpolation_fraction()
), note that you should setProject Settings->Physics->Common->Physics Jitter Fix
to 0.0.
There is no need for JitterFix when using fixed timestep interpolation, indeed it may interfere with getting a good result.
Lawnjelly, Calinou
This addon is also available as a c++ module (slight differences), see: https://github.com/lawnjelly/godot-smooth