Parabola3DPath.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using CombatLibrary.CombatLibrary.CombatCore.Utility;
  2. using Fort23.Core;
  3. using UnityEngine;
  4. namespace Core.Utility
  5. {
  6. public class Parabola3DPath : CObject
  7. {
  8. public Vector3 startPos;
  9. public Vector3 targetPos;
  10. public float gravity = 9.8f;
  11. public Vector3 initialVelocity; // 物体的初始速度
  12. public float totalFlightTime;
  13. public float addY;
  14. public Parabola3DPath()
  15. {
  16. }
  17. public Parabola3DPath(Vector3 startPos, Vector3 targetPos)
  18. {
  19. SetPos(startPos, targetPos);
  20. }
  21. public void SetPos(Vector3 startPos, Vector3 targetPos)
  22. {
  23. this.startPos = startPos;
  24. this.targetPos = targetPos;
  25. CalculateInitialVelocity();
  26. }
  27. // 计算发射物体的初始速度和飞行时间
  28. void CalculateInitialVelocity()
  29. {
  30. Vector3 startPosition = startPos;
  31. Vector3 targetPosition = targetPos;
  32. // 计算目标的水平距离和垂直高度差
  33. float deltaX = targetPosition.x - startPosition.x;
  34. float deltaY = targetPosition.y - startPosition.y;
  35. float deltaZ = targetPosition.z - startPosition.z;
  36. // 计算水平距离(包括 X 和 Z 轴)
  37. float horizontalDistance = Mathf.Sqrt(deltaX * deltaX + deltaZ * deltaZ);
  38. // 计算飞行所需的时间
  39. totalFlightTime = CalculateFlightTime(horizontalDistance+addY, deltaY);
  40. // 计算发射的初速度
  41. initialVelocity = CalculateInitialVelocityVector(deltaX, deltaZ, deltaY, totalFlightTime);
  42. }
  43. // 计算飞行时间
  44. float CalculateFlightTime(float horizontalDistance, float deltaY)
  45. {
  46. // 使用物理公式来计算飞行时间:竖直分量的运动方程
  47. // time = sqrt(2 * (deltaY + horizontalDistance * tan(45))) / gravity
  48. float time = Mathf.Sqrt((2 * (deltaY + horizontalDistance * Mathf.Tan(Mathf.Deg2Rad * 45f))) / gravity);
  49. return time;
  50. }
  51. // 计算初速度向量
  52. Vector3 CalculateInitialVelocityVector(float deltaX, float deltaZ, float deltaY, float timeToTarget)
  53. {
  54. // 计算水平速度分量
  55. float v_x = deltaX / timeToTarget; // X轴速度
  56. float v_z = deltaZ / timeToTarget; // Z轴速度
  57. // 垂直速度
  58. float v_y = (deltaY + 0.5f * gravity * timeToTarget * timeToTarget) / timeToTarget;
  59. // 初速度向量
  60. Vector3 velocity = new Vector3(v_x, v_y, v_z);
  61. return velocity;
  62. }
  63. public Vector3 GetPositionAtTime(float t)
  64. {
  65. t = t * totalFlightTime;
  66. if (t > totalFlightTime)
  67. {
  68. t = totalFlightTime;
  69. }
  70. // 计算每个轴的位移
  71. float deltaX = initialVelocity.x * t;
  72. float deltaY = initialVelocity.y * t - 0.5f * gravity * t * t;
  73. float deltaZ = initialVelocity.z * t;
  74. // 返回当前位置
  75. return new Vector3(startPos.x + deltaX, startPos.y + deltaY, startPos.z + deltaZ);
  76. }
  77. public override void ActiveObj()
  78. {
  79. }
  80. public override void DormancyObj()
  81. {
  82. }
  83. }
  84. }