123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- class_name CameraTracker
- extends Camera3D
- ## Track object in subject view
- @export var max_distance: float = 10
- @export var camera_height: float = 1
- var _tracked_node: Node3D
- func track(node: Node3D) -> void:
- _tracked_node = node
- func _process(_delta: float) -> void:
- if _tracked_node == null:
- return
- look_at(_tracked_node.get_global_position())
- _adjust_distance()
- func _adjust_distance() -> void:
- var target: Vector3 = _tracked_node.get_global_position()
- _adjust_max_distance_from(target)
- _adjust_min_distance_from(target)
- func _adjust_max_distance_from(target: Vector3) -> void:
- var current_distance: float = position.distance_to(target)
- if current_distance > max_distance:
- var diff: float = current_distance - max_distance
- position += transform.basis * Vector3.FORWARD * diff
- func _adjust_min_distance_from(target: Vector3) -> void:
- var target_height: float = target.y + camera_height
- if position.y < target_height:
- position.y = target_height
- func _on_focus_required(node: Node3D) -> void:
- track(node)
|