Table of Contents
src / world / world.gd
Attached Scenes
Code
extends Node3D
@export_node_path("Camera3D") var CameraNode : NodePath
func back_to_circular_move() -> void:
%AnimationPlayer.play('back_to_circular_move')
func focus_chapter(idx: int) -> void:
var anim_name = "focus_chapter_%s" % idx
var animation = %AnimationPlayer.get_animation(anim_name)
initialize_animation_camera_key(animation, 'position')
initialize_animation_camera_key(animation, 'rotation')
%AnimationPlayer.play(anim_name)
func zoom_chapter(idx: int) -> void:
var anim_name = "zoom_chapter_%s" % idx
%AnimationPlayer.play(anim_name)
func initialize_animation_camera_key(animation: Animation, key: String) -> void:
var track_idx = animation.find_track(
'%s:%s' % [CameraNode, key], Animation.TrackType.TYPE_VALUE)
var value = %Camera3D.get(key)
var goal = animation.track_get_key_value(track_idx, 1)
if key == 'rotation': value = smooth_rotation(value, goal)
animation.track_set_key_value(track_idx, 0, value)
func smooth_rotation(rot: Vector3, goal: Vector3) -> Vector3:
return Vector3(rot.x, acute_angle(rot.y, goal.y), rot.z)
func acute_angle(val: float, goal: float) -> float:
var delta = val - goal
if delta > PI: return val - 2*PI
elif delta < -PI: return val + 2*PI
else: return val
func _on_animation_player_animation_finished(anim_name: StringName) -> void:
match anim_name:
'opening': %AnimationPlayer.play('circular_move')
'back_to_circular_move': %AnimationPlayer.play('circular_move')
_: pass