我必须误解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旨在将四元数表示转换为矩阵表示。
那么,为什么那些人不同意?在四元数创建之前,我是否需要规范化轴?事实上,这似乎解决了这个问题,但我不认为它是以这种方式记录的。
答案 0 :(得分:2)
来自GLKQuaternion.h
/ * 假设轴已经标准化。 * /
static inline GLKQuaternion GLKQuaternionMakeWithAngleAndAxis(float radians,float x,float y,float z);
所以是的,你需要在创建四元数之前规范化轴。