在试图解决这个问题时 ,我把这个问题追溯到旋转matrix到四元数的转换。 具体来说,请考虑以下matrix:
-0.02099178 0.9997436 -0.008475631 0 0.995325 0.02009799 -0.09446743 0 0.09427284 0.01041905 0.9954919 0 0 0 0 1
SlimDX.Quaternion.RotationMatrix
(调用D3DXQuaternionRotationMatrix给出了与SlimDX.Matrix.Decompose
(使用SlimDX.Matrix.Decompose
)不同的答案。它们给出的答案(在规范化之后)是:
XYZW Quaternion.RotationMatrix -0.05244324 0.05137424 0.002209336 0.9972991 Matrix.Decompose 0.6989997 0.7135442 -0.03674842 -0.03006023
这是完全不同的(注意X,Z和W的标志是不同的)。 请注意,这些不是q / -q(表示相同旋转的两个四元数)。 他们面对完全不同的方向。
我注意到matrix的旋转与matrix非常接近(animation中的连续帧), Matrix.Decompose
版本提供了一个解决scheme,可以大幅翻转并偶尔进入所需的位置,而Quaternion.RotationMatrix
版本则提供了解决scheme这是稳定的,但走错了方向。 这只是在我的animation中的右臂 – 对于左臂,这两个函数都给出了正确的解决scheme,这是正确的解决scheme,这是相同的四元数在容错范围内。
这让我觉得有一些数字不稳定或奇怪的东西与迹象进行。 我试着实现这一点 ,然后这个 ,但都给了我一个完全不正确的解决scheme(即使对于SlimDX的工作正常的matricies) – 也许行和列翻转?
问题不是转换函数,问题是inputmatrix。 它不是一个仿射变换matrix,因为旋转部分不是一个纯旋转matrix,它有一个或多个翻转/否定轴。
只有旋转matrix可以转换为四元数。 更具体地说,旋转matrix是具有行列式 1的正交matrix ,其他inputmatrix将给出错误的结果。
A)input:
-0.02099178 0.9997436 -0.008475631 0.995325 0.02009799 -0.09446743 0.09427284 0.01041905 0.9954919 Determinant: -1
B)基本上是:
0 1 0 1 0 0 0 0 1 Determinant: -1
C)通过旋转单位matrix,永远不可能达到这个matrix:
1 0 0 0 1 0 0 0 1 Determinant: 1
与C)相比,你可以看到在B)中只有x轴和y轴被交换),与单位matrix相比,z轴保持不变。 这是不可能的纯粹的旋转,也有翻转/镜像,使其不再是一个旋转matrix(行列式!= 1)。
交换x轴和y轴的纯旋转必须具有这样的负Z轴:
0 1 0 1 0 0 0 0 -1 Determinant: 1
那么你是如何创建这个matrix的? 这不是一个有效的旋转matrix,你可以使用它作为转换为四元数的input!