Геймдизайнер-телепат
0,1
рейтинг
20 июня 2013 в 13:47

Разработка → Кручу-верчу, запутать хочу: углы Эйлера и Gimbal lock



Выставите любой палец левой руки вперед. Давайте, не стесняйтесь, никто не будет над вами смеяться. Это нужно для важного эксперимента. Выставили? Теперь представьте что вы — это ваш палец (ну и бред). Повернитесь под прямым углом направо, затем наверх, и наконец налево. Где вы оказались? Правильно, в том же месте, но уже на спине.

С некоторой натяжкой именно так работает вращение с помощью углов Эйлера. Немного непредсказуемо и неудобно, не правда ли? Углы Эйлера имеют несколько недостатков, но есть одно особенно нехорошее свойство из-за которого вы не захотите с ними связываться. Его имя — Gimbal lock.

В русском языке gimbal lock называют по-разному: шарнирный замок, блокировка осей, складывание рамок. К сожалению, по запросам в поисковике с такими ключевыми словами выдаётся много мусора, а статья в Википедии оставляет желать лучшего, поэтому я сам расскажу вам об этом феномене и предложу как с ним бороться.

Внимание! Заходя под кат вы подвергаетесь риску поломать голову.

Для начала напомню что такое углы Эйлера. Вы наверное помните, что это что-то вроде набора из трёх углов вращения вокруг осей X, Y и Z? Не совсем так. Предположим, вы хотите повернуть некий объект, и у вас есть набор конечных углов (X: 45°, Y: 45°, Z: 45°). Один из подвохов эйлеровых углов — необходимость выбора какого-то одного порядка поворотов. Если сначала повернуть на 45° вокруг оси X, затем вокруг Y и в конце вокруг Z, то получится результат как на левой половине картинки снизу. Если порядок будет Z-X-Y, то результат будет другой, как на правой половинке.


На самом деле…
На самом деле выше описаны не просто углы Эйлера, а углы Тэйта — Брайана. Эйлеровы углы имеют много сбивающих с толку вариаций, в одних из которых нужно вращать вокруг глобальных осей, в других оси поворачиваются после каждого шага, в третьих оси всегда закреплены на самом объекте и двигаются вместе с ним. Ко всему прочему добавляется разный порядок поворотов. Если есть возможность — не пользуйтесь углами Эйлера.

От выбора порядка поворотов зависит место появления шарнирного замка. Что же это такое? Возьмём к примеру такой порядок поворотов: Z-X-Y. Если вращение вокруг оси X будет равно 90° или -90°, то вращения вокруг Z и Y будут «есть» друг друга и останется только огрызок от большего из вращений. Например (X: 90°, Y: 90°, Z: 90°) превратится в просто (X: 90°, Y: 0°, Z: 0°). Внимание на иллюстрацию.



Так же можно подставить (X: 90°, Y: 130°, Z: 140°) или (X: 90°, Y: 30°, Z: 40°), но в результате всё равно будет получаться (X: 90°, Y: 0°, Z: 10°). Немного не интуитивно, вам не кажется? Это всё из-за шарнирного замка. Когда вращение вокруг оси X становится равным 90° или -90°, ещё не использованная локальная ось вращения Y становится параллельной оси Z, но с обратным направлением, поэтому вращение вокруг неё вступает в конфликт с предыдущим вращением вокруг Z.

*Бдыщ!*

Это взорвались головы особо впечатлительных читателей. Поясню то же самое со стрелочками.



Когда оси совпадают, теряется одна степень свободы. Это и есть шарнирный замок. Вы хотите сделать поворот, но у вас не хватает осей, чтобы его осуществить.

Шарнирный замок появляется в середине иерархии поворотов. Если использовать порядок X-Y-Z или Z-Y-X, то поворот направо или налево будет заклинивать анимацию. Поскольку такой поворот встречается гораздо чаще чем, например, поворот в сторону зенита или надира, то во многих программах используют последовательность Z-X-Y. Такая иерархия поворотов используется в Unity3d, правда внутри все вращения всё равно хранятся в кватернионах. Что такое кватернионы? Об этом лучше рассказать отдельно. Кватернионы и матрицы вращения это один из способов избежать шарнирного замка. Также существуют хитрые алгоритмы, которые плавно обходят замок стороной, но это отражается на качестве анимации. Лучше всего использовать углы Эйлера только для простых случаев: пропеллеры, колёса, маятники. Иногда можно поменять иерархию поворотов, но тогда всё равно придётся помнить о замке.

По ссылкам ниже можете посмотреть интерактивную демонстрацию шарнирного замка на примере гироскопа. С ним понять иерархию поворотов и ситуации с замком намного проще.

Unity Web Player | Windows | Linux | Mac | Исходники на GitHub

Мышкой вращать сцену, Esc — выход, остальные кнопки указаны на экране.

