有损转换矩阵 - >四元数 - >矩阵

Jer*_*rry 4 math 3d geometry

我有一个由8分定义的方框.从这些点开始,我计算轴并创建旋转矩阵,如下所示:

axis[0], axis[1], axis[2]
mat = 
{
  axis[0].x axis[1].x axis[2].x 0
  axis[0].y axis[1].y axis[2].y 0
  axis[0].z axis[1].z axis[2].z 0
  0         0         0         1
}
Run Code Online (Sandbox Code Playgroud)

我有特定的旋转矩阵:

{
  -1  0  0  0
   0  0  1  0 
   0 -1  0  0
   0  0  0  1
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是一个有效的旋转矩阵.它的反演等于它的转置.

现在我想将此矩阵存储为四元数.但是后来,我需要从这个四元数中重新创建旋转矩阵.我相信从矩阵到四元数并返回到矩阵的转换应该是一个恒等变换,我应该得到我在开始时所拥有的相同矩阵(可能具有非常小的数值误差).

但事实似乎并非如此.SlimDX(C#)和我的属性数学库(C++)都返回无效矩阵.

首先,我收到的四元数:

C#:  0, 0, 0.70710676908493, 0
C++: 0, -0.707107, 0, 0
Run Code Online (Sandbox Code Playgroud)

从这个四元数创建的矩阵:

C#:

0 0 0 0
0 0 0 0
0 0 1 0
0 0 0 1
Run Code Online (Sandbox Code Playgroud)

C++:

0 0 0 0 
0 1 0 0
0 0 0 0
0 0 0 1
Run Code Online (Sandbox Code Playgroud)

为什么这是错的?

我也试过这个:http://cache-www.intel.com/cd/00/00/29/37/293748_293748.pdf,但它也给了我不好的结果.

Ray*_*Ray 7

你给出的矩阵不是旋转矩阵,它是一个反射矩阵,因为它的行列式是-1.请参阅维基百科上的定义.你可以告诉一些事情是不对的,因为你应该得到一个单位四元数,然而你得到的那个只有1/sqrt(2)的长度.

  • 那么你的第三个轴实际上并不是独立的.尝试将它计算为前两个轴的叉积(例如,给出轴[2] =(0,-1,0).这应该总是给你一个合适的旋转矩阵. (2认同)