Advertisement
Miziziziz

fake 3 joint ik second obf

Jun 9th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 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.  
  32. var total_dist = len_upper + len_middle + len_lower
  33.  
  34. var dummy_side_len = (len_lower + len_middle) * clamp(dis_to_tar / total_dist, 0, 1.0)
  35.  
  36. var base_angles = SSS_calc(len_upper, dummy_side_len, dis_to_tar)
  37. var next_angles = SSS_calc(len_middle, len_lower, dummy_side_len)
  38. #print(base_angles)
  39. global_rotation = base_angles[0] + base_r
  40. joint0.rotation = base_angles[1] + next_angles[0]
  41. joint1.rotation = next_angles[1]
  42. update()
  43.  
  44. func SSS_calc(side_a, side_b, side_c):
  45.  
  46. if side_c >= side_a + side_b:
  47. return [0, 0, 0]
  48.  
  49. var angle_a = law_of_cos(side_c, side_a, side_b)
  50. var angle_b = (law_of_cos(side_a, side_b, side_c) + PI)
  51. var angle_c = 2 * PI - angle_a - angle_b
  52.  
  53. return [angle_a, angle_b, angle_c]
  54.  
  55.  
  56. func law_of_cos(a, b, c):
  57. return acos( (a * a + b * b - c * c) / ( 2 * a * b) )
  58.  
  59. func _draw():
  60. var color = Color(1, 1, 1)
  61. var joint_size = 4
  62. var line_size = 3
  63. var f_pos = Vector2(0, 0)
  64. var s_pos = joint0.position
  65. var e_pos = to_local(joint1.global_position)
  66. var h_pos = to_local(hand.global_position)
  67. draw_circle(f_pos, joint_size, color)
  68. draw_circle(s_pos, joint_size, color)
  69. draw_circle(e_pos, joint_size, color)
  70. draw_circle(h_pos, joint_size, color)
  71. draw_line(f_pos, s_pos, color, line_size)
  72. draw_line(s_pos, e_pos, color, line_size)
  73. draw_line(h_pos, e_pos, color, line_size)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement