我有一个由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但它也给了我不好的结果。
答案 0 :(得分:7)
你给出的矩阵不是旋转矩阵,它是一个反射矩阵,因为它的行列式是-1。请参阅维基百科上的definition。你可以告诉一些事情是不对的,因为你应该得到一个单位四元数,然而你得到的那个只有1 / sqrt(2)的长度。
答案 1 :(得分:0)
尝试使用4x4矩阵。我不是矩阵数学专家,但在处理3D图形时我从未使用3x3矩阵。我相信额外的维度是用于规范化,或类似的东西。