Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # PHYSICS IMPLEMENTATION:
- # ========================
- func _physics_process(delta):
- var obj = HeldObject.get_child(0)
- if !obj:
- return
- _translate_held_object(obj)
- func _translate_held_object(obj):
- var diff = HeldObject.global_position - obj.global_position
- var dir = diff.normalized()
- var dist = diff.length()
- # If object gets too far away from HeldObject's position, drop it
- if dist > RETURNING_MAX_DISTANCE:
- drop()
- return
- else:
- # This is spring motion, F = -kx
- var returning_force = dir * dist * RETURNING_SPRING_CONSTANT
- obj.apply_central_force(returning_force)
- # PICKUP/DROP IMPLEMENTATION:
- # ========================
- func pickup(obj):
- var abs_position = obj.global_position
- var abs_rotation = obj.global_rotation
- # Add to node tree
- obj.get_parent().remove_child(obj)
- HeldObject.add_child(obj)
- RayCast.add_exception(obj)
- # Reset position
- # Keep object upright
- obj.global_rotation = Vector3(0.0, abs_rotation.y, 0.0)
- obj.axis_lock_angular_x = true
- obj.axis_lock_angular_z = true
- # Disable gravity while held
- obj.gravity_scale = 0
- # Add damping to avoid wobbling ("overdamped harmonic motion")
- obj.linear_damp = RETURNING_DAMPING
- func drop():
- var obj = HeldObject.get_child(0)
- if obj:
- var abs_position = obj.global_position
- var abs_rotation = obj.global_rotation
- # Remove from node tree
- HeldObject.remove_child(obj)
- get_parent().add_child(obj)
- RayCast.remove_exception(obj)
- # Reset physics properties etc
- obj.gravity_scale = 1.0
- obj.linear_damp = 0.0
- obj.angular_damp = 0.0
- obj.axis_lock_angular_x = false
- obj.axis_lock_angular_z = false
- # reset position
- obj.global_position = abs_position
- obj.global_rotation = abs_rotation
- # Give it a bit of forward velocity, like its been "thrown"
- obj.linear_velocity += get_global_transform().basis.z * -THROW_SPEED
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement