Advertisement
chris33556

rotation of object around another object

Dec 29th, 2023
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. extends KinematicBody
  2.  
  3. export var r = 1
  4. var theta = 0
  5. var dtheta = 2 * PI / 250
  6. var rotationLimit = PI # Set the limit to half a circle
  7. var boxA
  8. var boxB
  9. var stopping_distance = 1.0
  10. var velocity = Vector3.ZERO
  11. var move_speed = 3.0
  12.  
  13. var state = states.IDLE
  14.  
  15. enum states {
  16. IDLE
  17. SEEK
  18. ROTATE
  19. }
  20.  
  21. func _ready():
  22. boxA = get_node("../boxA")
  23. boxB = get_node("../boxB")
  24.  
  25. func _process(delta):
  26. rotateAround()
  27.  
  28. func rotateAround():
  29. match state:
  30. states.IDLE:
  31. var direction_to_player = get_node("../boxA").global_transform.origin - global_transform.origin
  32. var distance_to_player = direction_to_player.length()
  33. if distance_to_player < stopping_distance:
  34. velocity = Vector3.ZERO
  35. else:
  36. state = states.SEEK
  37.  
  38. states.SEEK:
  39. var direction_to_player = boxA.global_transform.origin - global_transform.origin
  40. var distance_to_player = direction_to_player.length()
  41. direction_to_player = direction_to_player.normalized()
  42.  
  43. if distance_to_player > stopping_distance:
  44. velocity = direction_to_player * move_speed
  45. move_and_slide(velocity)
  46. elif distance_to_player < stopping_distance:
  47. state = states.ROTATE
  48.  
  49. states.ROTATE:
  50. theta += dtheta
  51.  
  52. if theta <= rotationLimit:
  53. var cosTheta = cos(theta)
  54. var sinTheta = sin(theta)
  55.  
  56. boxB.transform.origin.x = boxA.global_transform.origin.x + r * cosTheta
  57. boxB.transform.origin.z = boxA.global_transform.origin.z + r * sinTheta
  58. boxB.transform.origin.y = boxA.global_transform.origin.y
  59. else:
  60. theta = rotationLimit # Stop the rotation at the limit
  61. state = states.IDLE
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement