ИГРАТЬ

Управляемый вектор тяги в пользовательской модели

Данная статья поможет вам освоить введение в игру управляемого вектора тяги (УВТ), будь то его двумерный или трёхмерный вариант. УВТ используется для улучшения лётно-технических характеристик (ЛТХ) самолёта в условиях, когда стандартные управляющие поверхности теряют эффективность, например, на малых скоростях полёта, близких к сваливанию, или на больших высотах в разрежённой атмосфере.

На момент написания статьи единственными самолётами в игре с данной механикой являются самолёты с вертикальным взлётом и посадкой (СВВП). Однако возможности её реализации, а также параметры, влияющие на поведение самолёта в полёте, уже существуют, поэтому начнём.

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

Схемы сопел с механическим УВТ: a) — с отклонением потока в дозвуковой части; b) — с отклонением потока в сверхзвуковой части; g) — комбинированное.


Для начала, будет неплохо анимировать лопатки сопла, способ зависит от рига вашей модели, но в моём случае каждая лопатка поворачивается по своей локальной оси Z, так что используя Orientation: Local и Insert Keyframe with Keying Set: Rotation я быстро управился.

Достаточно поставить ключи на трёх кадрах:

  • 0 — двигатель выключен;
  • 50 — рабочие обороты;
  • 100 — включён форсаж.
Положение лопаток сопел на кадрах 0, 50 и 100

Что касается иерархии, для левого двигателя (№ 1) лопатки и другие части сопла именуются последовательно: nozzle1_1, nozzle1_2nozzle1_25. Для правого двигателя (№ 2) схема аналогична: nozzle2_1, nozzle2_2nozzle2_25. Всё просто и понятно.

Анимация УВТ

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

В точке вращения механизма (её можно определить «на глаз» или по схеме) создаю плоскость. Назову её rudder_interceptor1_l для левого двигателя и rudder_interceptor1_r для правого двигателя. Затем дублирую объекты с помощью Shift-D и называю их aileron_interceptor1_l и aileron_interceptor1_r соответственно. Для корректной работы анимации aileron_interceptor должен быть дочерним элементом rudder_interceptor.

Иерархия:

Выделяю весь механизм сопла и делаю плоскость aileron_interceptor1_l родительским объектом с помощью Ctrl-P. Получившаяся структура выглядит следующим образом:

Теперь можно переходить к анимации. На 50-м кадре задаём нейтральное положение интерцепторов.

В моей модели сопла отклоняются:

По горизонтали на 8°:

  • 0-й кадр — отклонение влево;
  • 100-й кадр — отклонение вправо.

По вертикали на 10°:

  • 0-й кадр — крен против часовой стрелки;
  • 50-й кадр — нейтральное положение;
  • 100-й кадр — крен по часовой стрелке.

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

Для корректного отображения эффектов добавляем дочерние объекты jet_flame1 и jet_flame2 к механизму сопел. Важно убедиться, что ось X этих объектов направлена вдоль вектора движения реактивной струи, так как это обеспечивает правильную ориентацию визуальных эффектов.

Итоговая анимация должна выглядеть следующим образом:

Остаётся только применить ко всем псевдоплоскостям материал null и экспортировать файл в формат MAX.

Особое внимание уделяем настройкам Animation и Transform.

Импортируем файл в 3Ds Max, применяем модификатор Smooth ко всем объектам и настраиваем параметры ObjectProperties:

Применяем материалы Dagor2:

Добавляем ключевые кадры на дорожку Note объекта gear_l (я воспользовался функционалом Copy/Paste Note Track инструмента Dagor Utility):

Экспортируем необходимые ЛОДы и файлы в директорию AssetViewer и экспортируем в игру.

Дальнейшие действия разнятся от того, есть ли у вас готовый файл самолёта и FM или нет. Если нет, то используя ссылки в данном туториале вы сможете их легко получить (к примеру файлы F-15 или Rafale). Осталось только заменить название .blk самолёта, .blk флайт модели, оперативно починить все ссылки на файл FM и на всякий случай перезагрузить игру.

