7

x軸とy軸を中心に立方体を単純に回転させようとしています。

常にx軸上で立方体をxだけ回転させ、x軸の回転とは無関係にy軸上で立方体をyだけ回転させたい

最初に私は素朴にやった:

glRotatef(x,1,0,0);
glRotatef(y,0,1,0);

それから

ただし、最初にx上で回転し、次にyi上で回転します。xアクセスとは関係なく、y上で回転します。

クォータニオンを調べ始めたので、試してみました:

Quaternion Rotation1;
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY);
Rotation1.normalize();

Quaternion Rotation2;
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX);
Rotation2.normalize();

GLfloat Matrix[16];

Quaternion q=Rotation2 * Rotation1;

q.createMatrix(Matrix);
glMultMatrixf(Matrix);

これは、2つの連続したglRotatesを実行して達成されたことをほぼ正確に実行します...したがって、1つまたは2つのステップが欠落していると思います。

クォータニオンは進むべき道ですか、それとも別のものを使用する必要がありますか?また、クォータニオンがどのステップを追加してキューブを各軸から独立して回転させることができるかを判断する方法である場合。他の誰かが同じ問題を抱えていると思います: OpenGLシーンを2軸で回転させる

4

4 に答える 4

3

クォータニオンを使用してこれを正しく機能させることができました。他の方法もあると思いますが、再設定した後、これは完全に機能しました。同様のバージョンを別のフォーラムに投稿しました。http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

最初に変化角x/yのクォータニオン表現を作成し、次に各フレームが変化する角度クォータニオンを累積クォータニオンに乗算し、最後にそのクォータニオンをマトリックス形式に変換して現在のマトリックスを乗算します。ループのメインコードは次のとおりです。

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX));
Quaternion3DNormalize(&Rotation1);

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY));
Quaternion3DNormalize(&Rotation2);


Matrix3D Mat;
Matrix3DSetIdentity(Mat);
Quaternion3DMultiply(&QAccum, &Rotation1);

Quaternion3DMultiply(&QAccum, &Rotation2);

Matrix3DSetUsingQuaternion3D(Mat, QAccum);
globalRotateX=0;
globalRotateY=0;

glMultMatrixf(Mat);

次に、立方体を描画します

于 2010-07-29T05:50:53.053 に答える
0

あなたの問題はジンバルロックではありません。そして事実上、使用しているクォータニオンは回転行列と数学的に同一であるため、クォータニオン バージョンがマトリックス (glRotate) バージョンよりもうまく機能する理由はありません。

マウス コントロールが必要な場合は、おそらくarcballsを確認することをお勧めします。

于 2010-07-28T17:21:25.377 に答える
0

あなたが何をしようとしているのか、そしてあなたが得ている結果があなたが望む結果とどのように異なるのかについて、より詳細な説明を与えることができれば、それは大いに役立ちます. しかし、一般に、回転にオイラー角を使用するといくつかの問題が生じます。回転を組み合わせると直感的でない動作が発生する可能性があるためです (最悪の場合、自由度が失われます)。

必要な回転を表す 1 つの軸と 1 つの角度を見つけることができる場合は、Quaternion slerp が適している可能性があります。しかし、クォータニオンを使用して X 軸と Y 軸を中心に連続して回転を行っても、オイラー回転の構成に固有の問題を回避するのには役立ちません。

ただし、リンク先の投稿には別の問題が含まれているようです。投稿者は、オブジェクトを移動してから回転を行っているように見えますが、最初に回転してから移動する必要があります。

于 2010-07-28T03:26:31.300 に答える
0

何を達成したいのか明確ではありません。おそらく、いくつかの点と、それらを回転させたい場所について考える必要があります。たとえば、頂点 (1,1,1) を (0,1,0) にマップする必要があります。次に、その情報から、必要な回転を計算できます。

クォータニオンは、通常、2 つの回転「位置」の間を補間するために使用されます。したがって、ステップ 1 は、まだ持っていない開始位置と終了位置を特定することです。それができたら、クォータニオンを使用して補間します。ここには時間的に変化する側面があるようには聞こえません。

于 2010-07-28T04:07:34.377 に答える