Pull to refresh

Comments 85

Прозвучало как «я не учил математику, не разобрался в кватернионах, поэтому изобрёл их заново».
Может, вообще стоило начать с тензоров и матриц? А кватернионы рассматривать уже как оптимизацию, позволяющую описывать только повороты и масштабирование?
Мы ведь говорим о вращении объекта, какое еще масштабирование?
Насчёт масштабирования — это меня переглючило, давно я в кватернионы игрался (20 лет прошло) и забыл, что там входит обратный кватернион, т.е. масштабирование не получить никак, из 4 «степеней свободы» одна теряется.
Ну вот мы плавно и подошли к теме статьи.
Да нет, не подошли. 4 числа в кватернионе — _удобно_ и быстро. В матрице вон вообще 9 (если только вращение/отражение/масштабирование) или 12/16 (если сдвиги и проективное преобразование), однако она удобна и широко используется для представления поворотов.
А, к примеру, углы Эйлера — три числа, без избыточности, но неудобны.
Умножение кватерниона на кватернион с нулевой векторной частью дает масштабирование/сжатие
Статья — перевод, если что (и я не сразу заметил)
Как я понял, посыл статьи в том, что кватернионы и формулы с ними вводятся без обоснований, и сложно понять почему они работают так, как работают. А если вооружиться школьной геометрией, то автор приходит к кватернионам с пониманием, откуда что берется. Его это знание успокаивает, а большинству практиков достаточно табличных формул для реализации всей геометрии поворотов. Мне лично матрицы поворота более понятны, их и использую. Но кватернионы некотрые задачи решают лучше.
Мне лично матрицы поворота более понятны, их и использую.

Только интерполировать их всё равно нужно через кватернион.
Совсем не обязательно. Существуют прямые формулы вычисления экспоненты и логарифма для матриц поворота и они даже удобнее кватернионов т.к. там не возникает проблемы «двойного покрытия» (представимости большинства поворотов двумя разными кватернионами) из-за которой у кватернионов интерполяция может идти по длинной части дуги большого круга. Просто вычисляются они сложнее и дольше, ну и еще народ тупит и не знает про них :). Причем в отличие от кватернионов такие формулы для матриц можно вывести не только для поворотов но и для произвольных движений.

То, что описано в статье, математики зовут «алгеброй Клиффорда». Она определяется следующим набором аксиом:


  • Aссоциативноcть: $$(AB)C = A(BC)$$
  • Дистрибутивность:
    $$A(B + C) = AB + AC \qquad (A + B)C = AC + BC$$
  • Умножение на число: $$(αA)B = A(αB) = α(AB)$$
  • Умножение на единицу: $$1A = A1 = A$$
  • Квардрат вектора: $$aa = a^2 \in \mathbb R$$

Может, вообще стоило начать с тензоров и матриц?

Не может. Алгебра Клиффорда намного более простой и удобный инструмент для подобных вещей.




У меня в черновиках есть статья об алгебре Клиффорда, вдохновлённая книгой «Geometric Algebra for Physicists». Надо бы её наконец дописать и выложить на хабр.

Допишите, допишите.
А кватернионы — часом не частный случай алгебры Клиффорда?


Ну и насчёт удобства — по мне, так для представления поворотов следует разделять абстракцию (для меня это — тензор поворота) и реализацию (матрица, кватернион, ещё что) — чтобы о реализации думать, только когда оптимизируешь программу.

А кватернионы — часом не частный случай алгебры Клиффорда?

Именно так.

Не совсем так. С точки зрения алгебры Клиффорда в таблице умножения кватернионов есть неточность, а именно ijk = 1, а не -1. :). Говорят, Гамильтон налажал :).

ijk=1\;\Rightarrow\;k^2=1\;\wedge\;k\ne1

Это уже не гиперкомплексные числа получаются. С такими и поле может не получиться.

