Parabola3DPath.cs 2.7 KB

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