Parabola3DPath.cs 3.2 KB

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