Я не уверен, что алгебра Клиффорда даёт поле… но оператор антипроизведения, который чем-то похож на деление, некоторые авторы вводят.

Вообще, что до ijk, говорят, что кватернионы получаются, если инвертировать в алгебре клиффорда одно из направлений. Условно, перейти из правой тройки в левую.


ij=-k
jk=-i
ki=-j

Статьи (не только здесь) начинаются часто с примера, как повернуть вектор на 90 градусов. habr.com/post/426863 Кажется, это ваша статья. Для себя совсем чуть-чуть (едва-едва) я прояснил, что происходит. Но волнует, конечно же, практическое применение и, как мне кажется, для понимания лучше объяснять в двумерном пространстве. Дело в том, что на практике (реальное программирование, я, конечно в основном про игры) поворачивать объект на 90 и даже 45 градусов можно вообще без кватернионов (по крайней мере для 2D плоскости) и матриц поворота, просто составив два массива. Использовать инкремент/декремент -влево/вправо. Не очень понятно и хотелось бы такой пример, когда поворот в 2D происходит, допустим, на 5 градусов, как это реализуется, как это объясняется. В этом случае же уже нет прост смены знака для одной из осей (что, как я понимаю и призваны делать мнимые числа). Извините, если что-то не так написал…
Здесь часть с бивектором соответствует «мнимой» части комплексного числа. Только это не «мнимое» значение, это просто бивектор, который мы по-настоящему можем показать графически!

Вообще-то кватернион — это вектор в четырехмерном пространстве. Его базис [1, i, j, k] образует группу
image
Кроме этого, группа кватернионов (как и комплексных чисел) естественным образом порождает метрику Евклида
Кроме этого, кватернион имеет естественное представление в виде матрицы 4 x 4
image
Если вас смущает название «мнимая часть», то существует альтернативное название — «векторная часть». Если мы работаете в трехмерном пространстве, то существует бесчисленное множество способов его получить из четырехмерного (хотя бы взять скалярную часть равной нулю)
Главное различие в том, что… заменяются на…, но работают они в основном так же

Вы сделали следующее — отбросили скалярную часть (приравняли к нулю) и ввели переобозначение
Кватернион и комплексные числа, — уникальные математические объекты. Их действия (q1 * q2) есть суть преобразования евклидова четырехмерного и двухмерного пространств. Отношения между базисными элементами составляют, если хотите, таблицу логики пространства (плоскости)
Это перевод, автору публикации это всё вряд ли интересно.
Что-то я не уловил чем эти роторы (вообще говоря в математике ротором называется кое-что другое) и кватернионы лучше, чем обычная матрица перехода, домножая которую слева или справа на матрицу поворота, можно поворачивать вектор хоть в абсолютных координатах, хоть в относительных.
Кватернионы — меньше компонентов и сразу видна ось вращения.
Так они и описывают лишь вращение. Для той же камеры в случае с кватернионом нужно как минимум: координаты (3), направление (4), поле зрения (2). Итого: 9 координат. Против 12 значащих чисел у матрицы, которая ещё и относительный наклон осей поддерживает.

