Слайд 1 из 13
3D-пространство — углы Эйлера и кватернионы
Мы уже управляли положением объектов силами. Сегодня займёмся их ориентацией. Три цветных кольца на обложке — модель трёх вложенных осей поворота. Сначала соберём поворот из привычных yaw, pitch и roll, затем найдём положение, где две управляющие оси совпадают. После этого посмотрим, как хранить и накапливать ориентацию кватернионом. Важно: нам не нужно запоминать четыре числа наизусть; нужно понять, какую проблему решает представление.
Слайд 2 из 13
Цель занятия
Сегодняшний результат — не формула ради формулы. Нам нужна сцена, в которой можно руками довести среднюю рамку до девяноста градусов и увидеть совпадение осей. Затем рядом будет объект, который хранит ориентацию кватернионом и получает небольшие повороты шаг за шагом. Мы сравним их поведение, а в следующем занятии применим этот способ к дрону.
Слайд 3 из 13
Три угла поворота
Покажите рукой три движения. Yaw — повернуться лицом влево или вправо. Pitch — поднять или опустить нос. Roll — наклонить корпус на бок. В трёхмерном пространстве важно не только указать три числа, но и порядок действий. Если сначала наклонить предмет, а потом повернуть, результат может отличаться от поворота с последующим наклоном. Поэтому запись из трёх углов всегда подразумевает соглашение о порядке.
Слайд 4 из 13
Вложенные рамки
Вспомните дочерние объекты Unity. Если повернуть родителя, вместе с ним поворачиваются все дети. Поэтому наружный YawPivot несёт внутри PitchPivot, а тот — RollPivot со стрелкой. Это не три независимые ручки в мировой системе координат: каждая вложенная рамка наследует уже сделанные повороты. Именно это позволит нам увидеть проблему, а не просто прочитать о ней.
Слайд 5 из 13
Найдите потерянную ось
Сначала оставьте pitch равным нулю. Попросите студентов назвать цвета осей yaw и roll и предположить, что будет при наклоне средней рамки на девяносто градусов. Дайте ответить нескольким людям. Затем нажмите кнопку Pitch = 90°. Красная и синяя линии совпали по одной прямой, хотя стрелки могут смотреть в противоположные стороны. Попробуйте менять yaw и roll: обе команды теперь вращают вокруг одной пространственной линии.
Слайд 6 из 13
Что такое гимбал-лок
Важно сформулировать проблему точно. Сам объект по-прежнему может иметь любую ориентацию и три пространственные оси. Проблема у выбранных координат управления: рядом с pitch девяносто градусов изменение yaw и изменение roll начинают делать одно и то же направление поворота. Управлять ими независимо нельзя. Это похоже на карту, у которой у полюса сходятся линии долготы: место существует, но координата ведёт себя неудобно.
Слайд 7 из 13
Кватернион: поворот вокруг оси
Не нужно пытаться представить четвёртое пространственное измерение. В Unity кватернион — удобная форма записи поворота. Мы говорим: поверни на столько-то градусов вокруг такой-то оси. Unity строит значение типа Quaternion. Внутри там четыре числа, но в обычном коде мы работаем с понятными операциями AngleAxis, умножением поворотов и нормализацией. Это похоже на то, как мы используем вектор, не пересчитывая вручную каждую матрицу.
Слайд 8 из 13
Порядок умножения важен
Здесь old orientation хранит всё, что объект уже повернул раньше. Мы добавляем маленький шаг localStep справа — его ось понимается в локальной системе объекта. Если поменять множители местами, поворот окажется привязан к другой системе координат. Порядок не коммутирует. Покажите рукой: поверните ладонь, затем наклоните; теперь поменяйте порядок. Результат изменится. Normalized удерживает кватернион единичной длины после многих операций.
Слайд 9 из 13
Что кватернион решает — и чего нет
Это важная инженерная оговорка. Нельзя просто заменить три поля на Quaternion и сказать, что любой интерфейс управления починился. Если на каждом кадре мы берём те же yaw, pitch, roll и строим из них фиксированную последовательность, возле особого угла вопросы остаются. Решение здесь — хранить накопленную ориентацию как кватернион и применять небольшие повороты вокруг текущих осей объекта. Именно такую правую модель будем писать вместе.
Слайд 10 из 13
Подготовьте сцену сравнения
Теперь повторим идею в Unity. Слева нужны именно три уровня вложенности. Справа — отдельная стрелка, которую мы будем поворачивать накопленным кватернионом. Модели стрелок могут быть самыми простыми кубами: важна наблюдаемая ориентация. Проверьте иерархию до написания кода. Если все рамки оказались соседями вместо родителей и детей, эффект не получится, потому что оси не будут наследовать повороты.
Слайд 11 из 13
Код сцены: `GimbalComparison.cs`
Код целиком доступен для копирования прямо со слайда. Пока пишем вместе, разделите его на три части. Сначала поля и проверка ссылок в Awake. Затем три localRotation для вложенных рамок. Наконец, считаем изменения углов через DeltaAngle, собираем маленький Quaternion delta и умножаем на накопленную ориентацию. Если забыть сохранить предыдущие углы, один и тот же поворот будет добавляться снова каждый кадр и правая стрелка закрутится.
Слайд 12 из 13
Проверьте на `pitch = 90°`
Теперь опыт руками. Предскажите: на левой стороне при pitch девяносто изменение yaw и roll будет похоже. Проверьте это. Справа изменения трактуются как небольшие повороты вокруг текущих локальных осей, поэтому движения остаются различимыми. Обязательно проговорите ограничение сравнения: справа другой способ управления, а не волшебный тип данных, который исправил старые ручки сам по себе. Затем верните pitch к нулю и посмотрите, как ведут себя обе части.
Слайд 13 из 13
Чекпойнт
Попросите одного студента объяснить первое совпадение, другого — что хранится в правой модели. Если звучит ответ «кватернион просто отключает гимбал-лок», уточните: важно ещё то, как мы задаём повороты. Последний вопрос про порядок умножения связывает теорию с кодом. На этом закрываем занятие 3 и переходим к дрону, где ориентация начнёт менять направление тяги и реальное движение.