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から

/*軸はすでに正規化されていると想定しています。* /

静的インラインGLKQuaternionGLKQuaternionMakeWithAngleAndAxis(float radians、float x、float y、float z);

そうです、クォータニオンを作成する前に軸を正規化する必要があります。

于 2012-09-25T19:06:15.497 に答える