2024-11-04 15:15:59 -07:00
|
|
|
class_name OrbitalCamera extends Node3D
|
|
|
|
|
|
|
|
const POSITION_ACCELERATION := 4.0
|
|
|
|
|
|
|
|
@export var target: Node3D
|
2024-11-10 17:59:44 -07:00
|
|
|
@export var offset := Vector3(0, 1, 0)
|
2024-11-04 15:15:59 -07:00
|
|
|
|
2024-11-09 16:26:15 -07:00
|
|
|
@export var angular_speed := 0.007
|
2024-11-04 15:15:59 -07:00
|
|
|
|
|
|
|
@onready var camera: Camera3D = %Camera
|
|
|
|
|
|
|
|
static var scene := preload("res://src/player/orbital_camera/orbital_camera.tscn")
|
|
|
|
|
|
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
|
|
# Update position
|
2024-11-10 17:59:44 -07:00
|
|
|
global_position = global_position.lerp(
|
|
|
|
target.global_position + offset, delta * POSITION_ACCELERATION
|
|
|
|
)
|
2024-11-04 15:15:59 -07:00
|
|
|
|
|
|
|
# Update rotation
|
|
|
|
camera.look_at(target.global_position)
|
|
|
|
|
|
|
|
# Update phase angle
|
|
|
|
rotation.y += angular_speed
|
|
|
|
|
|
|
|
|
|
|
|
static func create(_target: Node3D) -> OrbitalCamera:
|
|
|
|
var instance: OrbitalCamera = scene.instantiate()
|
|
|
|
instance.target = _target
|
|
|
|
return instance
|