Поверните 3D-точку Эйлера, используя кватернионы, чтобы избежать блокировки кардана

#quaternions #euler-angles

#кватернионы #эйлер-углы

Вопрос:

Во-первых, я много погуглил и проверил другие сообщения stackoverflow об этом, но не смог получить рабочий ответ или фрагмент рабочего кода. Математика — не моя сильная сторона.

Мне нужна процедура, которая берет точку камеры (CX, CY, CZ) и поворачивает ее вокруг точки обзора (LX, LY, LZ) на три угла поворота (RX, RY, RZ). Использование поворотов Эйлера в некоторых случаях приводит к блокировке кардана, чего мне нужно избегать. Итак, я услышал об использовании кватернионов.

Я нашел это, чтобы преобразовать вращения в кватернион http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm

и это для преобразования из кватерниона обратно в вращения эйлера XYZhttp://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm

Кажется, они работают нормально, но мне нужно знать, как использовать кватернион для поворота CX, CY, CZ вокруг LX, LY, LZ, а затем вернуть новые CX, CY, CZ без проблем с блокировкой кардана.

Об этом так много написано, что я уверен, хорошее объяснение и фрагмент кода помогут не только мне, но и многим другим в будущем.

Поэтому, пожалуйста, помогите, если можете. Большое спасибо.

Ответ №1:

Короткий ответ, если ваш кватернион равен Q, а новая точка камеры — C’:

 C' = Q*(C-L)*Q^-1   L
  

где точки увеличиваются на Cw = 0, а умножение и инверсия выполняются по правилам кватернионов.

В частности, пусть D = C — L. Тогда мы позволим F = Q * D:

 Fw = Qw*0  - Qx*Dx - Qy*Dy - Qz*Dz
Fx = Qw*Dx   Qx*0    Qy*Dz - Qz*Dy
Fy = Qw*Dy - Qx*Dz   Qy*0    Qz*Dx
Fz = Qw*Dz   Qx*Dy - Qy*Dx   Qz*0
  

Наконец, мы получаем C’ = F * Q ^-1 L:

 Cw' = 0
Cx' = Fw*Qx - Fx*Qw   Fy*Qz - Fz*Qy   Lx
Cy' = Fw*Qy - Fx*Qz - Fy*Qw   Fz*Qx   Ly
Cz' = Fw*Qz   Fx*Qy - Fy*Qx - Fz*Qw   Lz
  

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

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

1. Спасибо за советы. Итак, если преобразование euler в qualternion по-прежнему приводит к блокировке кардана, то как я могу изменить положение камеры в 3D пространстве и повернуть ее без каких-либо проблем? Есть ли у меня местоположение камеры XYZ и углы поворота? Я предполагаю, что я не вижу общей картины, но должен быть простой способ изменить положение камеры и повернуть ее вокруг всех 3 осей одновременно без блокировки кардана? Или это наивно?