In gameplay camera, distinguish turning lerp speed from righting lerp speed. Reduce righting lerp speed.

This commit is contained in:
blujai831 2025-04-04 17:56:35 -07:00
parent 27196f752a
commit 7314d5081a
No known key found for this signature in database
GPG Key ID: DDC31A0363AA5E66
1 changed files with 11 additions and 5 deletions

View File

@ -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,