Проблема баллистической кривой - PullRequest
12 голосов
/ 09 июля 2010

Хорошо, я знаю, что это совершенно не по теме для программистов, но все же мне нужно это для приложения, поэтому вот оно:

Баллистическая кривая (без ветра или любых других условий) определяется этими двумя строками:

x coordinate

y coordinate

Итак, проблема в том, что вы получили 3 неизвестных значения: x, y и время t, но только 2 уравнения.Вы не можете действительно вычислить все 3 только с этими значениями, я получил:

  • скорость v
  • угол Альфа
  • исходные координаты

Таким образом, вы должны решить, какой из них указать.

Теперь у вас есть игра 2D-танков, или что-то в этом роде, вы знаете, что у вас есть танк, и используя баллистику, вы должны сбивать противника с помощью установки угла и силы..

Мне нужно знать, когда пуля попадает в землю, она может быть в эфире во время полета или предварительно вычислена.Там возникает моя проблема.Какой способ использовать?Предварительно вычисляйте или проверяйте, ударились ли вы о землю на каждом шаге.

Если я хочу выполнить предварительные вычисления, мне нужно знать высоту ландшафта, которая, по логике, должна быть постоянной, поскольку я этого не делаю.знать, в каком х координат.Если бы я знал Х, это означало бы, что прямо перед моей башней стоит стена.Таким образом, единственный способ получить результат, когда я упаду на землю, - это проверить интервалы времени для удара о землю.Это также хорошо, потому что местность не должна быть статичной!Но не слишком ли большие накладные расходы, которые можно было бы сделать намного проще?Сталкивались ли вы с такой проблемой / решением?

Заранее спасибо, кстати, местность может быть плоской, с использованием линий или NURBS, поэтому, пожалуйста, для общего решения, а не конкретно, на какой высоте вы будете снимать, это будет удар.

Ответы [ 5 ]

17 голосов
/ 09 июля 2010

Вы можете вычислить путь снаряда y(x), решив одно уравнение для t и подставив в другое.Вы получите

y = x tan(theta) - x^2g/2(v cos(theta))^2

Тогда для определения точки приземления необходимо вычислить пересечения между этой функцией и функцией, которая определяет высоту местности.Одно пересечение будет точкой запуска, а другое - точкой посадки.(Если ваша местность очень крутая и холмистая, может быть более двух пересечений, в этом случае вы берете первое с x большим, чем точка запуска.) Вы можете использовать любой из различных алгоритмов поиска корней для фактического вычисления пересечения;проверьте документацию любых математических или игровых физических библиотек, которые вы должны увидеть, если они предоставляют метод для этого.

6 голосов
/ 09 июля 2010

Дэвид Заславский хорошо ответил на ваш вопрос о решении уравнения, но если вашей конечной целью является простое баллистическое моделирование, я предлагаю вместо этого использовать векторное разложение.

Используя векторное разложение, вы можетевыведите x- и y-компонентные векторы вашего снаряда.Затем вы можете применить ускорение к каждому компоненту для учета силы тяжести, ветра и т. Д. Затем вы можете обновлять положение снаряда (x, y) для каждого интервала как функцию времени.

Например:

double Speed = 100.0;     // Speed rather than velocity, as it is only the magnitude
double Angle = 30.0;      // Initial angle of 30º
doulbe Position[2] = {0.0,0.0};  // Set the origin to (0,0)

double xvelocity = Speed * Cos(Angle);
double yvelocity = Speed * Sin(Angle);

Тогда, если вы можете реализовать простую функцию Обновления следующим образом:

void Update(double Time)
{
     yvelocity = -9.8 * Time; // Apply gravity

     Position[0] *= (xvelocity * Time);  // update x position
     Position[1] *= (yvelocity * time);  // update y position

     CheckCollisions();  // check for collisions
}

Конечно, это очень базовый пример, но вы можете построить его отсюда.

5 голосов
/ 09 июля 2010

К счастью, это довольно простая кинематика.

Эти уравнения являются параметрическими: для любого заданного времени t они дают вам координаты x и y для этого времени.Все, что вам нужно сделать, это подключить начальную скорость v и угол a.

Если вы работаете на ровной поверхности, время для возврата вашего снаряда просто 2sin (a) v / gт.е. вертикальная составляющая вашей скорости, деленная на ускорение вниз под действием силы тяжести.2 объясняется тем, что требуется столько времени, чтобы скорость упала до 0, а затем снова и снова, чтобы она снова ускорилась.Как только вы знаете время, которое вы можете решить за х.

Если ваша местность не ровная, у вас будет дополнительное веселье.Что-то, что вы могли бы попробовать, это отработать время удара о землю на той же высоте, а затем скорректировать дополнительное вертикальное расстояние.Это также изменит ваше горизонтальное расстояние, которое может снова повлиять на ваш рост ... но две или три корректировки и ошибка будут слишком малы для того, чтобы люди могли их заметить:)

1 голос
/ 09 июля 2010

Я не уверен, что вы идете по этому пути.Главное уравнение, которое вы хотите: s = si + vi * dt + .5 * a dt dt .Это простое уравнение одного измерения, но оно чисто обобщает векторы.

Фактически, si - это ваша начальная позиция, а vi - ваша начальная скорость, а a - ускорение под действием силы тяжести.

Длясделать эту работу, построить вектор для идеальной горизонтальной скорости морды и спроецировать его на угол запуска.Это твой ви.Si будет верхушкой бочки.Оттуда это векторное суммирование и масштабирование.

0 голосов
/ 22 августа 2010

Непрерывные функции не очень хорошо работают на компьютерах, потому что компьютеры неявно дискретны: плавающие / двойные числа дискретны, таймер дискретен, игровая сетка дискретна (даже если она использует 'doubles').1002 * Итак, просто определили формулу так, как предложил Джастин Холдскло.Имейте векторы скорости и ускорения в каждом направлении (в вашем случае X и Y; вы также можете добавить Z).Обновляйте все векторы и положение объекта в пространстве на каждом тике.

Обратите внимание, что результат не будет «точным».Чем меньше ваши «дельта» значения (грубая сетка), тем ближе вы будете к «точной» кривой.Чтобы точно знать, насколько близко - если вам интересно, найдите книгу по численному анализу и прочитайте первые несколько глав.Для практических целей вы можете просто немного поэкспериментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...