Согласно странице Википедии Trajectory of a projectile, "угол досягаемости" (угол вы хотите знать) рассчитывается следующим образом:
θ = 1/2 * агсзш (Gd/v²)
В этой формуле g - гравитационная постоянная 9.81, d - расстояние, на которое вы хотите пролететь снаряд, а v - скорость, с которой объект бросается.
код для вычисления это может выглядеть примерно так:
float ThrowAngle(Vector3 destination, float velocity)
{
const float g = 9.81f;
float distance = Vector3.Distance(transform.position, destination);
//assuming you want degrees, otherwise just drop the Rad2Deg.
return Mathf.Rad2Deg * (0.5f * Asin((g*distance)/Mathf.Pow(velocity, 2f)));
}
Это даст вам угол, не предполагающий никакого сопротивления воздуха и т.д. существует в вашей игре. Если ваш пункт назначения и ваша «точка бросания» не имеют одинаковой высоты, вы можете сначала установить оба значения y = 0, в противном случае могут возникнуть ошибки.
РЕДАКТИРОВАТЬ:
Учитывая, что точка запуска находится выше, чем назначения, эта формула из одной и той же странице должна работать:
θ = агс (v² (+/-) √ (v^4-g (gx² + 2yv²))/gx)
Здесь x - диапазон или расстояние, а y - высота (относительно точки запуска).
Код:
float ThrowAngle(Vector3 start, Vector3 destination, float v)
{
const float g = 9.81f;
float xzd = Mathf.Sqrt(Mathf.Pow(destination.x - start.x, 2) + Mathf.Pow(destination.z - start.z, 2));
float yd = destination.y - start.y;
//assuming you want degrees, otherwise just drop the Rad2Deg. Split into two lines for better readability.
float sqrt = (Mathf.Pow(v,4) - g * (g*Mathf.Pow(xzd,2) + 2*yd*Mathf.Pow(v,2))/g*xzd);
//you could also implement a solution which uses both values in some way, but I left that out for simplicity.
return Mathf.Atan(Mathf.Pow(v, 2) + sqrt);
}
Нет и не может быть на той же высоте. Проецирование начинается с некоторой высоты, и точка назначения находится на земле, как показано на видео, так же, как и боулинг (движение шара). – djkp
Эта статья имеет часть для броска, который не начинается с y = 0 и точки присадки с y = 0. (Вы считали бы нижнюю точку как y = 0, я думаю, если на самом деле ни один из них не находится на y = 0.) Посмотрите на графику справа, чтобы найти правильную формулу. –
Написание ответа. Пожалуйста, дайте мне минуту. –