Проблема баллистической кривой

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

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

x coordinate

y coordinate

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

  • скорость v
  • угол Alpha
  • координаты источника

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

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

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

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

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

12
задан Community 8 February 2017 в 14:28
поделиться

5 ответов

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

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

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

17
ответ дан 2 December 2019 в 05:14
поделиться

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

Фактически, si - это ваше начальное положение, vi - ваша начальная скорость, а a - ускорение свободного падения.

Чтобы это сработало, постройте вектор идеальной горизонтальной начальной скорости и спроецируйте его на угол запуска. Это ваш vi. Си будет кончиком ствола. Отсюда - векторное суммирование и масштабирование.

1
ответ дан 2 December 2019 в 05:14
поделиться

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

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

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

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

5
ответ дан 2 December 2019 в 05:14
поделиться

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

Используя векторное разложение, вы можете получить векторы 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
}

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

6
ответ дан 2 December 2019 в 05:14
поделиться

Непрерывные функции не работают на компьютерах, потому что компьютеры неявно дискретны: числа с плавающей запятой / двойные числа дискретны, таймер дискретен, игровая сетка дискретна (даже если в ней используются двойные числа). ').

Так что просто дискретизируйте уравнение, как предложил Джастин Холдскло. Имейте векторы скорости и ускорения в каждом направлении (в вашем случае X и Y; вы также можете добавить Z). Обновляйте все векторы и положение объекта в пространстве при каждом тике.

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

0
ответ дан 2 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: