Проблема с вращениями заключается в том, что большинство людей думают об этом с точки зрения углов Эйлера, поскольку их легко понять.
И все же большинство людей забывают, что углы Эйлера - это три последовательных угла . Это означает, что вращение вокруг первой оси сделает следующее вращение относительно первого первоначального вращения, поэтому вы не можете независимо вращать вектор вокруг каждой из трех осей, используя углы Эйлера.
Это напрямую переводит в матрицы, когда вы умножаете две матрицы, вы можете думать об этом умножении как о преобразовании одной матрицы в пространство другой матрицы.
Это должно происходить с любыми 3 последовательными вращениями, даже при использовании кватернионов.
Я хочу подчеркнуть тот факт, что кватернионы не являются решением для блокировки gimble. На самом деле блокировка будет всегда происходить, если вы представляли углы Эйлера с помощью кватернионов. Проблема не в представлении, проблема в 3 последовательных шагах.
Решение?
Решение для поворота вектора вокруг 3-х осей независимо состоит в объединении в одну ось и один угол, таким образом вы можете избавиться от шага, на котором вы должны выполнить последовательное умножение. Это будет эффективно переводить на:
Моя матрица вращения представляет результат вращения вокруг X, Y и Z.
а не эйлерова интерпретация
Моя матрица вращения представляет вращение вокруг X, затем Y, затем Z.
Чтобы прояснить это, я процитирую из теоремы Эйлера о вращении:
Согласно теореме Эйлера о вращении, любое вращение или последовательность вращений твердого тела или системы координат вокруг неподвижной точки эквивалентно одному вращению на заданный угол вокруг неподвижной оси (называемой осью Эйлера), которая проходит через неподвижную точку. Ось Эйлера обычно представлена единичным вектором u →. Следовательно, любое вращение в трех измерениях можно представить как комбинацию вектора u → и скаляра θ. Кватернионы дают простой способ кодировать это представление оси-угла четырьмя числами и применять соответствующий поворот к вектору положения, представляющему точку относительно начала координат в R3.
Обратите внимание, что умножение 3 матриц всегда будет представлять 3 последовательных поворота.
Теперь для того, чтобы объединить вращения вокруг 3 осей, вам нужно получить одну ось и один угол, который представляет вращение вокруг X, Y, Z. Другими словами, вам нужно использовать представление оси / угла или кватерниона, чтобы избавиться от последовательных поворотов.
Обычно это делается, начиная с начальной ориентации (ориентацию можно рассматривать как угол оси), обычно представляемой как кватернион или угол оси, и затем изменяя эту ориентацию, чтобы представить ориентацию назначения. Например, вы начинаете с кватерона идентификации, а затем поворачиваетесь на разницу, чтобы достичь ориентации назначения. Таким образом, вы не теряете никакой степени свободы.