logo search
rus

3 Естественное вращение объекта без математических четвёрок

3.1 Введение

Обычный способ создания свободных вращений необязательно лучший способ

Разработка пользовательского интерфейса в трёхмерных приложениях остаётся тяжёлой сферой деятельности. Проблема того, как лучше всего позволить пользователю получать доступ к таким характеристикам как объект, грань и выбор вершины; трансляцию, масштабирование, и вращение; и выбор и перемещение света и камеры, это до сих пор в большей степени открытый вопрос. Большинство интерфейсов в основном модальные и полагаются на использование непривычных виджетов, символов или иконок. Большинство потребителей, увы, останутся в замешательстве.

Одна из самых основных операций в трёхмерном проектировании это вращение объекта. Это может, на самом деле, быть единственный самый важный способ манипуляций над объектом. Пользователи ожидают способности вращать объекты по их собственному желанию. (Вот почему, к примеру, программа Apple 3D Viewer обеспечивает свободное вращение как перемещение объекта с помощью мыши по умолчанию.) Большинство интерфейсов, в том числе 3D Viewer, обеспечивают синхронное вращение по осям x и y, согласованное с горизонтальным и вертикальным движением. То есть, поперечное перемещение мыши приводит к явному вращению трёхмерного объекта вокруг горизонтальной оси, в то время как движение мыши вверх-вниз вокруг вертикальной оси. После мышь имеет только две степени свободы, вращение вокруг оси z игнорируется. Код для достижения вращения обычно выглядит примерно так:

delta_x = mousePtNew.h - mousePtOld.h;

delta_y = mousePtNew.v - mousePtOld.v;

RotateObject (delta_y, delta_x, 0.0);

Функция RotateObject, как правило, отправляет значение аргумента в матрицу вращения 4X4 и формирует матрицу произведения с глобальной “вращательной матрицей” объекта вычисляя новую ориентацию объекта.

Проблема этого подхода в том, что движение объекта не ограничено только осями x и y. Крестовое соединение оси вращения неизбежно будет причиной движения объекта вокруг третьей оси z. Этот хорошо известный эффект (который отвечает за "gimbal lock") возникает потому, что три степени свободы вращения, которые казалось бы доступны в прямоугольной системе координат на самом деле не являются независимыми. Перевод в прямоугольное трёхмерное пространство независим, потому что они (сложением векторов) объединяются в коммутативную форму. Вращение на прямоугольных осях не независимо, потому что их комбинация (с помощью перемножения матриц) не коммутативна.

Причиной этого является проблема для проектирования пользовательского интерфейса это смесь осей x/y вращения объекта (используя вид кода, показанный выше) даёт запутанную обратную связь для пользователя. Некоторые пресечения оси z уже встречаются. Неожиданное вращение оси z, которое случается это парадоксально изнутри и снаружи; но здесь это также очень серьёзная проблема гистерезиса указательных устройств: Это отсылает к ситуации, где вращательное позиционирование объектов зависит не только от финальной позиции мыши или трекбола, но и от пути по которому оно туда попало. Другими словами, когда вы перемещаете мышь из точки А в точку Б, финальная ориентация объекта может быть различной каждый раз, в зависимости от точного пути курсора. Перемещение курсора назад в точку А может или а может не восстановить оригинальную позицию объекта. (Обычно этого не происходит.)

3.2 Выход из ситуации

Для традиционной рабской верности программистов вращательным методам на основе углов Эйлера, кажется, не было бы, сначала, не было бы выхода из дилеммы “самопроизвольного z-вращения”. Но на самом деле, как сначала было подчёркнуто Ken Shoemake (в SIGGRAPH '85), алгебра кватернионов обеспечивает решение этой большой проблемы.

Кватернионы были открыты (как приложение комплексных чисел к большим величинам) в 1843 математиком William Hamilton. Они имели сильное сходство с комплексными числами – то есть, числами в форме a + bi, где a это реальная часть, а bi это так называемая мнимая часть (i стало эквивалентом квадратного корня из -1). Кватернион это четырёхкомпонентное число (откуда произошло название) в форме:

q = a + bi + cj + dk

Где i2 = j2 = k2 = -1. Подобно тому, как комплексные числа можно записать в виде упорядоченных пар (a, bi), кватернионы могут быть рассмотрены как группировка скалярной величины с векторной величиной, q = (s, v), где s это скалярный компонент и v это трёхмерный вектор в пространстве ijk. В таком взгляде на вещи, единичный трёхмерный вектор может быть рассмотрен как вид вырожденного кватерниона; то есть, кватернион с нулевым скалярным компонентом. Такой строго-векторный кватернион, также известен как "чистый кватернион." При этом, точно также как единичные векторы могут быть нормализованы (процесс в котором компоненты вектора масштабируются по векторной амплитуде) давая единичные векторы, кватернионы могут быть нормализованы давая "единичные кватернионы." Пространство не позволяет полное объяснение алгебры кватернионов, но аналогий в векторной алгебре и арифметики комплексных чисел множество.

Возможно, самый интуитивный путь понять кватернионы это рассматривать их как спаривание поворотных углов с поворотными осями. Скалярная часть кватерниона может быть рассмотрена как величина поворота, когда векторная часть представляет, ось на которой происходит вращение. A строго-векторный кватернион, это таким образом ось без точного поворота.

Значение алгебры кватернионов для программистов графики заключается в том, что вращения могут быть рассчитаны таким образом, что делая дугу интервалов можно складывать и вычитать векторы, то есть коммутативно. Это потому, что кватернионы принимают изменение параметров координатных пространств основанных на естественных поворотных осях объектов. Во взгляде на вещи с точки зрения кватернионов, две произвольные точки А и B на единичной сфере разделены угловым интервалом, который может быть выражен в одном кватернионе. Третья точка C может быть выражена через его дуги на интервале от А до B с помощью правильного кватерниона. Благодаря способу кватернионов параметризовывать пространство вращения, кватернион выражает поворот от А до С как сумму кватернионов от A до B и от B до C. Сравнение с представлением вращения пространства с помощью углов Эйлера в котором от точки A к точке B требуется фиксированное вращение по осям x, y и z. Как правило, существует не менее чем 12 различных способов комбинирования углов Эйлера для достижения желаемого поворота в пространстве x-y-z.

Если алгебра кватернионов имеет обратную сторону, кроме незнания, то большинство графических систем созданы вокруг математической матрицы. Даже если вращение было представлено полностью в терминах кватернионов, масштабирование и трансляция, как правило, делается с помощью матрицам и для удобства, как обычно бывает, матрицы комбинируются в одну финальную матрицу «объекта манипуляции», которая синхронно формирует трансляцию, масштабирование и вращение. Так программист графики, который хочет использовать кватернионы для контроля поворота обычно вынужден конвертировать представления кватерниона и матрицы на частой основе. Необходимые преобразования кода в свою очередь, добавляют к размеру программы и к вычислительным мощностям – две вещи, которые не нужны графическим программам.