diff options
Diffstat (limited to 'client/scripts/follow_camera.gd')
-rw-r--r-- | client/scripts/follow_camera.gd | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/client/scripts/follow_camera.gd b/client/scripts/follow_camera.gd new file mode 100644 index 00000000..b49bdc2b --- /dev/null +++ b/client/scripts/follow_camera.gd @@ -0,0 +1,38 @@ +class_name FollowCamera +extends Camera3D + +const ROTATE_SPEED: float = 1.5 +const ROTATE_WEIGHT: float = 8.0 +const LOOK_WEIGHT: float = 8.0 +const MOVE_WEIGHT: float = 2.0 + +@export var target: Node3D + +var angle_target: float = 0 +var angle: float = 0 +var ground: Vector3 + +func _ready(): + if target == null: + push_warning("target is not set") + else: + ground = target.position + +func _process(delta): + if target != null: + follow(delta) + +func follow(delta): + var new_transform = transform.looking_at(target.position) + + transform.basis = transform.basis.from_euler(Vector3( + lerp_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT), + lerp_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT), + lerp_angle(transform.basis.get_euler().z, new_transform.basis.get_euler().z, delta * LOOK_WEIGHT) + )) + + angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta + angle = lerp_angle(angle, angle_target, delta * ROTATE_WEIGHT) + + ground = ground.lerp(target.position, delta * MOVE_WEIGHT) + position = ground + Vector3(0, 7.5, 7.5).rotated(Vector3.UP, angle) |