А зачем видеть «ось вращения» кватерниона/матрицы? Обычно нужно обратное преобразование: дай мне хреновину, которую можно применить к куче векторов, чтобы повернуть их на такой-то угол.
Выигрыш кватернионов в отсутствии вырождения (проблема нулевого угла).
у матрицы поворота тоже не вырождения. оно есть только у углов Эйлера
slerp чисто на матрицах сделать проблематично мне кажется будет
Мне именно матрицы поворота не нужно было интерполировать, но отдельные вектора в 3D и 2D интерполируются просто — сначала линейно, потом результат нормализуется на интерполированный модуль. Для матрицы поворота это нужно сделать для двух векторов (строк) и довычислить третий веторным перемножением, так что тоже все несложно, и интуитивно понятно.
Это дает неравномерную скорость движения (которая тем заметнее чем больше угол поворота) а для поворота на 180 вообще ломается.
Да, конечно, это нужно учитывать, но для каких-то применений или малых углов, неравномерность не критична.
Я делал. Это не очень тривиально но не сильно сложнее чем с кватернионами и имеет свои плюшки в виде применимости к любым движениям (не только чистым вращениям)
UFO just landed and posted this here
Однако slerp некоммутативен и существенно более ресурсоёмок по сравнению с nlerp, единственным недостатком которого является существенный easing на больших углах (что большая редкость).
UFO just landed and posted this here
Так nlerp реализуется через сложение матриц с масштабированием в зависимости от номера шага.
На матрицах это тоже можно делать, просто это не так хорошо известно.
Это более общее решение чем кватернионы и не имеющее проблем с двойным покрытием, но считается оно дольше
Пользуясь случаем, друг интересуется, что за магия тут происходит? Как это можно записать человеческим языком? Как видно по названию переменных код вручную восстановлен при помощи известного дизассемблера. Работает как надо.
  v23 := P15.DotProduct(p21) * -2.0 + P15.DotProduct(P15) + p21.DotProduct(p21) - Radius * Radius;
  v24 := (P18.Z-P15.Z) * (P18.Z-P15.Z) + (P18.X-P15.X) * (P18.X-P15.X) + (P18.Y-P15.Y) * (P18.Y-P15.Y);
  v25 := (P15.X-p21.X) * (P18.X-P15.X) + (P15.Y-p21.Y) * (P18.Y-P15.Y);
  v26 := (P15.Z-p21.Z) * (P18.Z-P15.Z) + v25 +(P15.Z-p21.Z) * (P18.Z-P15.Z) + v25;
  v27 := v26 * v26 - 4.0 * v24 * v23;
Часть формулы похожа на пересечение луча со сферой. Что именно здесь происходит можно сказать только при применении ее на месте.

v23 := P15.DotProduct(p21) * -2.0 + P15.DotProduct(P15) + p21.DotProduct(p21) - Radius * Radius;
_P18 := P18 - P15;
_P15 := P15 - p21;
v26 := _P15.DotProduct(_P18);
v27 := ( v26 * v26 - _P18.DotProduct(_P18) * v23 ) * 4.0;
Да, всё как вы сказали. Функция называется RaySphere, просто хотелось бы иметь осмысленные переменные, а не безымянные v23..v27.
Полная функция:
function TWarpData.RaySphere(var a1, a2: Double; Radius: Double; P15, P18, p21: TPoint3D): Boolean;
var
  v23, v24, v25, v26, v27, v29, v30, v31: Double;
begin
  Result := false;

  v23 := P15.DotProduct(p21) * -2.0 + P15.DotProduct(P15) + p21.DotProduct(p21) - Radius * Radius;
  v24 := (P18.Z - P15.Z) * (P18.Z - P15.Z) + (P18.X - P15.X) * (P18.X - P15.X) + (P18.Y - P15.Y) * (P18.Y - P15.Y);
  v25 := (P15.X - p21.X) * (P18.X - P15.X) + (P15.Y - p21.Y) * (P18.Y - P15.Y);
  v26 := (P15.Z - p21.Z) * (P18.Z - P15.Z) + v25 + (P15.Z - p21.Z) * (P18.Z - P15.Z) + v25;
  v27 := v26 * v26 - 4.0 * v24 * v23;

  if (v24 >= 0.0) then
  begin
    if (v24 < 0.00001) then
    begin
      a1 := 0;
      a2 := 0;
      Result := false;
      Exit;
    end;
  end
  else if (v24 > -0.00001) then
  begin
    a1 := 0;
    a2 := 0;
    Result := false;
    Exit;
  end;
  if (v27 >= 0.0) then
  begin
    v30 := sqrt(v27);
    v31 := v24 + v24;
    a1 := (v30 - v26) / v31;
    v29 := (-v26 - v30) / v31;
    Result := true;
  end;
  a2 := v29;
