summaryrefslogtreecommitdiff
path: root/client/scripts/follow_camera.gd
blob: b49bdc2bc8d63cc3a52032a2ab7f02ae3ab64e13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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)