DragJointFinger.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using UnityEngine;
  3. namespace COM3D2.MeidoPhotoStudio.Plugin
  4. {
  5. public class DragJointFinger : BaseDrag
  6. {
  7. private readonly TBody.IKCMO IK = new TBody.IKCMO();
  8. private readonly GameObject[] otherIK = new GameObject[3];
  9. private Transform[] ikChain;
  10. private Vector3[] jointRotation = new Vector3[2];
  11. private Vector3 off;
  12. private Vector3 off2;
  13. private bool baseFinger;
  14. public DragJointFinger Initialize(
  15. Transform[] ikChain, bool baseFinger,
  16. Meido meido, Func<Vector3> position, Func<Vector3> rotation)
  17. {
  18. base.Initialize(meido, position, rotation);
  19. this.ikChain = ikChain;
  20. this.baseFinger = baseFinger;
  21. InitializeIK();
  22. InitializeIK2();
  23. return this;
  24. }
  25. public void InitializeIK()
  26. {
  27. IK.Init(ikChain[upperArm], ikChain[foreArm], ikChain[hand], maid.body0);
  28. }
  29. private void InitializeIK2()
  30. {
  31. for (int i = 0; i < otherIK.Length; i++)
  32. {
  33. otherIK[i] = new GameObject();
  34. otherIK[i].transform.position = this.ikChain[i].position;
  35. otherIK[i].transform.localRotation = this.ikChain[i].localRotation;
  36. }
  37. }
  38. protected override void GetDragType()
  39. {
  40. if (Utility.GetModKey(Utility.ModKey.Shift))
  41. {
  42. CurrentDragType = DragType.RotLocalY;
  43. }
  44. else
  45. {
  46. CurrentDragType = DragType.None;
  47. }
  48. }
  49. protected override void InitializeDrag()
  50. {
  51. base.InitializeDrag();
  52. IKCtrlData ikData = maid.body0.IKCtrl.GetIKData("左手");
  53. off = transform.position - Camera.main.ScreenToWorldPoint(
  54. new Vector3(Input.mousePosition.x, Input.mousePosition.y, worldPoint.z)
  55. );
  56. off2 = new Vector3(
  57. transform.position.x - ikChain[hand].position.x,
  58. transform.position.y - ikChain[hand].position.y,
  59. transform.position.z - ikChain[hand].position.z
  60. );
  61. jointRotation[upperArmRot] = ikChain[upperArm].localEulerAngles;
  62. jointRotation[handRot] = ikChain[hand].localEulerAngles;
  63. InitializeIK();
  64. }
  65. protected override void Drag()
  66. {
  67. if (isPlaying) meido.IsStop = true;
  68. IKCtrlData ikData = maid.body0.IKCtrl.GetIKData("左手");
  69. Vector3 pos = Camera.main.ScreenToWorldPoint(
  70. new Vector3(Input.mousePosition.x, Input.mousePosition.y, worldPoint.z)
  71. ) + off - off2;
  72. if (CurrentDragType == DragType.None)
  73. {
  74. IK.Porc(ikChain[upperArm], ikChain[foreArm], ikChain[hand], pos, Vector3.zero, ikData);
  75. if (baseFinger)
  76. {
  77. jointRotation[handRot] = ikChain[hand].localEulerAngles;
  78. jointRotation[upperArmRot] = ikChain[upperArm].localEulerAngles;
  79. ikChain[upperArm].localEulerAngles = jointRotation[upperArm];
  80. ikChain[hand].localEulerAngles = jointRotation[handRot];
  81. }
  82. else
  83. {
  84. ikChain[hand].localEulerAngles = new Vector3(
  85. jointRotation[handRot].x, jointRotation[handRot].y, ikChain[hand].localEulerAngles.z
  86. );
  87. ikChain[upperArm].localEulerAngles = new Vector3(
  88. jointRotation[upperArmRot].x, jointRotation[upperArmRot].y, ikChain[upperArm].localEulerAngles.z
  89. );
  90. }
  91. }
  92. else
  93. {
  94. if (CurrentDragType == DragType.RotLocalY)
  95. {
  96. Vector3 vec31 = Input.mousePosition - mousePos;
  97. ikChain[upperArm].localEulerAngles = jointRotation[upperArmRot];
  98. ikChain[upperArm].localRotation = Quaternion.Euler(ikChain[upperArm].localEulerAngles)
  99. * Quaternion.AngleAxis((-vec31.x / 1.5f), Vector3.right);
  100. }
  101. }
  102. }
  103. }
  104. }