gfolf2/src/ui/camera/tracking_camera/tracking_camera.gd

38 lines
1.1 KiB
GDScript3
Raw Normal View History

2024-11-03 16:50:44 -07:00
class_name TrackingCamera extends Camera3D
## Camera that tracks a target, maintaining a distance within parameters.
const ROTATION_ACCELERATION := 2.0
const POSITION_ACCELERATION := 4.0
@export var target: Node3D
@export var active := false
2024-11-03 16:50:44 -07:00
@export var min_distance := 0.5
@export var max_distance := 3.0
func _physics_process(delta: float) -> void:
if not active:
return
# Update position
var relative_position := global_position - target.global_position
var distance := relative_position.length()
if distance < min_distance:
global_position = global_position.lerp(
target.global_position + relative_position.normalized() * min_distance,
delta * POSITION_ACCELERATION
)
elif distance > max_distance:
global_position = global_position.lerp(
target.global_position + relative_position.normalized() * max_distance,
delta * POSITION_ACCELERATION
)
# Update rotation
var target_basis := (
Transform3D().looking_at(target.global_position - global_position, Vector3.UP).basis
)
global_basis = global_basis.slerp(target_basis, delta * ROTATION_ACCELERATION)