我有一个 3D 视口(viewport),它使用 WPF 3D 工具的轨迹球通过鼠标旋转对象。结果,我得到了一个 AxisAngleRotation3D,轴向量像 (0.5, 0.2, 0.6) 和角度例如35. 没关系。

作为替代方案,我想做的是让用户能够按单个轴(即 x、y、z)旋转对象。因此,如果对象围绕 (0.5, 0.2, 0.6) 轴旋转 35 度,我该如何将其转换为围绕每个轴的三个旋转,即。矢量 (1, 0, 0) 为 Xangle,矢量 (0, 1, 0) 为 Yangle,矢量 (0, 0, 1) 为 Zangle。

我还需要一种方法将它们转换回单个 AxisAngleRotation3D 对象。

编辑 :

我在 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?

最佳答案

您可以将其转换为矩阵,然后返回为三个单独的旋转表示。您可以在网上找到这两种转换的公式。您还可以通过将其写下来并在纸上求解方程来优化它,从而产生可能更快的公式。

但是,我建议永远不要用三个数字来表示旋转,这是由于这种实现和数字不稳定性导致的奇点。改用四元数。

关于WPF 3D : How to convert a single AxisAngleRotation3D into separate AxisAngleRotation3D?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3766073/

10-13 05:56