Held objects preserve velocity when dropped

This commit is contained in:
Rob Kelly 2025-07-03 15:48:39 -06:00
parent 468c5b0d7c
commit b7843659fa

View File

@ -23,6 +23,8 @@ var _original_damping: float
var _original_collision_layer: int var _original_collision_layer: int
var _original_collision_mask: int var _original_collision_mask: int
var _linear_velocity := Vector3.ZERO
@onready var interact_ray: RayCast3D = %InteractRay @onready var interact_ray: RayCast3D = %InteractRay
@onready var hold_point: Marker3D = %HoldPoint @onready var hold_point: Marker3D = %HoldPoint
@ -45,7 +47,9 @@ func drop() -> void:
_held_object.linear_damp = _original_damping _held_object.linear_damp = _original_damping
_held_object.collision_layer = _original_collision_layer _held_object.collision_layer = _original_collision_layer
_held_object.collision_mask = _original_collision_mask _held_object.collision_mask = _original_collision_mask
_held_object.linear_velocity = _linear_velocity
_held_object = null _held_object = null
_linear_velocity = Vector3.ZERO
func holding_object() -> bool: func holding_object() -> bool:
@ -72,8 +76,12 @@ func _physics_process(delta: float) -> void:
drop() drop()
return return
var held_object_last_position := _held_object.global_position
var weight := 1 - exp(-hold_accel * delta) var weight := 1 - exp(-hold_accel * delta)
_held_object.global_position = _held_object.global_position.lerp( _held_object.global_position = _held_object.global_position.lerp(
hold_point.global_position, weight hold_point.global_position, weight
) )
_held_object.global_basis = _held_object.global_basis.slerp(global_basis, weight) _held_object.global_basis = _held_object.global_basis.slerp(global_basis, weight)
_linear_velocity = (_held_object.global_position - held_object_last_position) / delta