Как стать автором
Обновить

Комментарии 23

Зачем после инверсии кватерниона делать его нормализацию?
Обратный кватернион предполагает только обратный разворот без масштабирования, поэтому нормализуется.

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

Давайте рассмотрим прикладную сторону вопроса и посмотрим на исходники от NVIDIA. Вот эта функция только отражает кватернион:

inline Quaternion conjugate(Quaternion::Arg q)
{
	return scale(q, Vector4(-1, -1, -1, 1));
}


А эта функция отражает и нормализует:
inline Quaternion inverse(Quaternion::Arg q)
{
	return conjugate(normalize(q));
}


Где функция нормализации выглядит так:
inline Quaternion normalize(Quaternion::Arg q, float epsilon = NV_EPSILON)
{
	float l = length(q);
	nvDebugCheck(!isZero(l, epsilon));
	Quaternion n = scale(q, 1.0f / l);
	nvDebugCheck(isNormalized(n));
	return n;
}
Вы приводили функцию, создающую кватернион поворота — длина этого кватерниона всегда равна 1. Обратный кватернион для него можно найти без нормализации.

Откуда вообще взялись кватернионы масштабирования? В статье про них — ни слова.
Вы правы. В рамках данной статьи длина кватерниона не меняется и в принципе можно без нормализации.
В одной из публикаций на тему БИНС встречал также нормализацию кватерниона в месте, где вроде бы она не требуется. Автор специально уточнил, что в кватернионной арифметике с плавающей точкой, как и везде, могут иметь место вычислительные ошибки. Уже по этой причине в ключевых местах может иметь смысл нормализацию проводить.
Смена знака — эта не та операция, на которой могут накопиться погрешности.
Вы приводили функцию, создающую кватернион поворота — длина этого кватерниона всегда равна 1. Обратный кватернион для него можно найти без нормализации.


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

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

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

Про то, что одно и то же вращение можно описать двумя кватернионами, вроде бы и так понятно.
Например давайте опишем движение стрелки часов, если ось стрелки совпадает с осью X.

В первом кватернионе вектор оси будет направлен от лицевой стороны циферблата (w = 0,7071; x = 0,7071; y = 0; z = 0), а разворот будет осуществляться по часовой стрелке. Во втором кватернионе вектор оси и направление поворота осуществляются в обратную сторону.

Про наборы углов Эйлера и складывание рамок — это скорее для статьи про углы Эйлера-Крылова. Про наборы углов может быть интересной деталью — приведите пожалуйста пример. Если я правильно понимаю, речь о том. что например, только тангаж 90 равен курс 180, тангаж 90, крен 180.
А зачем нужен Gimbals lock в статье про кватернионы? Это матричная проблема, причём матрицы вообще не тема статьи.

У меня другой вопрос к автору. Как вы вычисляете Cx и Cy?
Спасибо. Действительно статья о кватернионах не предполагает освещение вопроса о складывании рамок.

Должен спросить — что Вы понимаете под Cx и Cy?
Скриншот с F-14D Tomcat в блендере ваш собственный — в гугле дублей нет.
Подумал, что вы делаете что-то об аэродинамике.
Подумал, что вы имеете подход к этому вопросу.
Если нет, то извините.
В матрицах нет складывания рамок, это проблема рамок, которые вполне себе упоминаются — тангаж, крен и тп.
Если интересно — вот Excel-файл с макросами на котором я тренировался: файл.
Можно ли говорить, повороты в глобальной неподвижной системе(global) координат — одновременные, а локальной(local) — последовательные? Если да, то можно ли повернуть вектор в неподвижной системе последовательно чередуя повороты на бесконечно малые углы в локальной?
одновременные в смысле, полученные суммированием векторов поворота
насколько понял, чередуя повороты на бесконечно малые углы(в неподвижной системе), можно повернуть на суммарный угол(тоже в неподвижной системе)
Что такое «суммарный» угол в вашем понимании?
на вопросы из первого комментария, можно не отвечать, разобрался
суммарный угол — тот, который соответствует суммарному вектору поворота(длина соответствует углу поворота, направление — оси)
Хорошо. А то я сижу перечитываю раз десятый ).
Можно ли как-то для кватерниона ограничить вращение вокруг какой-то оси не переводя в углы эйлера и назад? (например вращение вокруг оси Z ограничивается -30 + 30).
Путём сравнения с другим кватернионом.

Спасибо за статью. Неожиданно для себя, возможно я не прав, заметил особенность: поворот вектора кватернионом дает поворот по часовой стрелке, в то время как для комплексных чисел поворот при умножении на мнимую единицу происходит против часовой стрелки. Раньше как то не обращал внимания. Правильно ли я увидел?

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории