From 7314d5081a6b6e3dd91b6b73621065ef1beb80cb Mon Sep 17 00:00:00 2001 From: blujai831 Date: Fri, 4 Apr 2025 17:56:35 -0700 Subject: [PATCH] In gameplay camera, distinguish turning lerp speed from righting lerp speed. Reduce righting lerp speed. --- vfx/gameplay_camera.gd | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/vfx/gameplay_camera.gd b/vfx/gameplay_camera.gd index 7bf4840..00d04de 100644 --- a/vfx/gameplay_camera.gd +++ b/vfx/gameplay_camera.gd @@ -9,6 +9,7 @@ class_name GameplayCamera extends Camera3D @export var allow_losing_target := false @export var follow_lerp_speed: float = 0.99 @export var turn_lerp_speed: float = 1.0 +@export var up_lerp_speed: float = 0.99 @export var fov_lerp_speed: float = 0.999 @export var clip_margin: float = 0.5 @export var gimbal_margin: float = 0.75 @@ -22,6 +23,7 @@ class_name GameplayCamera extends Camera3D @export var analog_zoom_sensitivity: float = 1.0 var target_direction := Vector3.ZERO +var target_up := Vector3.UP var look_impetus := Vector3.ZERO var look_velocity := Vector3.ZERO @@ -135,12 +137,12 @@ func _try_go(where: Vector3) -> void: func snap_to_target() -> void: if !target: return target_direction = ( - -target.global_basis.z - target.global_basis.y/2.0 + -target.global_basis.z - target_up/2.0 ).normalized() _follow_target(0.0, true) func _gimbal_check() -> float: - return target_direction.dot(target.global_basis.y) + return target_direction.dot(target_up) func _follow_target( delta: float, @@ -155,11 +157,11 @@ func _follow_target( top_speed = (target as Character).get_top_speed() var decentering: float = target_distance*target_decentering_factor var leveling := ( - target_leveling_bias*velocity.project(target.global_basis.y) + target_leveling_bias*velocity.project(target_up) )*delta var target_position := ( target.global_position + - decentering*target.global_basis.y + + decentering*target_up + velocity*delta + leveling ) @@ -172,9 +174,13 @@ func _follow_target( 1.0 - (1.0 - follow_lerp_speed)**delta )) if !is_zero_approx(1.0 - abs(_gimbal_check())): + target_up = target_up.slerp( + target.global_basis.y, + 1.0 - (1.0 - up_lerp_speed)**delta + ).normalized() var desired_basis := Basis.looking_at( target_offset - leveling, - target.global_basis.y + target_up ) global_basis = desired_basis if snap else global_basis.slerp( desired_basis,