D3DXMatrixDecompose给出了与D3DXQuaternionRotationMatrix不同的四元数

在试图解决这个问题时 ,我把这个问题追溯到旋转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!