PositionHelper.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using UnityEngine;
  2. namespace ET
  3. {
  4. public static class PositionHelper
  5. {
  6. public static Vector3 RayCastV2ToV3(Vector2 pos)
  7. {
  8. return new Vector3(pos.x, 0, pos.y);
  9. }
  10. public static Vector3 RayCastXYToV3(float x, float y)
  11. {
  12. return new Vector3(x, 0, y);
  13. }
  14. public static Vector3 RayCastV3ToV3(Vector3 pos)
  15. {
  16. return new Vector3(pos.x, 0, pos.z);
  17. }
  18. public static Quaternion GetVector3ToQuaternion(Vector3 source, Vector3 dire)
  19. {
  20. Vector3 nowPos = source;
  21. if (nowPos == dire)
  22. {
  23. return new Quaternion();
  24. }
  25. Vector3 direction = (dire - nowPos).normalized;
  26. return Quaternion.LookRotation(direction, Vector3.up);
  27. }
  28. public static float Distance2D(Unit u1, Unit u2)
  29. {
  30. Vector2 v1 = new Vector2(u1.Position.x, u1.Position.z);
  31. Vector2 v2 = new Vector2(u2.Position.x, u2.Position.z);
  32. return Vector2.Distance(v1, v2);
  33. }
  34. public static float Distance2D(Vector3 v1, Vector3 v2)
  35. {
  36. Vector2 d1 = new Vector2(v1.x, v1.z);
  37. Vector2 d2 = new Vector2(v2.x, v2.z);
  38. return Vector2.Distance(d1, d2);
  39. }
  40. public static float Vector3ToAngle360(Vector3 from, Vector3 to)
  41. {
  42. float angle = Vector3.Angle(from, to);
  43. Vector3 cross = Vector3.Cross(from, to);
  44. return cross.y > 0? angle : 360 - angle;
  45. }
  46. /// <summary>
  47. /// 求点到直线的距离,采用数学公式Ax+By+C = 0; d = A*p.x + B * p.y + C / sqrt(A^2 + B ^ 2)
  48. /// </summary>
  49. /// <param name="startPoint"></param>
  50. /// <param name="endPoint"></param>
  51. /// <param name="point"></param>
  52. /// <returns></returns>
  53. public static float DistanceOfPointToVector(Vector3 startPoint, Vector3 endPoint, Vector3 point)
  54. {
  55. Vector2 startVe2 = startPoint.IgnoreYAxis();
  56. Vector2 endVe2 = endPoint.IgnoreYAxis();
  57. float A = endVe2.y - startVe2.y;
  58. float B = startVe2.x - endVe2.x;
  59. float C = endVe2.x * startVe2.y - startVe2.x * endVe2.y;
  60. float denominator = Mathf.Sqrt(A * A + B * B);
  61. Vector2 pointVe2 = point.IgnoreYAxis();
  62. return Mathf.Abs((A * pointVe2.x + B * pointVe2.y + C) / denominator);
  63. }
  64. /// <summary>
  65. /// 勾股定理
  66. /// </summary>
  67. /// <param name="x"></param>
  68. /// <param name="y"></param>
  69. /// <returns></returns>
  70. public static float GGTheorem(float x, float y)
  71. {
  72. return Mathf.Sqrt(x * x + y * y);
  73. }
  74. /// <summary>
  75. /// 去掉三维向量的Y轴,把向量投射到xz平面。
  76. /// </summary>
  77. /// <param name="vector3"></param>
  78. /// <returns></returns>
  79. public static Vector2 IgnoreYAxis(this Vector3 vector3)
  80. {
  81. return new Vector2(vector3.x, vector3.z);
  82. }
  83. /// <summary>
  84. /// 判断目标点是否位于向量的左边
  85. /// </summary>
  86. /// <returns>True is on left, false is on right</returns>
  87. public static bool PointOnLeftSideOfVector(this Vector3 vector3, Vector3 originPoint, Vector3 point)
  88. {
  89. Vector2 originVec2 = originPoint.IgnoreYAxis();
  90. Vector2 pointVec2 = (point.IgnoreYAxis() - originVec2).normalized;
  91. Vector2 vector2 = vector3.IgnoreYAxis();
  92. float verticalX = originVec2.x;
  93. float verticalY = (-verticalX * vector2.x) / vector2.y;
  94. Vector2 norVertical = (new Vector2(verticalX, verticalY)).normalized;
  95. float dotValue = Vector2.Dot(norVertical, pointVec2);
  96. return dotValue < 0f;
  97. }
  98. }
  99. }