aboutsummaryrefslogtreecommitdiff
path: root/client/scripts/follow_camera.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/scripts/follow_camera.gd')
-rw-r--r--client/scripts/follow_camera.gd38
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)