Created
August 15, 2018 11:51
-
-
Save MerlinTwi/b937b91623173518fdb70687cf2c572f to your computer and use it in GitHub Desktop.
Полет снаряда по параболической траектории
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// <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