MagicaPlaneCollider.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using UnityEngine;
  5. namespace MagicaCloth
  6. {
  7. /// <summary>
  8. /// 面コライダー
  9. /// トランスフォームのY+方向を面の法線として計算する
  10. /// </summary>
  11. [HelpURL("https://magicasoft.jp/magica-cloth-plane-collider/")]
  12. [AddComponentMenu("MagicaCloth/MagicaPlaneCollider")]
  13. public class MagicaPlaneCollider : ColliderComponent
  14. {
  15. //=========================================================================================
  16. public override ComponentType GetComponentType()
  17. {
  18. return ComponentType.PlaneCollider;
  19. }
  20. private void OnValidate()
  21. {
  22. if (Application.isPlaying)
  23. DataUpdate();
  24. }
  25. /// <summary>
  26. /// パーティクルのデータ更新処理
  27. /// </summary>
  28. internal override void DataUpdate()
  29. {
  30. base.DataUpdate();
  31. // localPos
  32. foreach (var c in particleDict.Values)
  33. {
  34. for (int i = 0; i < c.dataLength; i++)
  35. {
  36. MagicaPhysicsManager.Instance.Particle.SetLocalPos(c.startIndex + i, Center);
  37. }
  38. }
  39. }
  40. //=========================================================================================
  41. protected override ChunkData CreateColliderParticleReal(int teamId)
  42. {
  43. uint flag = 0;
  44. flag |= PhysicsManagerParticleData.Flag_Kinematic;
  45. flag |= PhysicsManagerParticleData.Flag_Collider;
  46. flag |= PhysicsManagerParticleData.Flag_Transform_Read_Pos;
  47. flag |= PhysicsManagerParticleData.Flag_Transform_Read_Rot;
  48. flag |= PhysicsManagerParticleData.Flag_Transform_Read_Base;
  49. flag |= PhysicsManagerParticleData.Flag_Plane;
  50. flag |= PhysicsManagerParticleData.Flag_Reset_Position;
  51. flag |= PhysicsManagerParticleData.Flag_Transform_Read_Local;
  52. var c = CreateParticle(
  53. flag,
  54. teamId, // team
  55. 0.0f, // depth
  56. 1.0f, // radius
  57. Center
  58. );
  59. if (c.IsValid())
  60. MagicaPhysicsManager.Instance.Team.AddCollider(teamId, c.startIndex);
  61. return c;
  62. }
  63. /// <summary>
  64. /// 指定座標に最も近い衝突点pと、中心軸からのpへの方向dirを返す。
  65. /// ※エディタ計算用
  66. /// </summary>
  67. /// <param name="pos"></param>
  68. /// <param name="p"></param>
  69. /// <param name="dir"></param>
  70. public override bool CalcNearPoint(Vector3 pos, out Vector3 p, out Vector3 dir, out Vector3 d, bool skinning)
  71. {
  72. dir = Vector3.zero;
  73. // 平面姿勢
  74. //var cpos = transform.position;
  75. var cpos = transform.TransformPoint(Center);
  76. // 平面法線
  77. var cdir = transform.up;
  78. // 平面法線に投影
  79. var v = pos - cpos;
  80. var gv = Vector3.Project(v, cdir);
  81. p = pos - gv;
  82. d = p;
  83. dir = gv.normalized;
  84. return Vector3.Dot(v, gv) <= 0.0f;
  85. }
  86. }
  87. }