2

ポリゴンを作成し、マウス ボタンを離したときに平行移動/回転しようとしています。glBeginandを使用してポリゴン全体を再描画すると、これを行うことができますがglEnd、画面上にポリゴンを一度描画したことがあり、同じオブジェクトを使用して回転/移動を適用したいだけなので、これが本当に必要かどうかはわかりませんそれに。

以下にスニペットを入れています。

if(state == GLUT_UP){

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glRotatef(90,0,0,1);
    //  glTranslatef(50,-50,0);
    /*
    glBegin(GL_POLYGON);
    glVertex2i (-40,40) ; //Specify li ne - se gme nt ge ometry .
    glVertex2i (-30 , -40) ;
    glVertex2i (0 , 20) ;
    glVertex2i (40 , 35) ;
    glEnd() ;
    */
    glClear(GL_COLOR_BUFFER_BIT);
    glPopMatrix();
    glutSwapBuffers();
    //  glutPostRedisplay();
}
4

2 に答える 2

12

私と話してください: 「二度と OpenGL 描画呼び出しをイベント ハンドラーに入れることはありません!」

イベント ハンドラーでは、イベントに従っていくつかの変数を設定し、次に再描画呼び出しを発行し、レンダリング関数で変数の内容に従って描画します。

アップデート:

また、OpenGL は、描画したものを「記憶」しません。描画コマンドを送信すると、OpenGL がその行為を行い、それを忘れます。残っている唯一のトレースは、フレーム バッファ上のピクセルに変換されたフラグメントです。ただし、フレームバッファの内容は、変換や OpenGL の状態変化の影響を受けません。描画のみがフレーム バッファに影響します。

于 2012-10-03T09:37:27.240 に答える
0

コード全体を再度記述する必要はありません。

表示関数 ( glut window へのコールバックを として登録する引数として使用する同じ void 関数glutDisplayFunc(display)) に、上記のコード スニペットを配置します。

glPushMatrix()..glPopMatrix()シーケンス内で、回転軸とともに呼び出しGLfloat内に変数 (できればタイプ) の角度を入れます。引数glRotatef()についても同じことができます。glRotatef()

マウスまたはキーボードを使用して回転または平行移動する場合は、glutMouseFunc()またはを使用glutKeyboardFunc()してコールバックを GLUT に登録します。アニメーションが必要な場合は、関数を に登録できますglutIdleFunc()

コード スニペットは次のようになります。

void handler(...){
angle+=some_value;

//angle reset not so necessary but good,
 if you somehow are using that angle value somewhere else
  if(angle>360)
  angle=0;

glutPostRediplay();
}

キーボード:

handler(unsigned char key, int x, int y);

ねずみ:

handler(int button, int state, int x, int y);

アイドル関数 (連続アニメーション用)

handler(void);
于 2013-05-27T16:48:12.687 に答える