У меня есть трехмерный видовой экран, который использует TrackBall 3D-инструмента WPF для вращения объекта с помощью мыши. В результате я получаю один AxisAngleRotation3D с вектором оси, таким как (0,5, 0,2, 0,6) и углом, например, 35. Хорошо.
В качестве альтернативы я хотел бы дать пользователю возможность вращать объект по отдельной оси (то есть x, y, z). Итак, если объект вращается вокруг оси (0,5, 0,2, 0,6) на 35 градусов, как я могу преобразовать это в три поворота вокруг каждой оси, т.е. Xangle для вектора (1, 0, 0), Yangle для вектора (0, 1, 0) и Zangle для вектора (0, 0, 1).
Мне также нужен способ конвертировать их обратно в один объект AxisAngleRotation3D.
EDIT
Я нашел кое-что в http://www.gamedev.net/reference/articles/article1095.asp. Одна вещь, которую я узнал, это то, что я могу легко получить (комбинированный) кватернион из отдельного AxisAngleRotation3D. Например,
private AxisAngleRotation3D _axisX = new AxisAngleRotation3D();
private AxisAngleRotation3D _axisY = new AxisAngleRotation3D();
private AxisAngleRotation3D _axisZ = new AxisAngleRotation3D();
...
_axisX.Axis = new Vector3D(1, 0, 0);
_axisY.Axis = new Vector3D(0, 1, 0);
_axisZ.Axis = new Vector3D(0, 0, 1);
...
Quaternion qx = new Quaternion(_axisX.Axis, _axisX.Angle);
Quaternion qy = new Quaternion(_axisY.Axis, _axisY.Angle);
Quaternion qz = new Quaternion(_axisZ.Axis, _axisZ.Angle);
Quaternion q = qx * qy * qz;
Это хорошо. Теперь проблема в том, как я могу сделать обратное? Итак, для данного q, как я могу узнать qx, qy, qz?