Кватернионы все еще имеют карданный замок

Вместо углов Эйлера я перешел на Quaternions, чтобы представить и обработать вращение куба в 3D. Хотя это решит проблему блокировки кардана, я все еще испытываю эту проблему.

Мой код:

// p is the point to be rotated
// angles is a Vector3D representing the rotation angles

var xaxis = new Vector3D(1, 0, 0);
var yaxis = new Vector3D(0, 1, 0);
var zaxis = new Vector3D(0, 0, 1);

p = rotate(p, xaxis, angles.x);
p = rotate(p, yaxis, angles.y);
p = rotate(p, zaxis, angles.z);

Функции rotate взяты из http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Pseudo-code_for_rotating_using_a_quaternion_in_3D_space (переведено на JavaScript).

Я предполагаю, что проблема связана с тем, что я все еще использую порядок осей (x y z), который является основной проблемой блокировки кардана.

Как можно реализовать вращение кватернионов таким образом, чтобы была решена блокировка кардана?

Заранее спасибо.


person pimvdb    schedule 10.03.2011    source источник


Ответы (2)


Кватернионы не подвержены блокировке кардана, так что это не ваша проблема. Если ваши углы x, y и z предназначены для представления чего-то вроде углов Эйлера, проблема, скорее всего, в том, что вы определяете xaxis, yaxis и zaxis относительно исходной системы координат. Но это не даст ожидаемых результатов, потому что после первого поворота вокруг оси x оси Y и Z больше не указывают в исходных направлениях, но следующие два поворота по-прежнему относятся к исходной системе координат.

person Jim Lewis    schedule 10.03.2011
comment
Это может показаться глупым, но есть ли способ сделать три оси независимыми, чтобы Y и Z по-прежнему указывали в исходных направлениях после вращения вокруг оси X? - person pimvdb; 10.03.2011
comment
На самом деле я забыл упомянуть, что использую это в 3D-движке. Вместо того, чтобы использовать определенный порядок осей, я вместо этого обновил координаты вершин куба после вращения. Так, например, в основном он сначала будет вращаться по оси X, а затем сохранит вычисленные точки, как если бы это были исходные точки. Любые возможные вращения после этого будут вести себя так, как если бы это было единственное выполненное вращение. В любом случае, все сводится к тому, что теперь блокировка кардана была сохранена с помощью кватернионов, спасибо! - person pimvdb; 10.03.2011

Как вы упомянули, проблема с блокировкой кардана возникает каждый раз, когда вы выполняете три последовательных поворота (например, углы Эйлера), чтобы перейти от инерциальной системы координат к корпусу. Это включает в себя объединение трех последовательных вращений кватернионов (с помощью операции, называемой композицией).

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

person schrödinbug    schedule 04.09.2013