Теперь открываем .blk FM вашего самолёта, и ищем следующие параметры:

  Ailerons{
    AnglesRoll:p2=25.0, 25.0
    AnglesMultiplierRoll:p3=1.0, 0.0, 1.0
    AnglesPitch:p2=0.0, 0.0 /* Сопло отклоняется только для крена */
    AnglesMultiplierPitch:p3=1.0, 0.0, 1.0
    AnglesYaw:p2=0.0, 0.0
    AnglesMultiplierYaw:p3=1.0, 0.0, 1.0
    Sensitivity:r=0.08
    SensitivityMultiplier0:p2=0.0, 1.0
    SensitivityMultiplier1:p2=0.2, 1.2
    SensitivityMultiplier2:p2=0.7, 1.0
    SensitivityMultiplier3:p2=0.95, 0.6
    SensitivityMultiplier4:p2=1.0, 0.4
    ArcadeSensitivityMultiplier:r=1.0
    SensitivityCl:p2=0.003, 0.003
    SensitivityCd:p2=0.015, -0.015
    SensitivityWingAoa:r=0.0
  }

Нас интересует параметр AnglesPitch: p2, поэтому изменяем его, выдав угол отклонения как и для крена:

  Ailerons{
    AnglesRoll:p2=25.0, 25.0
    AnglesMultiplierRoll:p3=1.0, 0.0, 1.0
    AnglesPitch:p2=25.0, 25.0 /* Теперь отклоняется во время тангажа, со скоростью как и для крена */
    AnglesMultiplierPitch:p3=1.0, 0.0, 1.0
    AnglesYaw:p2=0.0, 0.0
    AnglesMultiplierYaw:p3=1.0, 0.0, 1.0
    Sensitivity:r=0.08
    SensitivityMultiplier0:p2=0.0, 1.0
    SensitivityMultiplier1:p2=0.2, 1.2
    SensitivityMultiplier2:p2=0.7, 1.0
    SensitivityMultiplier3:p2=0.95, 0.6
    SensitivityMultiplier4:p2=1.0, 0.4
    ArcadeSensitivityMultiplier:r=1.0
    SensitivityCl:p2=0.003, 0.003
    SensitivityCd:p2=0.015, -0.015
    SensitivityWingAoa:r=0.0
  }

С визуальной частью покончено, переходим к влиянию на FM. Ищем параметры сопел:

Engine0{
  Type:i=0

  Main{
    FuelSystemNum:i=0
  }

  Nozzle0{ /* -x */
    Position:p3=-10.1, 0.0, 0.962
    Direction:p2=0.0, 0.0
    Direction2:p2=0.0, 0.0
    ThrustRatio:r=1.0
    ThrustMax:r=3000000000.0
    TipPosition:b=no
    AileronsToThrustDeflection:p3=0.0, 0.0, 0.0
    ElevatorToThrustDeflection:p3=0.0, 0.0, 0.0
    RudderToThrustDeflection:p3=0.0, 0.0, 0.0
    VtolToThrustDeflection:p2=0.0, 0.0
    ReverseToThrustDeflection:p2=0.0, 0.0
    AileronsToThrust:p3=0.0, 0.0, 0.0
    ElevatorToThrust:p3=0.0, 0.0, 0.0
    RudderToThrust:p3=0.0, 0.0, 0.0
    AirbrakeToThrust:p2=0.0, 0.0
    VtolToThrust:p2=0.0, 0.0
    ReverseToThrust:p2=0.0, 0.0
    FlapsToThrust:p4=0.0, 1.0, 1.0, 1.0
  }
}

