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

时间:2011-06-06 13:54:24

标签: math geometry 3d

我有一个由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
}

我有特定的旋转矩阵:

{
  -1  0  0  0
   0  0  1  0 
   0 -1  0  0
   0  0  0  1
}

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

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

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

首先,我收到的四元数:

C#:  0, 0, 0.70710676908493, 0
C++: 0, -0.707107, 0, 0

从这个四元数创建矩阵:

C#:

0 0 0 0
0 0 0 0
0 0 1 0
0 0 0 1

C ++:

0 0 0 0 
0 1 0 0
0 0 0 0
0 0 0 1

为什么这是错的?

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

尝试使用4x4矩阵。我不是矩阵数学专家,但在处理3D图形时我从未使用3x3矩阵。我相信额外的维度是用于规范化,或类似的东西。