0

C を使用して OpenGL で特定のオブジェクトを移動する際に問題が発生しています。

オブジェクトコード

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0.73, 0.06);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glRotatef(0,PacX,PacY,0);
glBegin(GL_QUADS);
    glVertex2f(ax, ay);
    glVertex2f(bx, by);
    glVertex2f(cx, cy);
    glVertex2f(dx, dy);
glEnd();
glPopMatrix();
glFlush();

これは正方形を描画しますが、ウィンドウには他のオブジェクトがあるため、glTranslatef() で正方形のみを移動しようとすると、すべてのオブジェクトが移動します。ポインターまたは ID を格納できる方法または変数はありますか?正方形だから私は正方形だけを動かすことができますか?

4

2 に答える 2

1

各オブジェクトの変換マトリックスを保存して復元し、各オブジェクトが独自のマトリックスを取得するようにする必要があります。

関数を参照してくださいglPushMatrix()

于 2012-05-24T10:31:59.687 に答える
0

OpenGL ディスプレイ リストについて読み、グラフィック カードにディスプレイ リストを割り当てます。OpenGLプログラミングガイドより

/* Create display list with Torus and initialize state*/
static void init(void)
{
   theTorus = glGenLists (1);
   glNewList(theTorus, GL_COMPILE);
   torus(8, 25);
   glEndList();

   glShadeModel(GL_FLAT);
   glClearColor(0.0, 0.0, 0.0, 0.0);
}

whereは、周囲の関数と関数によってtorus(8, 25)取り込まれる要素を描画する関数を呼び出します。次に、あなたの絵はより似ていますtheTorusglNewList(...)glEndList()

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glCallList(theTorus);
   glFlush();
}

つまり、トーラスを描画する前に、さまざまなglRotatef(...)スケーリングおよび変換呼び出しを呼び出すことによって、環境を変更できます。

私が参照を引っ張ってきた例全体は、ここからアクセスできます

いくつかのデータ構造を追加することで、オブジェクトの向きを構造体に保持し、変換を環境に適用してから、特定の表示リストを描画できます。後で環境の変換を適用解除することを忘れないでください。そうすると、表示リストに表示されている単一のオブジェクトに対して効果的に回転、移動、またはその他の操作を行ったことになります。

于 2012-05-24T14:14:39.533 に答える