В настоящее время я экспериментирую с некоторыми физическими игрушками в XNA, используя библиотеку физики Farseer, однако мой вопрос относится не только к XNA или Farseer, но к какой-либо библиотеке 2D физики.
Я хотел бы добавить "ракетоподобное движение (я говорю ракетоподобное в том смысле, что это не обязательно должна быть ракета - это может быть самолет или лодка на воде или любое количество подобных ситуаций) для определенных объектов в моей 2D-сцене,Я знаю, как реализовать это с помощью кинематической симуляции, но я хочу реализовать ее с помощью динамической симуляции (то есть приложения сил во времени).Я вроде как заблудился от того, как это реализовать.
Чтобы упростить вещи, мне не нужна динамика, чтобы вращать геометрию, просто чтобы влиять на скорость тела.Я использую геометрию круга, которая не вращается в Farseer, поэтому меня интересует только скорость объекта.
Я даже не уверен, какой должна быть лучшая абстракция.Концептуально у меня есть направление, в котором тело движется в данный момент (единичный вектор), направление, в котором я хочу, чтобы оно двигалось, и значение, представляющее, насколько быстро я хочу, чтобы оно меняло направление, сохраняя скорость относительно постоянной (допустимы небольшие вариации).
Я мог бы использовать эту абстракцию напрямую или использовать что-то вроде значения «руль направления», которое контролирует, как быстро объект меняет направление (по часовой стрелке или против часовой стрелки).
Какие силы я должен приложить к телу, чтобы имитировать движение, которое я ищу?Имейте в виду, что я также хотел бы иметь возможность регулировать «тягу» ракеты на лету.
Редактировать: Как я это вижу, и поправьте меня, если я ошибаюсь, у вас есть двасилы (игнорируя основную силу тяги на данный момент):
1) У вас есть статический «плавник», который всегда направлен в том же направлении, что и тело.Если тело вращается так, что ребро не выровнено с направлением движения, сопротивление воздуха будет прикладывать силы по всей длине ребра, пропорционально углу между направлением движения и ребром.
2) У вас есть «руль», который может свободно вращаться в пределах указанного диапазона, который находится на некотором расстоянии от центра масс тела (в данном случае у нас есть круг).Опять же, когда эта плоскость не параллельна направлению движения, сопротивление воздуха вызывает пропорциональные силы по длине руля.
У меня вопрос, по-другому сформулированный, как рассчитать эти пропорциональные силы по сопротивлению воздуха противплавник и руль?
Редактировать: Для справки вот код, который я написал, чтобы проверить принятый ответ:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
float dc = 0.001f;
float lc = 0.025f;
float angle = MathHelper.ToRadians(45);
Vector2 vel = new Vector2(1, 0);
Vector2 pos = new Vector2(0, 0);
for (int i = 0; i < 200; i++)
{
Vector2 drag = vel * angle * dc;
Vector2 sideForce = angle * lc * vel;
//sideForce = new Vector2(sideForce.Y, -sideForce.X); // rotate 90 degrees CW
sideForce = new Vector2(-sideForce.Y, sideForce.X); // rotate 90 degrees CCW
vel = vel + (-drag) + sideForce;
pos = pos + vel;
if(i % 10 == 0)
System.Console.WriteLine("{0}\t{1}\t{2}", pos.X, pos.Y, vel.Length());
}
}
Когда вы отобразите вывод этой программы, вы увидитехорошая гладкая круговая кривая, именно то, что я искал!