Слайд 1 из 30
Самолёт — крылья и оперение
Две недели назад мы написали AeroMath: угол атаки, подъёмную силу, срыв и сопротивление, проверенные тестами. Сегодня соберём из этой математики самолёт: тело с колёсами и четыре аэродинамические поверхности, левое и правое крыло, стабилизатор и киль. На обложке самолёт сбоку: подъёмная сила крыла в центре масс, подъёмная сила хвоста на плече и розовая стрелка — момент, который возвращает нос по потоку. Двигателя и управления сегодня нет: самолёт, запущенный на скорости, должен лететь ровно сам. Двигатель, ввод и HUD — на следующей паре.
Слайд 2 из 30
Цель занятия
Покажите цель и скажите главное: моментов тангажа, крена и рыскания мы сегодня не задаём ни одной строкой. Самолёт поворачивается только потому, что силы приложены не в центре масс. Если поверхности посчитаны правильно, устойчивость появится сама: хвост вернёт нос по потоку, а вращение затухнет. Если самолёт кувыркается, это почти всегда ошибка в знаке, в осях поверхности или в градусах, а не «нужно подобрать коэффициент». Это и будем учиться диагностировать.
Слайд 3 из 30
План пары · 90 минут
Критический путь — этапы 2 и 3: без правильного AeroSurface и правильных осей киля самолёт не полетит. Сцену многие могли начать дома, это было в домашнем задании; у кого она готова, сразу переходят к компоненту. Если группа отстаёт, стенд WeathervaneLab можно показать с преподавательского экрана за пару минут, а итоговую версию AeroSurface раздать файлом и разобрать только три новые строки. Испытание «без рук» обязательно проведите до конца пары: это проверка всего, что сделано сегодня.
Слайд 4 из 30
От `AeroMath` к самолёту
Это та же карта, что на занятии 6, теперь мы закрываем её целиком. Начните с проверки: у всех ли AeroMath лежит в Runtime/Plane и тесты зелёные. Без этого сегодняшний компонент не скомпилируется. Шаги 2 и 3 уже написаны, переписывать их не нужно: AeroSurface только вызывает функции AeroMath. Новое сегодня — откуда взять скорость и куда приложить силу. Эти две строки и делают из набора формул самолёт.
Слайд 5 из 30
Подготовка сцены
Зачем скользкий материал: колёса должны катиться, а не тормозить трением. Колёс как WheelCollider у нас нет, это просто шары, и с обычным трением самолёт на разбеге упрётся в землю. Тормоза и сцепление шин будем моделировать в картинге, а самолёту нужен только чистый разгон. Обратите внимание на Friction Combine: при Minimum берётся меньшее трение из двух соприкасающихся коллайдеров. Если поставить Slippery только на землю, а у колёс оставить материал по умолчанию, минимум всё равно даст скользко. Но методичка требует материал на обоих: так поведение не зависит от того, что стоит у второго коллайдера. Полоса — только визуальная, коллайдер с неё удалите.
Слайд 6 из 30
Этап 1 · Тело самолёта
Пройдите таблицу по строкам. Масса 500 килограммов — от неё все числа занятия 6: вес 4905 ньютонов. Демпфирование маленькое: основное торможение будет давать аэродинамика, а не Rigidbody. Interpolate нужен, потому что физика идёт 50 раз в секунду, а кадров больше, и без интерполяции быстрый самолёт дёргается на экране. Continuous Dynamic — посчитайте с группой: 50 метров в секунду умножить на 0,02 секунды шага — метр за шаг. При дискретной проверке столкновений самолёт может проскочить сквозь землю при посадке. Оси важны: всё, что дальше, опирается на то, что z смотрит вперёд.
Слайд 7 из 30
Этап 1 · Фюзеляж, колёса, визуал
Все объекты — дочерние Plane. Коллайдеры остаются только у фюзеляжа и трёх колёс, у всех визуальных кусков их нужно удалить: у куба-примитива BoxCollider добавляется автоматически. Почему 5 сантиметров: центр Plane на высоте 1,4, центр колеса на метр ниже, радиус шара 0,35, значит низ колеса на 0,05 над землёй. Обратите внимание, что визуальные крыло и хвост — это только картинка. Силы будут считать отдельные пустые объекты с компонентом AeroSurface, мы добавим их на этапе 3. То, что самолёт чуть ползёт, — нормально: трения почти нет, любая неровность контакта его сдвигает.
Слайд 8 из 30
коллайдеры на визуальных кусках
Это ошибка, которая проявляется не сразу. Самолёт с лишними коллайдерами может даже стоять на земле нормально, но в полёте ведёт себя странно, потому что Unity пересчитала центр масс и инерцию по форме коллайдеров. Мы на этапе 4 зададим их вручную кодом, но коллайдеры по-прежнему участвуют в столкновениях: крыло шириной десять метров при небольшом крене цепляет землю. Попросите всех прямо сейчас выделить Plane и посмотреть на зелёные рамки в окне Scene.
Слайд 9 из 30
Одна поверхность — один компонент
Главная архитектурная идея пары. Мы не пишем класс Wing, класс Stabilizer и класс Fin: у них одинаковая физика, различаются только площадь, наклон кривой подъёмной силы, угол нулевой подъёмной силы и ориентация. Ориентацию задаёт transform пустого объекта. Стабилизатор — это маленькое симметричное крыло. Киль — такое же крыло, повёрнутое набок. Один компонент, четыре экземпляра. Ошибку в формуле исправляем в одном месте, и она исправляется у всех четырёх поверхностей.
Слайд 10 из 30
Скорость точки, а не центра
Это физическое сердце пары. Возьмите формулу с первого занятия: скорость точки равна скорости центра плюс угловая скорость, векторно умноженная на радиус. Когда самолёт летит ровно, все точки движутся одинаково. Когда нос поднимается, хвост уходит вниз, и поток подходит к нему снизу: угол атаки хвоста растёт, хвост получает подъёмную силу вверх и толкает нос обратно вниз. Числа на слайде: 1186 паскалей напора, умножить на площадь 3 и на 4,5 на радиан и на 0,025 радиана — около 400 ньютонов, на плече 5,5 метра — 2200 ньютон-метров. Чем быстрее вращение, тем сильнее торможение: это демпфер. Если взять скорость центра, этого торможения не будет вовсе.
Слайд 11 из 30
Куда направлена подъёмная сила
Свяжите со стендом AeroLab с занятия 6: там подъёмная сила всегда была перпендикулярна потоку, а серый пунктир «up профиля» наклонялся вместе с хордой. Здесь то же самое в трёх измерениях. Векторное произведение направления движения и оси размаха даёт вектор, перпендикулярный обоим. Проверьте на доске: z на x в Unity даёт плюс y. Порядок множителей важен: Cross от right и flowDir дал бы силу вниз. Обратите внимание на название flowDir: это направление скорости точки, а не направление ветра; отсюда минус в формуле сопротивления в итоговой версии.
Слайд 12 из 30
Шаг 1 · AeroSurface.cs — только подъёмная сила
Это этапная версия из методички, этап 2. Создайте её в Runtime/Plane рядом с AeroMath. Сопротивления и срыва пока нет, чтобы на первом запуске проверить только направление и величину подъёмной силы. Пройдите FixedUpdate сверху вниз, в том же порядке, что карта шагов: скорость точки, направление, угол атаки, коэффициент, сила в точке.
Разбор кода
_body— ссылка наRigidbodyсамолёта; у каждой поверхности назначается вручную._area— площадьSв м²;[Min(0f)]не даёт ввести отрицательную._liftSlope— наклонdCL/dαв 1/рад, у крыла5._zeroLiftAoa— угол нулевой подъёмной силы в градусах, у крыла−3°.FixedUpdate— силы только здесь, на шаге физики:position— точка поверхности в мире;GetPointVelocity(position)— скорость именно этой точки с учётом вращения;speed < 0.5f— на месте направление потока не определено, силу не считаем;flowDir— направление скорости точки;Cross(flowDir, transform.right)— ось подъёмной силы; проверкаsqrMagnitude— поток вдоль размаха, силы нет;AngleOfAttack(InverseTransformDirection(velocity))— угол атаки в осях поверхности;alpha— угол от нулевой подъёмной силы, градусы_zeroLiftAoaпереводятся в радианы;cl = _liftSlope * alpha— пока только линейный участок, без срыва;qS— скоростной напор на площадь;AddForceAtPosition(..., ForceMode.Force)— сила в ньютонах в точке поверхности; момент Unity считает сама.
Слайд 13 из 30
Этап 3 · Четыре поверхности
Это таблица из методички, перенесите её в сцену аккуратно, по одной строке. Пустые объекты — не визуальные кубы: силы считают они, картинку дают кубы из этапа 1. Точки приложения выбраны так: крылья — на половине размаха, то есть плюс-минус 2,5 метра от оси, хвост — 5,5 метра назад. Крылья лежат точно на уровне и на продольной координате центра масс: подъёмная сила крыльев не создаёт момента тангажа, всю работу по тангажу делает хвост. Поворот киля в инспекторе подобрать неудобно, о нём следующий слайд, но по существу это (0, 0, 90).
Слайд 14 из 30
V-образность крыльев ±4°
Покажите знаки поворота: в Unity положительный поворот вокруг z поднимает правый конец оси x. У правого крыла ось x направлена наружу, поэтому плюс четыре градуса приподнимает его законцовку. У левого крыла наружу направлен минус x, поэтому для того же эффекта нужен минус. Механизм устойчивости: сам по себе наклон не меняет угол атаки. Но накренённый самолёт начинает соскальзывать вбок, в сторону опущенного крыла. Боковой поток при V-образности поднимается под опущенное крыло снизу, его угол атаки растёт, а у поднятого падает. Разница подъёмных сил выравнивает самолёт. В методичке это сказано короче: «правое крыло получает больше угла атаки»; это и есть результат скольжения. Без V-образности самолёт по крену нейтрален: накренился и так и летит.
Слайд 15 из 30
Ориентация киля
Это самое частое место ошибок пары. Киль — то же крыло, повёрнутое на 90 градусов вокруг продольной оси: размах вертикальный, нормаль профиля смотрит вбок. Формулы при этом не меняются ни в одном символе: векторное произведение направления полёта и вертикального размаха даёт горизонтальную силу. Проверьте на доске: z на y равно минус x, то есть влево, вдоль up киля. Почему именно left, а не right: при up равном left положительный угол атаки и положительное отклонение руля дают силу влево на хвосте, а значит нос вправо. На занятии 8 это совпадёт со знаком рыскания. Пусть все выделят VerticalTail и проверят цвета осей в режиме Local.
Слайд 16 из 30
Слайд 16
Дайте две минуты на первый вопрос в парах и попросите проговорить цепочку знаков вслух: поток — локальная скорость — угол атаки — знак коэффициента — направление силы — направление поворота носа. Это та же цепочка, которую придётся пройти при любой ошибке «самолёт крутится не туда». Второй вопрос — типичная ошибка: самолёт с таким килем держит тангаж, но по рысканию болтается и постепенно уходит в разворот со скольжением.
Слайд 17 из 30
Этап 4 · Центр масс и инерция
Почему кодом. Если ничего не задавать, Unity посчитает центр масс и тензор по коллайдерам: у нас это куб фюзеляжа и три шарика. Получатся слишком малые моменты, и самолёт станет дёрганым и легко кувыркается. В инспекторе Rigidbody этих значений нет: даже если поменять их в Play-режиме через отладочный инспектор, после перезапуска они вернутся. Поэтому задаём в Awake. Центр масс в нуле: точки приложения крыльев на нём, хвост на 5,5 метра позади — это важно для устойчивости. Обратите внимание на числа: рыскание самое тяжёлое, крен самый лёгкий — как у настоящих самолётов с длинным фюзеляжем и не очень большим размахом.
Слайд 18 из 30
Шаг 2 · PlaneController.cs — временная версия: только Awake
Чтобы три строки было где запустить, заводим временный PlaneController. На следующей паре он вырастет: в нём появятся чтение Action Map, рули и газ. Сейчас он только задаёт центр масс и инерцию. Значения вынесены в сериализуемые поля, чтобы их можно было подкрутить в инспекторе для опытов; а в Rigidbody их пишет Awake.
Разбор кода
_body—Rigidbodyсамолёта._centerOfMass— центр масс в локальных осяхPlane, по умолчанию(0, 0, 0)._inertiaTensor— главные моменты инерции: тангажX2000, рысканиеY2500, кренZ1500 кг·м².Awake— выполняется до первого шага физики:centerOfMass— после присвоения Unity больше не пересчитывает его по коллайдерам;inertiaTensor— то же для моментов инерции;inertiaTensorRotation = identity— главные оси инерции совпадают с осями самолёта.
Слайд 19 из 30
Этап 5 · Испытание без рук
Это главный тест пары. Высота 300 метров даёт запас: даже если что-то не так, у самолёта есть время показать поведение до земли. 45 метров в секунду — чуть выше скорости горизонтального полёта, которую мы посчитали на занятии 6: самолёт сначала слегка поднимет нос и наберёт высоту, потом начнёт плавно снижаться. Если самолёт сразу переворачивается — смотрите частые ошибки в конце: оси киля, знак векторного произведения, градусы вместо радиан, линейная скорость вместо скорости точки. Автотест в Unity-проекте курса делает то же самое, но с двигателем, поэтому без двигателя он пока не нужен.
Слайд 20 из 30
Откуда 44 м/с · связь с занятием 6
Это расчёт с занятия 6, теперь он становится предсказанием для сцены. Почему самолёт сам держит AoA около нуля: крылья стоят на центре масс и момента не дают, а хвост с симметричным профилем молчит только тогда, когда поток идёт вдоль фюзеляжа. Значит, хвост ставит самолёт так, что AoA крыла около нуля, и на нём крыло несёт вес ровно при 44 метрах в секунду. Это и называется триммированной скоростью. На 45 метрах в секунду подъёмная сила на 5 % больше веса, поэтому в начале испытания самолёт слегка лезет вверх. Скорость срыва — для сравнения: до неё далеко, сваливание будем испытывать на занятии 8.
Слайд 21 из 30
Хвост — «стрела флюгера»
Две разные вещи, которые важно не путать. Первая — статическая устойчивость, «пружина»: отклонили нос, появился момент, который его возвращает. Это даёт сама геометрия: хвост позади центра масс. Вторая — демпфирование, «амортизатор»: пока нос поворачивается, хвост движется поперёк потока и тормозит вращение. Это даёт скорость точки. Сравните со стабилизатором дрона с занятия 5: там мы руками писали возврат kp и торможение kd. Здесь обе части появились без единой строки регулятора, из аэродинамики. На следующем слайде увидим это на стенде.
Слайд 22 из 30
Стенд WeathervaneLab · хвост возвращает нос
Стенд показывает самолёт сбоку. Белая точка — центр масс, на нём крыло; жёлтая точка — стабилизатор на плече 5,5 метра. Зелёные стрелки — подъёмная сила, у крыла она бледная, потому что момента тангажа не даёт. Розовая дуга — момент вокруг центра масс. Справа график тангажа после отпускания: зелёный — со скоростью точки, оранжевый пунктир — если считать по скорости центра.
Что сделать на стенде:
- Нос +10°: хвост получает угол атаки 10° и около 2800 Н вверх, момент около 15 000 Н·м — нос вниз.
- Поставьте −10°: сила хвоста вниз, момент нос вверх. Это и есть «пружина».
- «Отпустить»: нос качнётся один-два раза и успокоится примерно за две секунды.
- Снимите галочку GetPointVelocity и снова «Отпустить»: пружина осталась, амортизатора нет — колебания почти не затухают, их гасит только angularDamping 0,2.
- Скорость 30 и 70 м/с: на большой скорости и «пружина», и «амортизатор» сильнее — колебания чаще и гаснут быстрее; число качаний примерно то же. На малой скорости всё медленнее.
Модель упрощена: центр масс летит горизонтально с постоянной скоростью, крутится только корпус; это короткопериодическое движение. Формулы сил те же, что в AeroSurface и AeroMath: те же площадь, наклон, срыв, сопротивление, инерция 2000 и угловое демпфирование 0,2.
Слайд 23 из 30
Итоговый `AeroSurface`: что добавилось
Итоговая версия — та, что пойдёт в задание. Три добавки, и все три уже посчитаны в AeroMath: сопротивление — функцией DragCoefficient, срыв — LiftCoefficient со вторым результатом. Новое только одно — руль. Мы не моделируем отдельную подвижную поверхность и не прикладываем момент «от руля». Отклонение руля эквивалентно небольшому повороту всего профиля: к углу атаки прибавляется отклонение, умноженное на эффективность в градусах. Это простая и честная модель: руль высоты действительно меняет подъёмную силу стабилизатора. Deflection ограничен от минус единицы до единицы, это доля полного хода руля.
Слайд 24 из 30
Рули: эффективность и правило знаков
Числа из методички, их нужно внести в инспектор у каждой из четырёх поверхностей сегодня, хотя рули заработают только через две недели. Эффективность в градусах: полное отклонение руля высоты меняет угол атаки стабилизатора на 8 градусов, руля направления — на 10, элеронов — на 2,5. У крыльев маленькое число, но площадь крыла большая, поэтому крен будет энергичным. Правило знаков запомните сейчас: «плюс — больше подъёмной силы». Все три строки — анонс PlaneController занятия 8; минус у руля высоты — самое частое место ошибки «тяну на себя, а нос опускается».
Слайд 25 из 30
Шаг 3 · AeroSurface.cs — итоговый файл
Это итоговый файл целиком, он заменяет этапную версию. Сверьте построчно: по сравнению с этапом 2 поменялись только объявления полей и три строки в середине FixedUpdate. Поток, ось подъёмной силы и угол атаки остались прежними.
Разбор кода
<summary>— сила по скорости самой точки, прикладывается в этой точке; оси:forward— хорда,right— размах,up— нормаль._body,_area,_liftSlope,_zeroLiftAoa— как в этапной версии._stallAoa— критический угол15°, отсчитанный от угла нулевой подъёмной силы._cd0— паразитное сопротивление: крыло0.03, оперение0.02._inducedFactor— индуктивное сопротивление,0.06._controlAuthority— эффективность руля: на сколько градусов меняется угол атаки при отклонении1._deflectionиDeflection— отклонение руля,Clampот−1до1; его пишетPlaneController.StallDepth— глубина срыва для HUD:0— нет срыва,1— глубокий.FixedUpdate:- скорость точки,
flowDir,liftAxis,aoa— без изменений; alpha— угол атаки плюс отклонение руля в радианах минусα₀;LiftCoefficient(..., out stallDepth)—CLсо срывом;DragCoefficient—CD0 + kᵢ·CL² + форм-драг срыва;StallDepth = stallDepth— сохраняем для HUD;force— подъёмная сила вдольliftAxisминус сопротивление вдольflowDir;AddForceAtPosition— одна суммарная сила в точке поверхности.
- скорость точки,
Слайд 26 из 30
частые ошибки: силы и скорость
Первая половина списка ошибок из методички — всё про формулу силы. Если самолёт ведёт себя странно, идите по этому списку сверху вниз. Вторая ошибка особенно коварна: самолёт с ней иногда даже летит, но любое возмущение раскачивает его, потому что пропал амортизатор, который мы видели на стенде. Ошибка с градусами проявляется как «самолёт резко задирает нос»: минус три градуса без перевода — это минус три радиана, около ста семидесяти градусов.
Слайд 27 из 30
частые ошибки: сцена
Вторая половина — ошибки сборки сцены. Первые три — из методички. Четвёртая очевидна, но встречается каждый год: поверхностей четыре, и одну легко забыть; Console подскажет. Последняя — напоминание про Friction Combine Minimum. Попросите студентов, у кого самолёт не летит, начать с проверки по этим двум слайдам, прежде чем звать преподавателя.
Слайд 28 из 30
Чекпойнт
Три вопроса на три главные идеи: силы в точках, скорость точки, явные масса и инерция. Спрашивайте разных студентов и открывайте ответы кликом только после устного ответа. Если на второй вопрос отвечают «ничего не изменится», вернитесь к стенду и снимите галочку GetPointVelocity.
Слайд 29 из 30
Результат занятия
Пройдите по пунктам, лучше прямо на экранах студентов. Особенно проверьте оси киля и испытание без рук: на следующей паре мы добавим двигатель и рули, и любая ошибка в поверхностях проявится как «самолёт не слушается», а искать её в шесть раз дольше. Если у кого-то самолёт кувыркается, пусть до следующего занятия пройдёт оба слайда частых ошибок.
Слайд 30 из 30
К занятию 8 · 22 октября, вторая пара
Следующая пара идёт сразу после этой, поэтому домашнего задания в обычном смысле нет: всё, что не закончили, нужно доделать в перерыве. Четвёртый пункт — разминка к занятию 8: на малой скорости самолёту нужен больший угол атаки, и его даст руль высоты. Ответ приведён для самопроверки: CL 0,41 при наклоне 5 на радиан — это 0,082 радиана, около 4,7 градуса от нулевой подъёмной силы, то есть AoA около 1,7 градуса. Напомните, что задание по самолёту можно сдавать с 5 ноября.