Advertisement
Guest User

Untitled

a guest
Mar 11th, 2023
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. # PHYSICS IMPLEMENTATION:
  3. # ========================
  4. func _physics_process(delta):
  5.     var obj = HeldObject.get_child(0)
  6.     if !obj:
  7.         return
  8.     _translate_held_object(obj)
  9.    
  10.    
  11. func _translate_held_object(obj):
  12.     var diff = HeldObject.global_position - obj.global_position
  13.     var dir = diff.normalized()
  14.     var dist =  diff.length()
  15.    
  16.     # If object gets too far away from HeldObject's position, drop it
  17.     if dist > RETURNING_MAX_DISTANCE:
  18.         drop()
  19.         return
  20.     else:
  21.         # This is spring motion, F = -kx
  22.         var returning_force = dir * dist * RETURNING_SPRING_CONSTANT
  23.         obj.apply_central_force(returning_force)   
  24.    
  25. # PICKUP/DROP IMPLEMENTATION:
  26. # ========================
  27.    
  28. func pickup(obj):
  29.     var abs_position = obj.global_position
  30.     var abs_rotation = obj.global_rotation
  31.    
  32.     # Add to node tree
  33.     obj.get_parent().remove_child(obj)
  34.     HeldObject.add_child(obj)
  35.     RayCast.add_exception(obj)
  36.     # Reset position
  37.    
  38.     # Keep object upright
  39.     obj.global_rotation = Vector3(0.0, abs_rotation.y, 0.0)
  40.     obj.axis_lock_angular_x = true
  41.     obj.axis_lock_angular_z = true
  42.    
  43.    
  44.     # Disable gravity while held
  45.     obj.gravity_scale = 0
  46.     # Add damping to avoid wobbling ("overdamped harmonic motion")
  47.     obj.linear_damp = RETURNING_DAMPING
  48.    
  49.    
  50. func drop():
  51.     var obj = HeldObject.get_child(0)
  52.     if obj:
  53.         var abs_position = obj.global_position
  54.         var abs_rotation = obj.global_rotation
  55.         # Remove from node tree
  56.         HeldObject.remove_child(obj)
  57.         get_parent().add_child(obj)
  58.         RayCast.remove_exception(obj)
  59.        
  60.         # Reset physics properties etc
  61.         obj.gravity_scale = 1.0
  62.         obj.linear_damp = 0.0
  63.         obj.angular_damp = 0.0
  64.         obj.axis_lock_angular_x = false
  65.         obj.axis_lock_angular_z = false
  66.        
  67.         # reset position
  68.         obj.global_position = abs_position
  69.         obj.global_rotation = abs_rotation
  70.        
  71.         # Give it a bit of forward velocity, like its been "thrown"
  72.         obj.linear_velocity += get_global_transform().basis.z * -THROW_SPEED
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement