Данная статья поможет вам освоить введение в игру управляемого вектора тяги (УВТ), будь то его двумерный или трёхмерный вариант. УВТ используется для улучшения лётно-технических характеристик (ЛТХ) самолёта в условиях, когда стандартные управляющие поверхности теряют эффективность, например, на малых скоростях полёта, близких к сваливанию, или на больших высотах в разрежённой атмосфере.
На момент написания статьи единственными самолётами в игре с данной механикой являются самолёты с вертикальным взлётом и посадкой (СВВП). Однако возможности её реализации, а также параметры, влияющие на поведение самолёта в полёте, уже существуют, поэтому начнём.
В качестве примера рассмотрим самый простой вариант всеракурсного сопла с механическим УВТ, то есть когда отклоняется весь механизм сопла, а не отдельные лопатки.
Для начала, будет неплохо анимировать лопатки сопла, способ зависит от рига вашей модели, но в моём случае каждая лопатка поворачивается по своей локальной оси Z, так что используя Orientation: Local
и Insert Keyframe with Keying Set: Rotation
я быстро управился.
Достаточно поставить ключи на трёх кадрах:
- 0 — двигатель выключен;
- 50 — рабочие обороты;
- 100 — включён форсаж.
Что касается иерархии, для левого двигателя (№ 1) лопатки и другие части сопла именуются последовательно: nozzle1_1
, nozzle1_2
… nozzle1_25
. Для правого двигателя (№ 2) схема аналогична: nozzle2_1
, nozzle2_2
… nozzle2_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.
Импортируем файл в 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 } }
Сохраняем файл и проверяем изменения в игре. Сопла должны корректно анимироватся, и самолёт в ручном режиме управления не должно уводить в сторону или кренить. Если всё хорошо, осталось только поэкспериментировать с балансировкой и стабильностью самолёта, если нет, то проверяем файлы ещё раз.
Высоких полётов!