Skip to content

Instantly share code, notes, and snippets.

@nezvers
Created May 21, 2024 22:27
Show Gist options
  • Save nezvers/575e786c1b498da392cf6bb9c01ab551 to your computer and use it in GitHub Desktop.
Save nezvers/575e786c1b498da392cf6bb9c01ab551 to your computer and use it in GitHub Desktop.
Spring delta time equation [Godot]
## Translated from EgoMoose tutorial of deriving formula for Unity
## https://youtu.be/FZekwtIO0I4
## https://gist.github.com/EgoMoose/777ed827e89b69d479ea407e79261b97
class_name SpringMath
extends Node
## zeta = damping ratio
## omega = angular frequency
static func vec1(value:float, target:float, velocity:float, delta:float, zeta:float = 0.3, omega:float = 20.0)->Array[float]:
if zeta >= 1:
return [target, velocity]
if zeta < 0:
zeta = 0.0
var x0:float = value - target
var omega_zeta:float = omega * zeta
var alpha:float = omega * sqrt(1.0 - zeta * zeta)
var _exp:float = exp(-delta * omega_zeta)
var _cos:float = cos(delta * alpha)
var _sin:float = sin(delta * alpha)
var c2:float = (velocity + x0 * omega_zeta) / alpha
var position:float = target + _exp * (x0 * _cos + c2 * _sin)
var _velocity:float = -_exp * ((x0 * omega_zeta - c2 * alpha) * _cos + (x0 * alpha + c2 * omega_zeta) * _sin)
return [position, _velocity]
## zeta = damping ratio
## omega = angular frequency
static func vec2(value:Vector2, target:Vector2, velocity:Vector2, delta:float, zeta:float = 0.3, omega:float = 20.0)->Array[Vector2]:
if zeta >= 1:
return [target, velocity]
if zeta < 0:
zeta = 0.0
var x0:Vector2 = value - target
var omega_zeta:float = omega * zeta
var alpha:float = omega * sqrt(1.0 - zeta * zeta)
var _exp:float = exp(-delta * omega_zeta)
var _cos:float = cos(delta * alpha)
var _sin:float = sin(delta * alpha)
var c2:Vector2 = (velocity + x0 * omega_zeta) / alpha
var position:Vector2 = target + _exp * (x0 * _cos + c2 * _sin)
var _velocity:Vector2 = -_exp * ((x0 * omega_zeta - c2 * alpha) * _cos + (x0 * alpha + c2 * omega_zeta) * _sin)
return [position, _velocity]
## zeta = damping ratio
## omega = angular frequency
static func vec3(value:Vector3, target:Vector3, velocity:Vector3, delta:float, zeta:float = 0.9, omega:float = 0.1)->Array[Vector3]:
if zeta >= 1:
return [target, velocity]
if zeta < 0:
zeta = 0.0
var x0:Vector3 = value - target
var omega_zeta:float = omega * zeta
var alpha:float = omega * sqrt(1.0 - zeta * zeta)
var _exp:float = exp(-delta * omega_zeta)
var _cos:float = cos(delta * alpha)
var _sin:float = sin(delta * alpha)
var c2:Vector3 = (velocity + x0 * omega_zeta) / alpha
var position:Vector3 = target + _exp * (x0 * _cos + c2 * _sin)
var _velocity:Vector3 = -_exp * ((x0 * omega_zeta - c2 * alpha) * _cos + (x0 * alpha + c2 * omega_zeta) * _sin)
return [position, _velocity]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment