Данная статья поможет вам освоить введение в игру управляемого вектора тяги (УВТ), будь то его двумерный или трёхмерный вариант. УВТ используется для улучшения лётно-технических характеристик (ЛТХ) самолёта в условиях, когда стандартные управляющие поверхности теряют эффективность, например, на малых скоростях полёта, близких к сваливанию, или на больших высотах в разрежённой атмосфере.
На момент написания статьи единственными самолётами в игре с данной механикой являются самолёты с вертикальным взлётом и посадкой (СВВП). Однако возможности её реализации, а также параметры, влияющие на поведение самолёта в полёте, уже существуют, поэтому начнём.
В качестве примера рассмотрим самый простой вариант всеракурсного сопла с механическим УВТ, то есть когда отклоняется весь механизм сопла, а не отдельные лопатки.
Для начала, будет неплохо анимировать лопатки сопла, способ зависит от рига вашей модели, но в моём случае каждая лопатка поворачивается по своей локальной оси 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
}
}Сохраняем файл и проверяем изменения в игре. Сопла должны корректно анимироватся, и самолёт в ручном режиме управления не должно уводить в сторону или кренить. Если всё хорошо, осталось только поэкспериментировать с балансировкой и стабильностью самолёта, если нет, то проверяем файлы ещё раз.
Высоких полётов!










