PositionHelper.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using UnityEngine;
  2. namespace ETModel
  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 AngleToQuaternion(int angle)
  19. {
  20. return Quaternion.AngleAxis(-angle, Vector3.up) * Quaternion.AngleAxis(90, Vector3.up);
  21. }
  22. public static Quaternion GetVector3ToQuaternion(Vector3 source, Vector3 dire)
  23. {
  24. Vector3 nowPos = source;
  25. if (nowPos == dire)
  26. {
  27. return new Quaternion();
  28. }
  29. Vector3 direction = (dire - nowPos).normalized;
  30. return Quaternion.LookRotation(direction, Vector3.up);
  31. }
  32. public static float Distance2D(Unit u1, Unit u2)
  33. {
  34. Vector2 v1 = new Vector2(u1.Position.x, u1.Position.z);
  35. Vector2 v2 = new Vector2(u2.Position.x, u2.Position.z);
  36. return Vector2.Distance(v1, v2);
  37. }
  38. public static float Distance2D(Vector3 v1, Vector3 v2)
  39. {
  40. Vector2 d1 = new Vector2(v1.x, v1.z);
  41. Vector2 d2 = new Vector2(v2.x, v2.z);
  42. return Vector2.Distance(d1, d2);
  43. }
  44. public static Quaternion GetAngleToQuaternion(float angle)
  45. {
  46. return Quaternion.AngleAxis(-angle, Vector3.up) * Quaternion.AngleAxis(90, Vector3.up);
  47. }
  48. public static float Vector3ToAngle360(Vector3 from, Vector3 to)
  49. {
  50. float angle = Vector3.Angle(from, to);
  51. Vector3 cross = Vector3.Cross(from, to);
  52. return cross.y > 0? angle : 360 - angle;
  53. }
  54. /// <summary>
  55. /// 求点到直线的距离,采用数学公式Ax+By+C = 0; d = A*p.x + B * p.y + C / sqrt(A^2 + B ^ 2)
  56. /// </summary>
  57. /// <param name="startPoint"></param>
  58. /// <param name="endPoint"></param>
  59. /// <param name="point"></param>
  60. /// <returns></returns>
  61. public static float DistanceOfPointToVector(Vector3 startPoint, Vector3 endPoint, Vector3 point)
  62. {
  63. Vector2 startVe2 = startPoint.IgnoreYAxis();
  64. Vector2 endVe2 = endPoint.IgnoreYAxis();
  65. float A = endVe2.y - startVe2.y;
  66. float B = startVe2.x - endVe2.x;
  67. float C = endVe2.x * startVe2.y - startVe2.x * endVe2.y;
  68. float denominator = Mathf.Sqrt(A * A + B * B);
  69. Vector2 pointVe2 = point.IgnoreYAxis();
  70. return Mathf.Abs((A * pointVe2.x + B * pointVe2.y + C) / denominator); ;
  71. }
  72. /// <summary>
  73. /// 判断射线是否碰撞到球体,如果碰撞到,返回射线起点到碰撞点之间的距离
  74. /// </summary>
  75. /// <param name="ray"></param>
  76. /// <param name="center"></param>
  77. /// <param name="redius"></param>
  78. /// <param name="dist"></param>
  79. /// <returns></returns>
  80. public static bool RayCastSphere(Ray ray, Vector3 center, float redius, out float dist)
  81. {
  82. dist = 0;
  83. Vector3 ma = center - ray.origin;
  84. float distance = Vector3.Cross(ma, ray.direction).magnitude / ray.direction.magnitude;
  85. if (distance < redius)
  86. {
  87. float op = GGTheorem(Vector3.Distance(center, ray.origin), distance);
  88. float rp = GGTheorem(redius, distance);
  89. dist = op - rp;
  90. return true;
  91. }
  92. return false;
  93. }
  94. /// <summary>
  95. /// 勾股定理
  96. /// </summary>
  97. /// <param name="x"></param>
  98. /// <param name="y"></param>
  99. /// <returns></returns>
  100. public static float GGTheorem(float x, float y)
  101. {
  102. return Mathf.Sqrt(x * x + y * y);
  103. }
  104. /// <summary>
  105. /// 去掉三维向量的Y轴,把向量投射到xz平面。
  106. /// </summary>
  107. /// <param name="vector3"></param>
  108. /// <returns></returns>
  109. public static Vector2 IgnoreYAxis(this Vector3 vector3)
  110. {
  111. return new Vector2(vector3.x, vector3.z);
  112. }
  113. /// <summary>
  114. /// 判断目标点是否位于向量的左边
  115. /// </summary>
  116. /// <returns>True is on left, false is on right</returns>
  117. public static bool PointOnLeftSideOfVector(this Vector3 vector3, Vector3 originPoint, Vector3 point)
  118. {
  119. Vector2 originVec2 = originPoint.IgnoreYAxis();
  120. Vector2 pointVec2 = (point.IgnoreYAxis() - originVec2).normalized;
  121. Vector2 vector2 = vector3.IgnoreYAxis();
  122. float verticalX = originVec2.x;
  123. float verticalY = (-verticalX * vector2.x) / vector2.y;
  124. Vector2 norVertical = (new Vector2(verticalX, verticalY)).normalized;
  125. float dotValue = Vector2.Dot(norVertical, pointVec2);
  126. return dotValue < 0f;
  127. }
  128. }
  129. }