Привет друзья. Написано уже половина романа, статьи о интересных моментах процессах тоже готовятся. А сейчас я хочу рассказать о том, как я для реалистичности технических деталей романа пришлось разработать целый экраноплан. Да, именно забытые и не очень хорошо показавшие себя технологии на стыке авиации и судостроительства.
По сюжету романа нужна была такая машина, которая может двигаться ниже зоны действия радаров, незаметно, пользуясь складками местности. Обычные самолеты и вертолеты в принципе могут, но сильно прижаться к земле, чтобы идти в 1-3 метрах от поверхности земли им не под силу. Это зона действия только для экранопланов.

Давайте для начала разберемся с основными недостатками существующих экранопланов.
основные недостатки существующих экранопланов
Чувствительность к состоянию поверхности. Экраноплан живет за счет экранного эффекта — роста давления под крылом при приближении к поверхности. Но что, если эта поверхность перестает быть зеркально гладкой? Любая значительная волна превращает полет в опасное «прыгание»
Балансировка, продольная устойчивость машины. Центр давления на крыле при изменении высоты полета смещается. Если нос чуть приподнимается, экранный эффект ослабевает, машина «проседает», и если автоматика или пилот не компенсируют это мгновенно — неизбежен удар о воду или «кобрирование» (резкий взмыв вверх с последующим сваливанием).
Переходные режимы. Требуется колоссальна�� избыточная мощность двигателей, которая в крейсерском режиме становится «балластом». Это делает экранопланы крайне неэкономичными по сравнению с обычными самолетами или судами на подводных крыльях
Это главные недостатки, которые реально не делают их интересными и для эксплуатации, и для конструкторов. Но если задуматься - а можно ли эти недостатки победить на существующем уровне развития технологий? Ида, в принципе это возможно. Ниже решения, которые мы проработали с нейросетями.
Решения лечения детских болезней экранопланов
Проблема: Продольная неустойчивость («скачки» по тангажу)
Решение: Схема «Утка» с активным канардом. Переднее горизонтальное оперение работает в возмущенном потоке первым, а ИИ-контроллер меняет его угол атаки сотни раз в секунду, демпфируя колебания еще до того, как их почувствует основной корпус.
Проблема: Тяжелый взлет («горб» сопротивления)
Решение: Распределенная электрическая тяга (DEP). Вместо двух монструозных двигателей — каскад электромоторов по передней кромке. На взлете они создают мощный статический поддув под крыло, буквально выталкивая машину из воды на воздушную подушку без лишнего разбега.
Проблема: Боязнь волнения и турбулентности
Решение: Управление пограничным слоем (BLI). Использование части вентиляторов DEP для активного отсоса или выдува воздуха с поверхности крыла. Это позволяет мгновенно менять подъемную силу без движения механических закрылков, «сглаживая» удары воздушных потоков от волн.
Дополнительно: Ошибки пилотирования на сверхмалых высотах
Решение: Сенсорный стек (Лидар + Нейросеть). Лидар сканирует профиль воды на километр вперед, а нейросеть (обученная на моем «правильном скрипте») заранее вычисляет траекторию обхода препятствий, делая полет безопаснее, чем на обычном лайнере. К слову полного доверия нейросетям тут не должно быть. Нейросеть рисует маршрут, но физика в лице жесткого алгоритма ставит на нем печать «Одобрено». Если ИИ предлагает маневр, нарушающий законы аэродинамики, управление перехватывает классический PID-регулятор и просто удерживает горизонт.
В общем на основании таких технических возможностей современной (и в некоторых случаях еще лабораторной, находящейся в испытаниях) науки и техники мы разработали характеристики планера с полными ТТХ машины.
Технический паспорт
Скрытый текст
ТЕХНИЧЕСКИЙ ПАСПОРТ ЭКРАНОПЛАНА «ТЕНЬ-М» (014М4)
Версия 3.1 — Спецификация экспериментального образца
Статус: Проектная документация, в разработке, на стадии тестирования
Назначение документа: Техническое описание экспериментального экраноплана с гибридной силовой установкой и системами активного управленияРАЗДЕЛ 1: ОБЩИЕ СВЕДЕНИЯ
1.1. Классификация и назначение
Параметр
Значение
Тип аппарата
Экраноплан (ground effect vehicle)
Класс
Многоцелевой транспортный
Силовая установка
Гибридная: 1 × ТРДД + 24 × электродвигателя КВ-24
Режимы полёта
Экранный (3–5 м), переходный, самолётный, висение (до 180 с)
Конструкционный стандарт
Композитный планер с интегрированными системами
РАЗДЕЛ 2: ГЕОМЕТРИЧЕСКИЕ ХАРАКТЕРИСТИКИ
2.1. Основные размеры
Параметр
Значение
Длина фюзеляжа
11 200 мм
Ширина фюзеляжа (макс.)
2 600 мм
Высота фюзеляжа (макс.)
2 200 мм
Высота на шасси
3 500 мм
2.2. Фюзеляж (опорные сечения)
X (мм)
Ширина (мм)
Высота (мм)
Смещение центра (мм)
0
200
400
200
2 000
1 600
2 400
1 000
5 500
2 600
2 200
1 000
9 000
1 800
1 800
800
11 200
600
800
400
2.3. Крыло
Параметр
Значение
Профиль
NACA 4412 (модифицированный)
Размах
13 000 мм
Площадь
50 м²
Угол обратной стреловидности
5°
Сечения крыла:
X (мм)
Y (мм)
Z (мм)
Хорда (мм)
Относительная толщина
3 500
600
900
4 800
14%
3 300
2 800
930
4 200
13%
3 050
4 500
970
3 600
12%
2 650
6 500
1 050
2 800
10%
2.4. Законцовки крыла (эндплейты/V-кили)
На законцовках крыла установлены вертикальные (с небольшим наклоном) законцовки — эндплейты, выполняющие функцию дополнительного оперения и снижения индуктивного сопротивления.
Параметр
Значение
Высота законцовки
1 100 мм
Наклон
8° назад, 3° наружу
Хорда у основания
2 800 мм
Хорда у вершины
1 624 мм
Относительная толщина
10% (осн.) / 8.8% (верш.)
2.5. Переднее горизонтальное оперение (канард)
Параметр
Значение
Профиль
NACA 4412
Размах
2 400 мм
Корневая хорда
1 800 мм
Концевая хорда
1 260 мм
Угол установки
0.5° (относительно горизонтали)
Положение (X)
800 мм
2.6. Рули высоты (элеваторы)
Параметр
Значение
Профиль
NACA 4412
Размах
2 400 мм
Хорда
540 мм
Положение (X)
2 060 мм
2.7. Вертикальное оперение (V-образные кили)
Два V-образных киля, интегрированных в хвостовую часть фюзеляжа.
Сечения левого киля (отрицательные Y):
X (мм)
Y (мм)
Z (мм)
Хорда (мм)
9 000
-1 100
1 700
2 200
9 600
-800
1 700
1 600
10 200
-500
1 700
1 000
10 750
-225
1 700
450
Вершина киля:
Параметр
Значение
X
10 300 мм
Y
±1 850 мм
Z
3 500 мм
Хорда
600 мм
Промежуточные сечения: 25%, 50%, 75% высоты для обеспечения плавности формы.
2.8. Заднее горизонтальное оперение (Т-стабилизатор)
На вершинах килей установлен Т-образный стабилизатор.
Параметр
Значение
Корневая хорда
1 400 мм
Концевая хорда
620 мм
Размах
2 200 мм
Вынос вперёд
420 мм
Профиль
NACA 4412
2.9. Грузовой отсек
Параметр
Значение
Длина
4 500 мм
Ширина
2 100 мм
Высота
1 700 мм
Объём
16 м³
Грузовой люк
Аппарель в хвостовой части
Грузоподъёмное устройство
«Ловчая Лапа» (раздвижной пол, лебёдка, траверса)
РАЗДЕЛ 3: СИСТЕМА КВ-24 (ВЕНТИЛЯТОРЫ)
3.1. Расположение вентиляторов
24 электродвигателя с тянущими винтами расположены в задней кромке крыла,
по 12 на каждой консоли.3.2. Характеристики вентилятора
Параметр
Значение
Диаметр наружного кожуха
320 мм
Диаметр вентилятора
290 мм
Длина кожуха
600 мм
Угол наклона оси
15° вниз
Материал
Композитный
Привод
Электродвигатель
РАЗДЕЛ 4: СИЛОВАЯ УСТАНОВКА
4.1. Архитектура
Гибридная: один маршевый турбовентиляторный двигатель + распределённая электрическая тяга (24 вентилятора КВ-24) + система кратковременного форсажа на перекиси водорода.
4.2. Маршевый двигатель
Параметр
Значение
Тип
Турбовентиляторный двухконтурный (ТРДД)
Модель
ТВ7-117СМ-Ф (форсированный)
Производитель
АО «ОДК-Климов»
Характеристики:
Режим
Тяга (кгс)
Расход топлива (кг/ч)
Температура газов (°C)
Крейсерский (50%)
1 800
450–550
950
Повышенный (70%)
2 500
700
1 050
Взлётный (100%)
3 600
950
1 150
Форсаж (с HTP)
6 000
2 200
1 400
4.3. Воздухозаборник
Параметр
Значение
Расположение (X)
3 000–4 000 мм
Расположение (Z)
Верхняя часть фюзеляжа
Диаметр
600 мм
Тип
Регулируемый, с защитными створками
4.4. Реактивное сопло
Параметр
Значение
Расположение (X)
10 500–11 000 мм
Форма
Прямоугольная, 400 × 200 мм
Регулировка
Подвижные створки для изменения вектора тяги
4.5. Генератор и аккумуляторы
Параметр
Значение
Генератор
Высокооборотный синхронный, 1.8 МВт, 115/400 Гц, масса 550 кг
Аккумуляторы
Литий-воздушные (Li-air), 250 кВт·ч, удельная энергия 500 Вт·ч/кг, масса 500 кг
РАЗДЕЛ 5: ТОПЛИВО И РАБОЧИЕ ТЕЛА
Вид
Масса (кг)
Объём (л)
Назначение
Керосин JP-8
2 000
2 500
Основное топливо для ТРДД
HTP (98%)
400
330
50% — система управления, 50% — форсаж висения
РАЗДЕЛ 6: МАССО-ГАБАРИТНЫЕ ХАРАКТЕРИСТИКИ
6.1. Минимальный оперативный вес (OEW)
Элемент
Масса (кг)
Фюзеляж (композит)
1 200
Крыло (с наплывами)
1 800
Оперение (V-кили + Т-стаб + канард)
600
Система КВ-24 (24 вентилятора)
1 500
Системы управления
800
Маршевый двигатель с системами
1 550
Система HTP
230
Прочие системы
420
ИТОГО OEW
8 100
6.2. Максимальная взлётная масса (MTOW)
Параметр
Масса (кг)
OEW
8 100
Керосин (2 000 кг)
2 000
HTP (400 кг)
400
Экипаж (2 чел)
200
Масса без груза
10 700
Полезная нагрузка (макс.)
1 000
ИТОГО MTOW
11 700
РАЗДЕЛ 7: ЛЁТНО-ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ
Параметр
Значение
Крейсерская скорость (экран)
260–300 км/ч
Максимальная скорость
420 км/ч
Дальность (с нагрузкой 1 000 кг)
1 850 км
Практический потолок
3 500 м
Потолок висения
1 500 м
Длина разбега/пробега
50–70 м
Длительность висения (штатный)
120 с
Длительность висения (макс.)
180 с
РАЗДЕЛ 8: КЛЮЧЕВЫЕ СИСТЕМЫ
Комплекс малозаметности «ПОКРОВ-М2» — плазменные ячейки в передних кромках.
Система «Рефлекс-М» — импульсное управление на HTP.
Бортовой комплекс «УЛЕЙ-М» — ИИ управления, координация группы, управление роем дронов.
Защита от ЭМИ «ФАРАД-М» — пассивное и активное подавление.
РАЗДЕЛ 9: ЭКСПЛУАТАЦИОННЫЕ ПОКАЗАТЕЛИ
Параметр
Значение
Назначенный ресурс
5 500 лётных часов / 18 лет
Стоимость единицы (серийная)
≈ 4.2 млрд руб.
Годовая стоимость эксплуатации
≈ 800 млн руб.
Но сделать паспорт машины это одно. Как же она будет выглядеть?
Нейросети делают модель экраноплана
Хотя и уверенно работаю в CAD системах, но мне было лень по этим ТТХ строить модель машины. Во первых я смутно представлял его внешний вид и что именно стоит делать. Во вторых это займет много времени. Я ведь считаю затраты времени не только на само моделирование, но и поиск тех же профилей NACA для крыла.
Но DeepSeek сам подсказал решение. FreeCAD имеет собственную консоль на Python, нейросети делают скрипт - запускаю его и модель строится сама. Звучит красиво. На практике вышло не очень легко, но это тоже опыт.
Нейросети ошибались, ломали модель, крылья создавались вдалеке от фюзеляжа. По итогу несколько часов работы сначала в DeepSeek, потом в Gemini, с доработкой в Claude и получилась вполне вменяемая модель, которую частично уже сейчас даже можно проверить и на аэродинамику.
При всем этом, по внешнему виду, модель получилась вполне летабельной.
Экраноплан Тень. Вид Спереди 
Экраноплан Тень. Вид сбоку 
Экраноплан Тень. Вид сверху Попозже я попробую изучить и аэродинамику модели. Уж очень интересно, что покажет анализ.
Для этого буду использовать FreeCAD с верстаком CfdOF (Computational Fluid Dynamics for OpenFOAM).
Самое сложное было — заставить ИИ понять, что вентиляторы КВ-24 должны быть интегрированы в заднюю кромку, а не просто висеть в воздухе. В итоге, после десятка требований дотянуть их до крыла, FreeCAD выдал геометрию, которую вы видите на рендерах. Она выглядит футуристично, но при этом функционально — каждый элемент здесь оправдан расчетами. Однако пока вентиляторы не полноценны для CFD анализа, так как просто воткнуты в крыло. Возможно будут править вручную или продолжу пытать себя и нейросети.
Зачем вообще мне так напрягаться?
Мог ли я просто написать в романе: «Они сели в быстрый экраноплан и полетели»? Конечно. Но когда у тебя в руках есть ТТХ, когда ты знаешь, что на скорости 150 км/ч твоя машина ест 120 литров топлива и «чувствует» экран на высоте до 1.5 метров, сцена меняется.
1. Сюжет, продиктованный физикой, а не фантазией Я хотел максимально реалистичных действий. В моей книге нет «двигателей на мане», которые работают столько, сколько нужно автору. Есть жесткие цифры:
Топливный лимит: Если на скорости 150 км/ч машина ест 120 литров в час, а в баках осталось на два часа лета — герои не долетят до цели магическим образом. Им нужна дозаправка, им нужно искать решение, рисковать. Сюжет подгоняется под реальность, а не наоборот.
Эргономика страдания: Ограничения по тоннажу и объему грузового отсека экраноплана "Тень" — это не просто строчки в таблице. Это значит, что десант сидит в тесноте, плечом к плечу, в душном отсеке, где каждый лишний килограмм оборудования может сорвать взлет. Герои не катаются на стерильном звездолете будущего — они выживают в тесной, ревущей и сложной машине. Это дает ту самую глубину сопереживания, которую невозможно выдумать.
2. Наследие Жюля Верна Вспомните «Наутилус» капитана Немо или «Альбатрос» Робура-Завоевателя. Жюль Верн не просто говорил «они поплыли под водой». Он давал конкретные размеры, описывал конструкцию двигателей, балластных цистерн и внутреннее устройство. Результат? Читатель верил в эти аппараты настолько, что десятилетия спустя инженеры получали реальные патенты, основываясь на описаниях из его романов. Я верю, что достоверность в деталях — это то, что отличает «чтиво на вечер» от мира, в который хочется вернуться.
3. ИИ как соавтор-инженер Именно здесь нейросети стали незаменимы. Когда я говорил: «Мне нужно перевезти 1 тонну груза на 2000 км, рассчитай потребную мощность», — ИИ н�� просто выдавал цифру, он заставлял меня пересматривать компоновку фюзеляжа. Это был диалог с «виртуальным КБ», где физика была главным цензором.
Выводы эксперимента
Работа над экранопланом "Тень" для романа в итоге переросла из литературного упражнения в полноценный технический концепт. Как инженер, я пришел к следующим выводам:
Неожиданный итог! Традиционные экранопланы страдали от узкого эксплуатационного диапазона. Использование распределенной электрической тяги (DEP) в связке с канардом (это небольшое предварительное крыло у носа самолета или экраноплана) полностью меняет уравнение. Мы доказали (пусть пока только в умах нейросетей), что активное управление пограничным слоем позволяет демпфировать продольные колебания, которые раньше делали полет на экране опасным аттракционом. Возможно это даст развитие старой недоделанной технологии в будущем.
Инструментарий: ИИ как исполнительный механизм Нейросети для меня не «творцы», а интерфейс к CAD-системам. DeepSeek/Claude/Gemini/ChatGPT выполняли роль младших конструкторов: писали Python-скрипты для FreeCAD, рассчитывали координаты профилей NACA и генерировали элементы. Учитывая, что именно с FreeCAD я не разбирался и не могу в нем работать - это было интересно. Вручную я бы скорее все делал в Компас-3D.
Реализм как метод тестирования Я решил написать именно такой роман, который сам бы хотел прочитать: без «голливудских сказок», на основе чего-то реально ощутимого, во что я сам мог бы поверить как профессионал. Здесь физика диктует сценарий: если конструкция не позволяет выполнить задачу по сюжету — это не проблема сюжета, которую можно исправить парой строк. Это технический сигнал к тому, чтобы вернуться к чертежам и пересмотреть саму конструкцию. Либо необходимо изменить проведение самой операции так, чтобы можно было полагаться на существующие возможности. Сюжет здесь не оправдание для магии, а суровая проверка инженерной гипотезы.
Нет плохих идей, есть несовершенство технологий. Экранопланы не взлетели в XX веке не из-за порочности идеи, а из-за отсутствия систем управления и материалов, которые есть у нас сейчас. Сегодня, используя связку из ИИ, Python и современных систем автоматизированного проектирования, один инженер может реанимировать целые классы техники, показав новый взгляд на осуществление этих конструкций.
ГЛАВНОЕ ПРЕДУПРЕЖДЕНИЕ!
При всех описанных в статье преимуществах важно помнить главное- нейросети не являются специалистами. Они могут помочь, как например мне в создании более-менее реалистичного, хоть и футуристичного мира. Но реальное создание конструкций и аппаратов должно вестись под руководством опытных специалистов в этой сфере!
Статус проекта
На текущий момент мы имеем готовую геометрию, ТТХ и понимание принципов управления. Следующий логический шаг — полноценный CFD-анализ в OpenFOAM. Нужно подтвердить расчетные коэффициенты подъемной силы при взаимодействии с экраном на разных скоростях. И этим я займусь в ближайшем будущем.
Вопрос к сообществу
Заканчивая этот обзор, я хотел бы задать пару вопросов читателям Хабра, чьи профессиональные компетенции и личный опыт мне очень интересны:
Насколько, по вашему мнению, допустим «технический реализм» в художественной литературе? Стоит ли авторам уходить в такие детали, как расчеты профилей крыла и расхода топлива, если это усложняет текст? Или именно такая «честная» инженерия и делает вымышленный мир по-настоящему живым и убедительным?
Как вы считаете, какие возможности текущий уровень развития техники (ИИ, аддитивные технологии, новые композиты) может дать старым технологиям и «забытым» изобретениям? Я на своем примере увидел, как связка из LLM и CAD-систем способна вдохнуть новую жизнь в концепт экраноплана. Есть ли у вас идеи или примеры того, что ещё стоит «реанимировать» с помощью современных инженерных инструментов?
Дополнение для любопытных
Если Вам интересно, я прикладываю скрипт для построения модели экраноплана. Для CFD он еще не готов в полной мере, поэтому я думаю его еще не раз изменю, но запустить его в FreeCAD и посмотреть саму модель возможно.
Процесс проектирования продолжается параллельно с написанием глав. Если среди читателей есть специалисты по аэродинамике, буду благодарен за критику ТТХ — в моем мире физика важнее авторского произвола
Скрытый текст
-- coding: utf-8 --
TEN_M_V7 — ПОЛНОСТЬЮ ИСПРАВЛЕННАЯ ВЕРСИЯ
import FreeCAD as App
import Part
import math
from FreeCAD import Base
import osdoc = App.newDocument("TEN_M_V7")
=====================================================
Фюзеляж — сечения
=====================================================
FUSFRAMES = [
(0, 200, 400, 200),
(2000, 1600, 2400, 1000),
(5500, 2600, 2200, 1000),
(9000, 1800, 1800, 800),
(11200, 600, 800, 400),
]def fus_z_top(x):
for i in range(len(_FUS_FRAMES)-1):
x1,w1,h1,o1 = FUSFRAMES[i]
x2,w2,h2,o2 = FUSFRAMES[i+1]
if x1 <= x <= x2:
t = (x-x1)/(x2-x1)
h = h1 + (h2-h1)*t
o = o1 + (o2-o1)*t
return o + h/2
return FUSFRAMES[-1][3] + FUSFRAMES[-1][2]/2def fus_y_max(x):
for i in range(len(FUS_FRAMES)-1): x1,w1,,_ = FUS_FRAMES[i] x2,w2,,_ = FUSFRAMES[i+1]
if x1 <= x <= x2:
t = (x-x1)/(x2-x1)
w = w1 + (w2-w1)*t
return w/2
return FUSFRAMES[-1][1]/2=====================================================
NACA ПРОФИЛЬ — возвращает Wire
=====================================================
def naca4(t, chord, n=80):
pts = []
for i in range(n+1):
x = i/float(n)
yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
pts.append(Base.Vector(xchord, 0, ytchord))
for i in range(n,-1,-1):
x = i/float(n)
yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
pts.append(Base.Vector(xchord, 0, -ytchord))
pts.append(pts[0])
return Part.Wire(Part.makePolygon(pts))=====================================================
КРЫЛО
=====================================================
wing_data = [
(3500, 600, 900, 4800, 0.14),
(3300, 2800, 930, 4200, 0.13),
(3050, 4500, 970, 3600, 0.12),
(2650, 6500, 1050, 2800, 0.10),
]
tip_x, tip_y, tip_z = 2650, 6500, 1050
tip_chord, tip_t = 2800, 0.10sects = []
for x,y,z,c,t in wing_data:
p = naca4(t, c)
p.translate(Base.Vector(x, y, z))
sects.append(p)wingL = Part.makeLoft(sects, True, False)
=====================================================
ЭНДПЛЕЙТ
=====================================================
def create_endplate(tip_x, tip_y, tip_z, chord, t, depth):
taper = 0.58
sweep = math.tan(math.radians(8)) depth
cant = math.tan(math.radians(3)) depthroot = naca4(t, chord) root.translate(Base.Vector(tip_x, tip_y, tip_z)) vtip = naca4(t*0.88, chord*taper) vtip.translate(Base.Vector(tip_x+sweep, tip_y+cant, tip_z-depth)) ep = Part.makeLoft([root, vtip], True, False) # Нижняя запирающая пластина pl = chord*0.48 pt = 90 ep = ep.fuse(Part.makeBox(pl, pt, 65, Base.Vector(tip_x + chord*0.26, tip_y+cant-pt/2, tip_z-depth-32))).removeSplitter() return epwingletL = create_endplate(tip_x, tip_y, tip_z, tip_chord, tip_t, 1100)
wingL = wingL.fuse(wingletL).removeSplitter()
wingR = wingL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))=====================================================
КАНАРД
=====================================================
def create_canard():
root = naca4(0.12, 1800)
root.translate(Base.Vector(800,0,700))
tL = naca4(0.12, 1260)
tL.translate(Base.Vector(800,-1200,700))
tR = naca4(0.12, 1260)
tR.translate(Base.Vector(800,1200,700))
s = Part.makeLoft([tL, root, tR], True, False)
s.rotate(Base.Vector(800,0,700), Base.Vector(0,1,0), 0.5)
return sdef create_elevator():
l = naca4(0.12, 540)
l.translate(Base.Vector(2060,-1200,700))
r = naca4(0.12, 540)
r.translate(Base.Vector(2060,1200,700))
return Part.makeLoft([l, r], True, False)=====================================================
V-КИЛЬ — с плавными сечениями
=====================================================
def create_vstab(side):
TE_x = 11200
root_stations = [(9000,2200),(9600,1600),(10200,1000),(10750,450)]
loft_sects = []for x_le, chord in root_stations: z = fus_z_top(x_le) y = side * fus_y_max(x_le) sec = naca4(0.12, chord) sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) sec.translate(Base.Vector(x_le,y,z)) loft_sects.append(sec) print(f"Корень {side}: x={x_le}, y={y:.1f}, z={z:.1f}, chord={chord}") # Вершина киля h = 1800 tilt = 22 last_x, last_chord = root_stations[-1] last_z = fus_z_top(last_x) last_y = side * fus_y_max(last_x) x_tip = 10300 y_tip = side*(abs(last_y) + math.tan(math.radians(tilt))*h) z_tip = last_z + h chord_tip = 600 # Добавляем промежуточные сечения для плавного Loft for f in [0.25,0.5,0.75]: xi = last_x + f*(x_tip-last_x) yi = last_y + f*(y_tip-last_y) zi = last_z + f*(z_tip-last_z) ci = chord_tip + (last_chord - chord_tip)*(1-f) s = naca4(0.12, ci) s.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) s.translate(Base.Vector(xi, yi, zi)) loft_sects.append(s) tip_sec = naca4(0.12, chord_tip) tip_sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) tip_sec.translate(Base.Vector(x_tip, y_tip, z_tip)) loft_sects.append(tip_sec) print(f"Вершина {side}: x={x_tip}, y={y_tip:.1f}, z={z_tip:.1f}, chord={chord_tip}") fin = Part.makeLoft(loft_sects, True, False) return fin, (x_tip, y_tip, z_tip)=====================================================
T-СТАБИЛИЗАТОР
=====================================================
def create_hstab(x_tip, z_tip):
cr, ct = 1400, 620
sh, sw = 2200, 420
root = naca4(0.12, cr)
root.translate(Base.Vector(x_tip,0,z_tip))
tL = naca4(0.12, ct)
tL.translate(Base.Vector(x_tip+sw,-sh,z_tip))
tR = naca4(0.12, ct)
tR.translate(Base.Vector(x_tip+sw, sh,z_tip))
return Part.makeLoft([tL, root, tR], True, False)=====================================================
ФЮЗЕЛЯЖ
=====================================================
def frame(x, w, h, offset):
pts=[]
for i in range(61):
a = 2math.pii/60
pts.append(Base.Vector(x,(w/2)*math.cos(a), offset+(h/2)*math.sin(a)))
pts.append(pts[0])
return Part.Face(Part.makePolygon(pts))frames = [frame(x,w,h,o) for x,w,h,o in FUSFRAMES]
fuselage = Part.makeLoft(frames, True, False)=====================================================
Построение килей
=====================================================
kielL, (x_tk, y_tk, z_tk) = create_vstab(-1)
kielR, = createvstab(1)
fuselage = fuselage.fuse([kielL,kielR]).removeSplitter()=====================================================
Остальные элементы
=====================================================
hstab = create_hstab(x_tk, z_tk)
canard = create_canard()
elevator = create_elevator()=====================================================
ВЕНТИЛЯТОРЫ
=====================================================
def te_x(y):
data=[(600,8300),(2800,7500),(4500,6650),(6500,5450)]
y=abs(y)
for i in range(len(data)-1):
y1,x1=data[i]; y2,x2=data[i+1]
if y1<=y<=y2:
return x1+(y-y1)*(x2-x1)/(y2-y1)
return 5450fans=[]
for i in range(12):
cy = 1600 + i*(5800-1600)/11
cx = te_x(cy)-400
pos = Base.Vector(cx,cy,1080)
outer = Part.makeCylinder(160,600,pos,Base.Vector(1,0,0))
inner = Part.makeCylinder(145,610,pos,Base.Vector(1,0,0))
fan = outer.cut(inner)
fan.rotate(pos, Base.Vector(0,1,0), 15)
fans.append(fan)fansL = Part.makeCompound(fans)
fansR = fansL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))=====================================================
CFD FLUID DOMAIN
=====================================================
all_aero = [fuselage, wingL, wingR, canard, elevator, hstab]
bb_xmin = min(s.BoundBox.XMin for s in all_aero)
bb_xmax = max(s.BoundBox.XMax for s in all_aero)
bb_ymin = min(s.BoundBox.YMin for s in all_aero)
bb_ymax = max(s.BoundBox.YMax for s in all_aero)
bb_zmin = min(s.BoundBox.ZMin for s in all_aero)
bb_zmax = max(s.BoundBox.ZMax for s in all_aero)domain = Part.makeBox((bb_xmax-bb_xmin)+5000+20000,
(bb_ymax-bb_ymin)+2*10000,
(bb_zmax-bb_zmin)+10000+1500,
Base.Vector(bb_xmin-5000, bb_ymin-10000, bb_zmin-1500))fluid_domain = domain.cut(all_aero + [fansL, fansR])
=====================================================
ЭКСПОРТ
=====================================================
out = "C:/Temp"
os.makedirs(out, exist_ok=True)
Part.export([fluid_domain], out+"/TEN_M_V7_fluid_domain.step")
print("\nSTEP:", out+"/TEN_M_V7_fluid_domain.step")=====================================================
ПОКАЗ
=====================================================
def show(shape,name,color,transp=0):
o = doc.addObject("Part::Feature", name)
o.Shape = shape
o.ViewObject.ShapeColor = color
o.ViewObject.Transparency = transp
return oshow(fuselage,"Body",(0.30,0.30,0.35))
show(wingL,"Wing_L",(0.75,0.75,0.75))
show(wingR,"Wing_R",(0.75,0.75,0.75))
show(fansL,"Fans_L",(0.10,0.10,0.10))
show(fansR,"Fans_R",(0.10,0.10,0.10))
show(canard,"Canard",(0.70,0.70,0.70))
show(elevator,"Elevator",(0.50,0.50,0.50))
show(hstab,"HStab_T",(0.65,0.65,0.65))
show(fluid_domain,"FluidDomain",(0.20,0.50,0.80),88)doc.recompute()
print("\nTEN_M_V7: ГОТОВО. Киль построен без узелков!")Возможно даже кто-то подскажет пути его совершенствования.