Skip to content

Instantly share code, notes, and snippets.

@Decapitated
Created August 23, 2025 22:30
Show Gist options
  • Select an option

  • Save Decapitated/492b82e0091e8d5ab72b47c71100cbe4 to your computer and use it in GitHub Desktop.

Select an option

Save Decapitated/492b82e0091e8d5ab72b47c71100cbe4 to your computer and use it in GitHub Desktop.
class_name SmoothFollow3D extends Node3D
@export var target : Node3D
@export var offset = Vector3(0, 0, 0)
@export var speed = 0.0
@export var cam_relative_offset = true
func _ready():
global_position = getPosition()
global_rotation = target.global_rotation
func _physics_process(delta):
var temp_lerp = 1.0 if speed == 0 else delta * speed
global_position = lerp(global_position, getPosition(), temp_lerp)
var current_rotation := global_transform.basis.get_rotation_quaternion()
var target_rotation := target.global_transform.basis.get_rotation_quaternion()
global_rotation = current_rotation.slerp(target_rotation, temp_lerp).get_euler()
# Get position with offset relative to cam basis
func getPosition():
var temp_basis = target.global_transform.basis
if cam_relative_offset:
var cam_right = get_viewport().get_camera_3d().global_transform.basis.x
var temp_forw = cam_right.cross(target.global_transform.basis.y)
temp_basis = Basis(cam_right, target.global_transform.basis.y, temp_forw)
return target.global_position + (temp_basis * offset)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment