Advertisement
Miziziziz

leg ik

Jun 18th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. tool
  2. extends Node2D
  3.  
  4. onready var joint0 = $Joint0
  5. onready var joint1 = $Joint0/Joint1
  6. onready var hand = $Joint0/Joint1/Hand
  7.  
  8. var len_upper = 0
  9. var len_middle = 0
  10. var len_lower = 0
  11.  
  12. func _ready():
  13. update_limb()
  14.  
  15. func update_limb():
  16. joint0 = $Joint0
  17. joint1 = $Joint0/Joint1
  18. hand = $Joint0/Joint1/Hand
  19. len_upper = joint0.position.x
  20. len_middle = joint1.position.x
  21. len_lower = hand.position.x
  22.  
  23. func _process(delta):
  24. if Engine.is_editor_hint():
  25. update_limb()
  26.  
  27. var t_pos = get_global_mouse_position()
  28. var diff = t_pos - global_position
  29. var dis_to_tar = diff.length()
  30. var base_r = atan2(diff.y, diff.x)
  31. var total_dist = len_upper + len_middle + len_lower
  32.  
  33. var param = 0.2
  34. var dummy_side_len = (len_upper + len_middle) * clamp(dis_to_tar / total_dist, 0, 1.0)
  35. var max_angle = deg2rad(90)
  36.  
  37. var base_angles = SSS_calc(dummy_side_len, len_lower, dis_to_tar)
  38. var next_angles = SSS_calc(len_upper, len_middle, dummy_side_len)
  39.  
  40. #if base_angles[0] > max_angle:
  41. # return
  42.  
  43. global_rotation = base_angles[0] + next_angles[0] + base_r
  44. joint0.rotation = next_angles[1]
  45. joint1.rotation = base_angles[1] + next_angles[2]
  46.  
  47. """
  48. var angles1 = SSS_calc(len_upper + len_middle, len_lower, dis_to_tar)
  49. var angles2 = SSS_calc(len_upper, len_middle + len_lower, dis_to_tar)
  50. global_rotation = base_r + angles1[0] * param + angles2[0] * param
  51. joint0.rotation = PI - angles2[1] * param
  52. joint1.rotation = PI - angles1[1] * param
  53. """
  54.  
  55.  
  56. update()
  57.  
  58. func SSS_calc(side_a, side_b, side_c):
  59. if side_c >= side_a + side_b:
  60. return [0, 0, 0]
  61.  
  62. var angle_a = law_of_cos(side_c, side_a, side_b)
  63. var angle_b = (law_of_cos(side_a, side_b, side_c) + PI)
  64. var angle_c = 2 * PI - angle_a - angle_b
  65.  
  66. return [angle_a, angle_b, angle_c]
  67.  
  68.  
  69. func law_of_cos(a, b, c):
  70. return acos( (a * a + b * b - c * c) / ( 2 * a * b) )
  71.  
  72. func _draw():
  73. var color = Color(1, 1, 1)
  74. var joint_size = 4
  75. var line_size = 3
  76. var f_pos = Vector2(0, 0)
  77. var s_pos = joint0.position
  78. var e_pos = to_local(joint1.global_position)
  79. var h_pos = to_local(hand.global_position)
  80. draw_circle(f_pos, joint_size, color)
  81. draw_circle(s_pos, joint_size, color)
  82. draw_circle(e_pos, joint_size, color)
  83. draw_circle(h_pos, joint_size, color)
  84. draw_line(f_pos, s_pos, color, line_size)
  85. draw_line(s_pos, e_pos, color, line_size)
  86. draw_line(h_pos, e_pos, color, line_size)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement