Простая 2D динамика ракеты

Я в настоящее время экспериментирую с некоторыми игрушками физики в XNA пользующийся библиотекой Farseer Physics, однако мой вопрос не характерен для 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());
        }
    }

При построении графика вывода этой программы Вы будете видеть хорошую гладкую круговую кривую, которая является точно, что я искал!

6
задан Jeremy Bell 13 July 2010 в 14:13
поделиться

3 ответа

Если у вас уже есть код для интеграции силы и массы в ускорение и скорость, тогда вы просто нужно рассчитать индивидуальную часть каждого из двух элементов, о которых вы говорите.

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

Drag = angle*drag_coefficient*velocity + base_drag
SideForce = angle*lift_coefficent*velocity

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

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

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

0
ответ дан 17 December 2019 в 06:59
поделиться

Я вдруг "понял" это.

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


Чтобы сделать это "правильно" (для космоса):

Моделируемое тело должно быть наделено моментом инерции вокруг центра масс, а также должно иметь направление и угловую скорость. Затем вы вычисляете угловое ускорение из приложенного импульса и расстояния от ЦМ, и добавляете его к угловой скорости. Это позволяет вычислить текущее "наведение" корабля (если вы не используете гироскопы или парные ориентационные струи, вы также получите (обычно очень маленькое) линейное ускорение).

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

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

BTW-Это может быть больше проблем, чем того стоит: маневрирование ракеты в свободном падении - сложная задача (вы можете вспомнить, что русские провалили маневр стыковки на МКС несколько лет назад; ну, это не потому, что они глупые). Пока вы не расскажете нам свой случай использования, мы не сможем дать вам реальный совет по этому поводу.

Немного псевдокода, чтобы намекнуть, во что вы ввязываетесь:

rocket {
  float structuralMass;
  float fuelMass;
  point position;
  point velocity;
  float heading;
  float omega;       // Angular velocity
  float structuralI; // moment of inertia from craft
  float fuelI;       // moemnt of inertia from the fuel load

  float Mass(){return struturalMass + fuelMass};
  float I(){return struturalI + fuelI};
  float Thrust(float t);
  float AdjustAttitude(float a);
}

Итог: возможно, вам нужна версия с "игровой физикой".


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

2
ответ дан 17 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

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