Для пользователей Linux:
Сделайте файл GimbalLock исполняемым с помощью «chmod +x GimbalLock» и запускайте.
Даниил Басманов @BasmanovDaniil
карма
190,2
рейтинг 0,1
Геймдизайнер-телепат
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (37)

  • +15
    Прочитал про «Выставите левый палец вперед», посмотрел на свои руки и не нашел левого пальца :(
    • +3
      Можете такой же трюк проделать с головой, только осторожнее)
      • +3
        Не стоит иронизировать, лучше бы уточнили, какие именно конечности я должен выставлять ;)
        • 0
          Можете выставить всю левую руку. Или правую и делать повороты в обратном порядке: налево, вверх, вправо.
    • +1
      Указательный, я думаю, вполне подойдёт.
    • +4
      А, сообразил. Действительно, у меня тоже нету левого пальца, сейчас исправлю статью.
      • +1
        Поправьте заодно
        (90°, 130°, 140°), или (90°, 130°, 140°)
        Несколько раз перечитывал, пытаясь разницу найти.
    • +1
      А я ждал что в конце произойдет чудо. Ну хотя бы откроется портал какой-нить.
      А оказалось все гораздо прозаичнее:
      Где вы оказались? Правильно, в том же месте, но уже на спине.
    • 0
      Если у вас две руки, то у вас два левых пальца: на левой руке это мизинец, на правой — большой палец.
      • 0
        А если держать руки ладонями вверх?)
        • 0
          А если ладонями в бок?)
  • +16
    У меня палец оказался не «на спине», а «на левом боку». ЧЯДНТ?
    • +1
      попробуйте теперь из нового положения проделать то же самое. Просто исходное положение: он должен был быть «на левом боку»
      • +3
        Да, я понял. Просто в первом абзаце мне обещали «на спине». :-)
        • 0
          А что вы ещё ожидали, у пальца же нет спины)
        • 0
          Упс. Только что дошло, что неправильно прочитал комментарий, на который ответил.
  • 0
    Спасибо за картинки. Мозг действительно зашевелился, пытаясь это прокрутить.
  • 0
    И как же с этим бороться?
    • +2
      Кватернионы. Понять правда их ИМХО ещё сложней, однако пользоваться ими довольно просто даже не понимая.
      • 0
        Хм… Никогда не задумывался над тем, где используются кватернионы. Спасибо :)
      • 0
        А сможете написать внятную статью про кватернионы для страждущих?
        • 0
          Или порекомендовать, где про них почитать можно?
        • +1
        • 0
          А статью написать не смогу, у меня с математикой очень плохо, поэтому кватернионы для меня больше как магия, знаю как описать и что получится, но как всё это происходит не понимаю.
          Но автор этой статьи говорил что собирается описать в следующей и кватернионы.
  • +4
    Эх, а я уже приготовился наконец понять, как же избавиться от этой проблемы через кватернионы. А вы так обломали. :(
    Давайте теперь продолжение!
    • 0
      Всё будет) Я сейчас работаю над визуализацией, чтобы можно было вживую увидеть все фишки кватернионов.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      В архиве лежит экзешник, который я не подписывал в Майкрософте, конечно он ругается. Можете попробовать веб-версию или откройте проект с гитхаба в бесплатной версии Unity, нужно будет только нажать кнопочку Play.
      • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Неплохо было бы оси обозначить: думаю далеко не все знают, какую ось каким цветом принято обозначаеть.
    • 0
      «Например (90°, 90°, 90°) превратится в просто (90°, 0°, 0°). » — опечатка, должно быть (0, 90, 0)
      • 0
        Нет, почему? Порядок вращений Z-X-Y, но запись координат остаётся той же. Сейчас исправлю.
        • 0
          Хм. Тогда ок )
  • 0
    Проблема gimbal lock чисто механическая же, которая возникает из-за наличия жестких осей вращения у реальных предметов, например у гироскопа.
    Например, если у нас девайс висит в вакууме, подвешенный исключительно на э/м полях, то вращать его можно как угодно и куда угодно, проблемы заклинивания не возникает вовсе.
    • 0
      Да, на самом деле это две разные проблемы: одна физическая, наблюдаемая в гироскопе, другая математическая, заключающаяся в том, что новые повороты влияют на предыдущие по иерархии. Но так сложилось, что это всё называют одним термином.
  • 0
    Спасибо большое за статью! В Юнити сам часто сталкивался с ситуацией, когда вот получались такие конфликты с углами и тогда приходилось методом научного тыка… Теперь буду знать хоть что это такое.

    Если не сложно, напишите как-нибудь подробную статью про кватернионы с примитивными примерами в юньке, я их до сих пор плохо понимаю (краснеет).
  • 0
    Именно поэтому стоит потратить три дня (именно столько это отняло у такого дерева как я) на понимание кватернионов. Ну, понимание — это я хватанул. Скорее на освоение простых математических операций и методов записи кватернионов.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.