Engine1{
  Type:i=0

  Main{
    FuelSystemNum:i=0
  }

  Nozzle0{ /* +x */
    Position:p3=-10.1, 0.0, -0.962
    Direction:p2=0.0, 0.0
    Direction2:p2=0.0, 0.0
    ThrustRatio:r=1.0
    ThrustMax:r=3000000000.0
    TipPosition:b=no
    AileronsToThrustDeflection:p3=0.0, 0.0, 0.0
    ElevatorToThrustDeflection:p3=0.0, 0.0, 0.0
    RudderToThrustDeflection:p3=0.0, 0.0, 0.0
    VtolToThrustDeflection:p2=0.0, 0.0
    ReverseToThrustDeflection:p2=0.0, 0.0
    AileronsToThrust:p3=0.0, 0.0, 0.0
    ElevatorToThrust:p3=0.0, 0.0, 0.0
    RudderToThrust:p3=0.0, 0.0, 0.0
    AirbrakeToThrust:p2=0.0, 0.0
    VtolToThrust:p2=0.0, 0.0
    ReverseToThrust:p2=0.0, 0.0
    FlapsToThrust:p4=0.0, 1.0, 1.0, 1.0
  }
}

Здесь нас интересуют строки AileronsToThrustDeflection, ElevatorToThrustDeflection и RudderToThrustDeflection. Как видим, у них есть по три значения: минимальное отклонение в градусах, нейтральное положение и максимальное отклонение реактивной струи «управляющими поверхностями», которые встречаются очень редко, хотя для СВВП используется очень похожий параметр VtolToThrustDeflection.

Добавляем значения согласно нашей модели:

Engine0{
  Type:i=0

  Main{
    FuelSystemNum:i=0
  }

  Nozzle0{ /* -x */
    Position:p3=-10.1, 0.0, 0.962
    Direction:p2=0.0, 0.0
    Direction2:p2=0.0, 0.0
    ThrustRatio:r=1.0
    ThrustMax:r=3000000000.0
    TipPosition:b=no
    AileronsToThrustDeflection:p3=-10.0, 0.0, 10.0
    ElevatorToThrustDeflection:p3=-10.0, 0.0, 10.0
    RudderToThrustDeflection:p3=-8.0, 0.0, 8.0
    VtolToThrustDeflection:p2=0.0, 0.0
    ReverseToThrustDeflection:p2=0.0, 0.0
    AileronsToThrust:p3=0.0, 0.0, 0.0
    ElevatorToThrust:p3=0.0, 0.0, 0.0
    RudderToThrust:p3=0.0, 0.0, 0.0
    AirbrakeToThrust:p2=0.0, 0.0
    VtolToThrust:p2=0.0, 0.0
    ReverseToThrust:p2=0.0, 0.0
    FlapsToThrust:p4=0.0, 1.0, 1.0, 1.0
  }
}

Engine1{
  Type:i=0

  Main{
    FuelSystemNum:i=0
  }

  Nozzle0{ /* +x */
    Position:p3=-10.1, 0.0, -0.962
    Direction:p2=0.0, 0.0
    Direction2:p2=0.0, 0.0
    ThrustRatio:r=1.0
    ThrustMax:r=3000000000.0
    TipPosition:b=no
    AileronsToThrustDeflection:p3=-10.0, 0.0, 10.0
    ElevatorToThrustDeflection:p3=-10.0, 0.0, 10.0
    RudderToThrustDeflection:p3=-8.0, 0.0, 8.0
    VtolToThrustDeflection:p2=0.0, 0.0
    ReverseToThrustDeflection:p2=0.0, 0.0
    AileronsToThrust:p3=0.0, 0.0, 0.0
    ElevatorToThrust:p3=0.0, 0.0, 0.0
    RudderToThrust:p3=0.0, 0.0, 0.0
    AirbrakeToThrust:p2=0.0, 0.0
    VtolToThrust:p2=0.0, 0.0
    ReverseToThrust:p2=0.0, 0.0
    FlapsToThrust:p4=0.0, 1.0, 1.0, 1.0
  }
}

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

Высоких полётов!

Комментарии
Комментариев пока нет
Напишите первый!
Лента рекомендаций
Сейчас нам нечего вам порекомендовать :(
Перейти на главную
Вы досмотрели до конца