GLKit四元数代码与矩阵代码不一致?

时间:2012-09-10 19:54:18

标签: matrix rotation quaternions glkit

我必须误解GLKit对四元数和旋转矩阵的处理。在下面的代码片段中,我希望矩阵a和b最终会有相同的内容(受浮点错误影响)......

GLKQuaternion q = GLKQuaternionMakeWithAngleAndAxis(M_PI / 2, 1, 1, 1);
GLKMatrix3 a = GLKMatrix3MakeWithQuaternion(q);
GLKMatrix3 b = GLKMatrix3MakeRotation(M_PI / 2, 1, 1, 1);

然而,他们不同意。差远了。在列主要顺序中,数组包含...

a.m[0]=0.000000 b.m[0]=0.333333
a.m[1]=1.000000 b.m[1]=0.910684
a.m[2]=0.000000 b.m[2]=-0.244017
a.m[3]=0.000000 b.m[3]=-0.244017
a.m[4]=0.000000 b.m[4]=0.333333
a.m[5]=1.000000 b.m[5]=0.910684
a.m[6]=1.000000 b.m[6]=0.910684
a.m[7]=0.000000 b.m[7]=-0.244017
a.m[8]=0.000000 b.m[8]=0.333333

我认为GLKQuaternionMakeWithAngleAndAxis和GLKMatrix3MakeRotation都采用弧度x,y,z来表示指定弧周围指定弧度的旋转。我认为GLKMatrix3MakeWithQuaternion旨在将四元数表示转换为矩阵表示。

那么,为什么那些人不同意?在四元数创建之前,我是否需要规范化轴?事实上,这似乎解决了这个问题,但我不认为它是以这种方式记录的。

1 个答案:

答案 0 :(得分:2)

来自GLKQuaternion.h

  

/ *   假设轴已经标准化。   * /

     

static inline GLKQuaternion GLKQuaternionMakeWithAngleAndAxis(float radians,float x,float y,float z);

所以是的,你需要在创建四元数之前规范化轴。