0

我一定误解了 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 旨在将四元数表示转换为矩阵表示。

那么,为什么那些人不同意呢?我需要在创建四元数之前对轴进行归一化吗?事实上,这似乎可以解决问题,但我不相信它是以这种方式记录的。

4

1 回答 1

2

来自 GLKQuaternion.h

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

静态内联GLKQuaternion GLKQuaternionMakeWithAngleAndAxis(float radians, float x, float y, float z);

所以是的,您确实需要在创建四元数之前对轴进行归一化。

于 2012-09-25T19:06:15.497 回答