end;
А вы начните с входных параметров. Результат у вас a1, a2 — это расстояние от точки откуда идет луч до пересечение со сферой. Дальше P15, P18, p21 — должна быть одна из них точка откуда идет луч, сам луч и центр сферы. Далее коэффициенты называться могут как угодно в них мало смысла. Скажем -v26/v31 — это расстояние от точки луча, до перпендикуляра пересекающего центр сферы. v30 * 2.0 / v31 — это длинна отрезка между точками пересечения луча со сферой.

Единственных два условия которые здесь имеют смысл это:
if (v24 < 0.00001) then
if (v27 >= 0.0) then
Потому что v24 не может быть меньше нуля. А v27 это проверка на пересечение луча со сферой. Хотя технически первое тоже имеет малое значение — случай когда точка луча находиться в центре сферы.
Спасибо за триггер. Удалось сократить этот мрак до вполне осмыслимого:
  v23 := P15.DotProduct(P21) * -2.0 + P15.DotProduct(P15) + P21.DotProduct(P21) - Radius * Radius;

  P18 := P18 - P15;
  v24 := P18.DotProduct(P18);
  P15 := P15 - P21;
  V26 := P15.DotProduct(P18) * 2;
  v27 := v26 * v26 - 4.0 * v24 * v23;

Да и собственно, как вы сказали, название коэффициентов тут не критично.
зы Жаль карма нулевая… Ну и тысяча извинений, человек не был рожден ни математиком, ни программистом, он бы рождён реверсером. *грустный смайлик*
На этапе 3.4 произошла какая-то магия: взяли и умножили вектор на сумму скаляра и бивектора, притом что такая операция ранее нигде не вводилась.

А под спойлером написан совершенно бессмысленный вывод для x(xy), где сначала используется формула xy = x ∙ y + x ∧ y, а потом x ∧ y заменяется обратно на xy.

И да, совершенно не понятны претензии к приравниванию длины вектора к площади параллелограмма в статье, в которой дальше безо всяких объяснений вектор умножается на параллелограмм два раза, а потом результат снова приравнивается к вектору :-)
UFO just landed and posted this here
UFO just landed and posted this here
Кто хочет глубже вникнуть в предмет, читайте
gen.lib.rus.ec/search.php?req=lounesto+clifford+algebras+and+spinors&open=0&res=25&view=simple&phrase=1&column=def
и по-русски есть книжечка (проще, но меньше и сумбурнее)
gen.lib.rus.ec/search.php?req=казанова+от+алгебры+клиффорда&open=0&res=25&view=simple&phrase=1&column=def
И в более высоких измерениях (4D и выше) невозможно определить один вектор нормали к 2D-плоскости (например, в 4D у 2D-плоскости есть два направления нормалей, в 5D есть три направления нормалей)

Другими словами, на плоскости возможен поворот вокруг точки, в 3D пространстве — относительно прямой, в 4D пространстве — относительно плоскости, а в nD пространстве — относительно объекта размерности n - 2. Матрицы поворота вокруг точки и оси хорошо известны: Rotation matrix, Rodrigues' Rotation Formula. Однако матрицы поворота вокруг плоскости и объектов более высоких размерностей тоже выводятся. В 2012 задавался этим вопросом на math.stackexchange.com.

Поворот в любом мерности выполняется не вокруг чего-то, а в какой-то плоскости.

Ну и как вы сделаете поворот в плоскости не указав центра, только с углом и той самой плоскостью?

Поворот всегда выполняется вокруг начала координат. Поворот вокруг любой другой точки является композицией поворота и сдвига.

Так всё-таки, поворот всегда выполняется вокруг начала координат или бывают повороты и вокруг других точек?

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

