Skip to content

Instantly share code, notes, and snippets.

@MerlinTwi
Created August 15, 2018 11:51
Show Gist options
  • Select an option

  • Save MerlinTwi/b937b91623173518fdb70687cf2c572f to your computer and use it in GitHub Desktop.

Select an option

Save MerlinTwi/b937b91623173518fdb70687cf2c572f to your computer and use it in GitHub Desktop.
Полет снаряда по параболической траектории
/// <summary>
/// Расчет угла выстрела для движения снаряда по параболической траектории
/// From: https://www.habrador.com/tutorials/unity-realistic-bullets/2-targeting/
/// </summary>
/// <param name="bulletSpeed">Скорость пули</param>
/// <param name="deltaTarget">Относительное положение цели</param>
/// <param name="higherTrajectory">два угла могут дать одинаковый результат, true - по большой параболе, false - по низкой</param>
/// <param name="gravity">ускорение гравитации</param>
/// <returns>
/// >=0 Угол выстрела
/// -1 если невозможно попасть в цель
/// </returns>
public static float CalculateAngleToHitTarget(float bulletSpeed, Vector3 deltaTarget,
bool higherTrajectory = true, float gravity = 9.81f) {
float y = deltaTarget.y;
deltaTarget.y = 0f;
//Horizontal distance
float x = deltaTarget.magnitude;
//Calculate the angles
float vSqr = bulletSpeed * bulletSpeed;
float underTheRoot = (vSqr * vSqr) - gravity * (gravity * x * x + 2 * y * vSqr);
//Check if we are within range
if (underTheRoot < 0f)
return -1f;
float rightSide = Mathf.Sqrt(underTheRoot);
float top = higherTrajectory ? vSqr + rightSide : vSqr - rightSide;
float bottom = gravity * x;
return Mathf.Atan2(top, bottom) * Mathf.Rad2Deg;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment