2016-09-18 16 views
1

Мне нужно рассчитать углы через шар в этом направлении для заданной скорости и точки, где он должен приземлиться после броска.Как рассчитать углы проекции в 3d для объекта, чтобы шаг в данной точке?

Горизонтальный угол легко (мы знаем как начальную, так и ступенчатую точки). Как рассчитать вертикальный угол проекции.

Время в пути будет обычным, как время боулинга (время между отбрасыванием шара и этап) в соответствии с видео.

Есть ли способ непосредственно в объединении3d?

Часы this видео на 8 секунд для четкого занижения этого вопроса.

ответ

1

Согласно странице Википедии 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); 
    } 
+0

Нет и не может быть на той же высоте. Проецирование начинается с некоторой высоты, и точка назначения находится на земле, как показано на видео, так же, как и боулинг (движение шара). – djkp

+0

Эта статья имеет часть для броска, который не начинается с y = 0 и точки присадки с y = 0. (Вы считали бы нижнюю точку как y = 0, я думаю, если на самом деле ни один из них не находится на y = 0.) Посмотрите на графику справа, чтобы найти правильную формулу. –

+0

Написание ответа. Пожалуйста, дайте мне минуту. –