Поворот в смысле "линейного оператора" действительно выполняется вокруг начала координат, но "сдвиг" не является линейным оператором и комбинировать их нельзя. А поворот в смысле "движения пространства" который может комбинироваться со "сдвигом" не обязательно выполняется вокруг 0. Любой поворот может быть представлен в виде поворота вокруг 0 и сдвига но понятие "поворот вокруг оси" / "заданной точки" совершенно нормально а "ось" в виде подпространства точки которого оператор поворота переводит в себя определена в таком случае лучше чем ортогональная ей "плоскость вращения".

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

Что до того, кто лучше определён, то тут конечно, кому что больше нравится, но статья посвящена геометрической алгебре. Ротор это сумма скаляра и бивектора, то есть, скаляра и объекта отвечающего в ГА за плоские характеристики. Прелесть этого объекта в том, что в пространстве любой мерности он останется именно суммой скаляра и бивекторов. В нем будут появляться новые компоненты, потому как пар осей будет становиться больше, больше и больше. Кстати, количество элементарных поворотов равно количеству пар осей, что как бы намекает.

И да, у меня старший брат боксёр, а еще я тебя по айпи вычислю.

Опечатка “является улучшенной версией скалярного тройного произведения”, у нас в литературе это называется смешанным произведением.

Идея автора понятна, но я бы выбрал прямо противоположный путь — «давайте уберём матрицы из всех 3D-движков». Решение автора ничуть не более прозрачно, его обоснование через площади и би-векторы очевидно разве что только для больших фанатов линейной алгебры.

Мой дилетантский взгляд такой. Первым делом нужно более корректно сформулировать проблему без «сложно/непонятно/не хочу вникать»:

1) в 2D-плоскости вращение можно описать через умножение комплексных чисел, при этом мы получаем в наследство всю мощь классического и комплексного анализа;

2) в 3D-пространстве появляются 4 степени свободы для вращения и очевидно что в 3 координаты они не влезут. Поэтому таки приходится привлекать кватернионы.

3) но у кватернионов другая проблема — 4 координаты избыточны для положения, плюс у них некомутативность по умножению, что довольно неудобно в аналитических вычислениях. Ну и двойное покрытие конечно же. Ну и глядя непосредственно на компоненты кватерниона сложно сходу сказать, относится он к координатам, повороту или чему-то ещё (ну может в него CMYK закодировали, мало ли).

Кватернион в терминах линейной алгебры можно рассмотреть как композицию скалярной части и векторной части. По аналогии можно определить 5D-объект из комплексной части и векторной части (2D-ротор и 3D-положение). Таким образом, можно определить умножение, в котором векторная часть вообще не будет задействована (в случае нормализованного ротора). Правда, коммутативность таким образом обеспечить скорее всего не получится. Но зато коммутативность получится обеспечить через тип комплекс-комплекс, где компоненты комплексного числа тоже комплексные числа (идея тоже не новая, и в первых экспериментах пока всё сходится с интересными нюансами. Собственно, на эту статью я и набрёл в поисках готового решения, чтобы не изобретать велосипед без необходимости).
Автор про матрицы ничего и не говорит. Его мысль в том, чтобы вместо кватернионов использовать мультивектора геометрической алгебры. Мысль столь же правильная, сколь и тривиальная. Кватернионы — это частный случай мультивекторов геометрической алгебры Гроссмана и Клиффорда.
Не очень понятно про коммутативность. Группа композиций SO3 принципиально некоммутативна.
Объяснение для программистов: берём готовую реализацию типа Complex, автозаменяем слово Complex на ComplexComplex, а затем Real/Double на Complex. Коммутативность уже определённой таким образом операции умножения наследуется автоматически, потому что реализуется не через перемножение мнимых единиц, а через перемножение комплексных чисел.

