3

オブジェクトの回転に苦労しています。この小さなプログラムを使用して、AR Drone 2.0 からのジャイロの読み取り値を説明したいと思います。最初にこの短いビデオを見たいと思うかもしれません: http://youtu.be/HvrLS8Olr2c

スライダーは、で行われるx、y、z回転用です

glRotatef(rotationX, x_vect.x, x_vect.y, x_vect.z);
glRotatef(rotationY, y_vect.x, y_vect.y, y_vect.z);
glRotatef(rotationZ, z_vect.x, z_vect.y, z_vect.z);

値は次のとおりです。

Vector x_vect = {1.0f, 0.0f, 0.0f};
Vector y_vect = {0.0f, 1.0f, 0.0f};
Vector z_vect = {0.0f, 0.0f, 1.0f};

この小さなアプリの完全なソース コードは、http: //ablage.stabentheiner.de/2013-01-21_openglimportmodel.zipからダウンロードできます。

問題は、最初に Y 軸を回転させてから、X スライダーで再生しようとすると、本来あるべき軸を回転させないことです (比較については、C4D アニメーションを参照してください)。X回転を先に行ってからY回転を行っているからだと思います。コード行を入れ替えても問題は解決しませんが、問題を別の軸にプッシュします..

4

2 に答える 2

3

これは、呼び出すglRotatef()とオブジェクトのピボットが回転するために発生します。この美しいダイを見てください:
素晴らしいd6

x軸が4と3を通り(d6の反対側は常に7になる)、z軸が6と1を通り、y軸が2と5を通ると想像してください。
このコードを書く場合:

glRotatef(90,1,0,0);
glRotatef(90,0,1,0);

ダイは最初にそのx軸を中心に90度回転し、6を上部の側面にします。ただし、軸はダイに対して相対的なままであるため、次の呼び出しでは、2と5を通る軸を中心にダイを回転させたままにし、側面を6で右に効果的に回転させます。これらの呼び出しを回して、最初にダイをy軸を中心に回転させると、6のある側が最初に右に移動し、上部に移動します。

さて、それは邪魔になりません。オブジェクト自体を回転させるのではなく、オブジェクトを中心にカメラを回転させることができます。アークボールカメラの実装について読むことをお勧めします。これは良いスタートのようです。

于 2013-01-22T08:17:08.077 に答える
1

http://doc-snapshot.qt-project.org/4.8/opengl-grabber.html

http://doc-snapshot.qt-project.org/4.8/opengl-grabber-glwidget-cpp.html

Qt で opengl でローテーションを行っていたとき、grabber の例は非常に役に立ちました。これは glwidget.cpp の一部です。

void GLWidget::paintGL()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glPushMatrix();
// Here is the rotation code:
 glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
 glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
 glRotated(zRot / 16.0, 0.0, 0.0, 1.0);

 drawGear(gear1, -3.0, -2.0, 0.0, gear1Rot / 16.0);
 drawGear(gear2, +3.1, -2.0, 0.0, -2.0 * (gear1Rot / 16.0) - 9.0);

 glRotated(+90.0, 1.0, 0.0, 0.0);
 drawGear(gear3, -3.1, -1.8, -2.2, +2.0 * (gear1Rot / 16.0) - 2.0);

 glPopMatrix();
}
于 2013-01-21T20:45:58.020 に答える