Траектория -мат, c # - PullRequest
       8

Траектория -мат, c #

2 голосов
/ 09 июня 2009

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

Я также хотел бы иметь возможность учесть некоторую гравитацию и ветер, чтобы путь / траектория были немного менее «идеальными». Это для компьютерной игры.

Спасибо Ф.

Ответы [ 5 ]

3 голосов
/ 09 июня 2009

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

Следующее объяснение предполагает понимание базовой алгебры и векторной математики. Если вы не знакомы с ним, я настоятельно рекомендую вам прочитать его, прежде чем пытаться написать игру, которую вы предложили. Это также предполагает, что вы имеете дело с 2D, хотя если вы имеете дело с 3D, то же самое применимо, поскольку все это в векторной форме - вы просто решаете кубическую, а не квадратичную задачу, для которой лучше всего использовать числовой решатель.


Физика

(Примечание: векторы выделены жирным шрифтом.)

По сути, вам нужно начать с формулировки уравнения для перемещения (в векторной форме):

r = u t + ( a t ^ 2) / 2

r - смещение относительно начальной позиции, u - начальная скорость, a - ускорение (постоянное во все времена). Время конечно.

a зависит от сил, присутствующих в вашей системе. В общем случае гравитации и ветра:

a = F_w / м - г j

где i - это единичный вектор в направлении x, а j - единичный вектор в направлении y. g - ускорение силы тяжести (9,81 мс ^ -2 на Земле). F_w - вектор силы, вызванный ветром (этот термин исчезает при отсутствии ветра) - мы предполагаем, что это ради простоты. m - масса снаряда.

Тогда вы можете просто подставить уравнение для a в уравнение для r, и у вас останется уравнение из трех переменных (r, u, t). Затем, раскройте свое единственное векторное уравнение для r на два скалярных уравнения (для смещения по x и y) и используйте подстановку, чтобы исключить t (здесь математика может быть немного сложнее). Вы должны остаться с одним квадратным уравнением с только r и u в качестве свободных переменных.

Теперь вы хотите решить уравнение для r = [target position] - [start position]. Если вы выберете определенную величину для начальной скорости u (т.е. скорость), то вы можете записать компоненты x и y для u как U cos(a) и U sin(a) соответственно, где U - это начальная скорость и начальный угол. Это можно изменить, и с небольшим количеством тригонометрии вы, наконец, сможете найти угол a, что даст вам скорость запуска!


Алгоритм

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


P.S. Извините за всю математику / физику в этом посте, но это было неизбежно! Во всяком случае, ОП, во всяком случае, спрашивал больше о физической, а не вычислительной стороне этого, так что я это и предоставил. Надеюсь, это по-прежнему полезно как ОП, так и другим людям.

2 голосов
/ 09 июня 2009

Как уже упоминалось, хотя определить углы между точками относительно просто, определить, как ветер и сила тяжести будут влиять на выстрел, сложнее.

Ветер и гравитация являются ускоряющими силами, хотя они действуют несколько по-разному.

Гравитация легче, поскольку она имеет как постоянное направление (вниз), так и величину независимо от объекта. (Предполагая, что вы не снимаете вещи со смехотворно высокими скоростями). Чтобы рассчитать, как гравитация повлияет на скорость вашего объекта, просто возьмите время с момента последнего обновления скорости объекта, умножьте ее на свой гравитационный коэффициент и добавьте к текущему вектору скорости.

В качестве простого примера давайте подумаем об объекте, который движется со скоростью (3, 4, 7) в направлениях x, y, z, причем z параллельно силе гравитации. Вы решаете, что ваше значение гравитации равно -3. Вы готовы рассчитать новую скорость. Когда вы проверяете, вы обнаруживаете, что с момента вашего последнего расчета прошло 10 единиц времени (какими бы ни были ваши единицы времени ... возможно, тики или что-то в этом роде). Вы берете свои единицы времени (10), умноженные на гравитацию (-.3), что дает вам -3. Вы добавляете это к своему Z, и ваша новая скорость (3, 4, 4). Вот и все. (Это было очень упрощено, но с этого следует начать.)

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

Простой пример этого может быть, если вы двигались в точке (3, 0, 0), а ветер двигался в точке (5, 0, 0), и мы можем придать ветру силу 0,5. (Вы также должны умножить на прошедшее время ... ради этого примера, чтобы упростить его, мы оставим коэффициент истекшего времени равным 1). Вы рассчитываете разницу в векторах и умножаете на свою разницу во времени. (1) и обнаружить, что разница составляет (2, 0, 0). Затем вы умножаете этот вектор на силу ветра, .5, и вы обнаруживаете, что ваше изменение скорости равно (1, 0, 0). Добавьте это к вашей предыдущей скорости, и вы получите (4, 0, 0) ... так что ветер немного ускорил объект. Если бы вы ждали другую единицу времени, у вас была бы разница (1, 0, 0), умноженная на вашу силу .5, поэтому ваша конечная скорость была бы (4.5, 0, 0). Как вы можете видеть, ветер создает меньше силы, когда вы приближаетесь к нему по скорости.) Это довольно аккуратно, но может быть слишком сложно для баллистики игры.

2 голосов
/ 09 июня 2009

Книга:

Современная внешняя баллистика: динамика запуска и полета симметричных снарядов ISBN-13: 978-0764307201

Является современным авторитетом по баллистике. Для точности вам понадобятся исправления:

http://www.dexadine.com/mccoy.html

Если вам нужно что-то бесплатное и менее авторитетное, доктор Манн 1909 года классики Полет пули из пороха в цель доступен на books.google.com.

-kmarsh

PS Плохая баллистика в играх - моя любимая особенность, особенно баллистическая модель "стреляет в бесконечность".

0 голосов
/ 09 июня 2009

Просто ссылка, извините: http://www.gamedev.net/reference/articles/article694.asp.

На gamedev много статей о физике игры. Посмотри.

(Кстати: ветер только добавляет скорости объекту. Тяжелая часть - это сила тяжести.)

0 голосов
/ 09 июня 2009

Угол простой, atan2 (pB.x-pA.x, pB.y-pA.y). Вектор скорости должен быть (pB-pA) * скорость. И чтобы добавить гравитацию / ветер (сила тяжести - это просто ветер с отрицательной y-компонентой), добавьте (масштабированный) вектор ветра к вашей скорости на каждом такте моделирования (вы в основном добавляете его как ускорение).

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