Математически это значит что мы работаем с выражением (a+b·i)+(c+d·ij, где скобки не раскрываются а мнимые единицы не перемножаются. Итого имеем 4 числа, но только две мнимых единицы.
Процедура удвоения по Келли.
… предполагает n-1 мнимых единиц от размерности пространства. Легко взять и проверить, что результат умножения здесь отличается от умножения кватернионов что в одну, что в другую сторону, и при этом не только коммутативно, но и обратимо (за исключением делителей нуля разумеется).
Но отражает ли эта арифметика поведение группы SO3? Одно то, что эта группа коммутативна, а SO3 — нет, вызывает определённые подозрения.
Очевидно что нет. Смысл абстракции не в увеличении размерности пространства вращений, а в увеличении размерности точки на комплексной плоскости. Как такая конструкция корректно называется в терминах теории групп — не знаю и не уверен, что это знание как-то повлияет на математику процесса.
А зачем нам тогда такой объект?
Зачем мне такой объект, вы хотели сказать? Вам я его не навязываю, а просто упомянул, что можно и так. Можно увеличивать размерность пространства опираясь на классическую полиномиальную алгебру без вот этого всего вот.
Под нам я имел ввиду человечество, разумеется.
Я не возьмусь брать на себя ответственность за всё человечество. А лично моё дилетантское сознание не настолько прогрессивно, чтобы мыслить абстракциями в 4D пространстве или решать задачи с некоммутативным умножением в нём же.
Четыре компоненты кватерниона не делают пространство четырёхмерным, также как пространство бикватерниона не становится восьмимерным. Пространство матрицы поворота также не является девятимерным. Повороты принципиально некоммутативны. Никуда от этого не деться.
Повороты как умножение комплексных чисел вполне коммутативны. Проекция 3D-вектора на 2D-плоскость и обратно тоже возможна. Не понимаю, от чего именно здесь некуда деться.
Повороты коммутативны в 2d. В 3d уже нет. Это легко показать на примерах.

Потому комплексные числа коммутативны, а кватернионы — нет.

Это напрямую следует из того, что в Cl(2,0,0) есть всего одна пара ортов, а в Cl(3,0,0) их уже три.
Мой комментарий был про 2D-поворот вокруг 3D-вектора с произвольным направлением. При этом повороты и векторы подразумеваются в геометрическом смысле, как они даются в школе в 6 классе — без групп, без матриц и даже без комплексных чисел. Также понятно, что композицию таких объектов уже нельзя посчитать поэлементным сложением. Можно ли композицию таких объектов считать таким образом, чтобы оно было коммутативно? Можно ли геометрические задачи решать обычными алгебраическими методами без привлечения линейной алгебры? Я уверен что да, но настаивать не буду. Пусть правильный ответ будет «нет», не принципиально.
Кстати, есть неверное мнение, что комплексные числа не избыточны для записи поворота, поскольку два числа на пару ортов, а кватернионы избыточны, поскольку четыр не числа на три. Это неверно. Количество элементарных поворотов в 2d — один. Поэтому неизбыточная запись должна состоять из одного числа. На самом деле, если мы посмотрим на 4d, то обнаружим, что нам понадобиться семь чисел, и вообще, формула тут простая — количество пар ортов пространства плюс один.

Подождите, уважаемые! Какие 4 степени свободы для вращения в 3D? Часто говорят о трех степенях свободы вращения: углы Эйлера, углы Крылова, единичный вектор задающий ось (2 степени свободы) + угол (еще одна степень). Если с такой точки зрения посмотреть, то единичный кватернион, на самом деле трехмерный, потому что мы любую его компоненту можем выразить через 3 другие.
Но на самом деле нам просто удобно считать повороты трехмерными в трехмерном пространстве. На самом деле они двумерные:) Любой поворот можно описать двумя скалярными значениями!
И чтобы понять двумерность кватерниона, представьте его в таком виде: q=e^{\phi i} \cdot e^{\psi j}
А что касается некоммутативность произведения кватернионов - то это отражение некоммутативность поворотов, любое адекватное описание поворотов будет некоммутативным :)

