generated from krampus/template-godot4
38 lines
1.1 KiB
GDScript
38 lines
1.1 KiB
GDScript
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
|
|
|
|
@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)
|