4 степени свободы в 3D это: 3 координаты в пространстве плюс состояние поворота вектора вокруг своей оси.

Для задания оси в 3D пространстве достаточно 2х координат. Один из классических способов - берем половинку сферы и проецируем ее на плоскость по которой она была обрезана. Любой оси соответствует единственная точка пересечения с этой полусферой а любой точке полусферы - единственная точка на этой плоской проекции. Третья координата нужна для указания поворота относительно этой оси, да.

Да, в 3D ось можно задать 2мя параметрами. Еще вариант, если лень резать сферу, вспомнить, что длина оси должна. быть единичной. Тогда любую компоненту оси можно найти из двух других (но возникает вопрос с ее знаком) + угол поворота. Более однозначный вариант - задать поворот не единичной осью, а вектором, длина которого соответствует углу поворота в радианах. Экспонента этого вектора и будет кватернионом.
А что касается двумерного представления поворота, тут такая штука: мы можем зафиксировать на воображаемой сфере единичного радиуса с центром в начале координат произвольную точку. Ее положение описывается двумя параметрами (например, сферическими координатами без радиуса - он ведь известная константа). Тогда поворот можно определить через вторую точку, в которую перейдет первая при повороте сферы. И имеем преобразование в двумерном пространстве => поворот двумерен.
Как между собой помирить эти две концепции? Очень просто. В двумерном преставлении каждый поворот можно получить в виде композиции поворотов вокруг 2х осей (например, x и y), назовем их базисными поворотами. Но эти базисные повороты не коммутативные. И для описания каких-то поворотов надо будет сначала выполнить поворот вокруг оси x потом вокруг y, а в других ситуациях - наоборот.
Но в обоих случаях для построения кватерниона поворота нам будет нужно два параметра \phi и \psi, а сам кватернион будет выглядеть как q=e^{\phi i} \cdot e^{\psi j} или q=e^{\psi j} \cdot e^{\phi i}
Вот и получается, что любой поворот двумерный, но их есть два вида. А введение третьей оси избавляет нас от неоднозначности.

 Более однозначный вариант - задать поворот не единичной осью, а вектором, длина которого соответствует углу поворота в радианах. 

Я даже больше скажу, каждый, кто изучал механику твёрдого тела, знает, что угол поворота \vec \varphi, угловая скорость \vec \omegaи угловое ускорение \vec \varepsilon - именно так и задаются.

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

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

Так себе обобщение. Формулы для сферической интерполяции автор не даёт, и где её брать — совершенно непонятно (особенно учитывая что автор так и не объяснил что за магия произошла в пункте 3.4)

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

Проективная геометрическая алгебра, пространство клиффорда cl301.

Да, еще хочу ответить на поставленные вопросы:

Почему \mathbf{i}^2=\mathbf{j}^2=\mathbf{k}^2=-1 и \mathbf{i} \mathbf{j} = \mathbf{k}?

\mathbf{i}^2=\mathbf{j}^2=\mathbf{k}^2=-1 по определения, а \mathbf{i} \mathbf{j} = \mathbf{k} следует из \mathbf{i} \mathbf{j} \mathbf{k} = -1 - что тоже по по определению.

Почему мы берём вектор и превращаем его в «мнимый» вектор, чтобы преобразовать его, например \mathbf{q} (x\mathbf{i} + y\mathbf{j} + z \mathbf{k}) \mathbf{q}^{*}?

Потому что сложение вращений - это произведение их кватернионов, значит преобразование из пространства вращений, заданных осями в пространство соответствующих кватернионов - это экспонента e^{a + b} = e^{a}e^{b}. А берем именно комплексные оси, потому что вращение 2\pi периодичное, как и экспонента комплексного числа.

Да кому это интересно, если всё работает, правда?

Наверное, это интересно тому, кто претендует на то, чтобы позиционировать себя как профессионала, а не как юного студента троешника :)

Sign up to leave a comment.

Articles