1

GL_POINTSOpenGLを使用して2Dオブジェクトを点(ではなく座標)の方向に移動する方法は?


私のコードをよりよく理解するために:

コードの大部分をさまざまなソース コードに分割しましたが、実際に形状を作成してシーンを設定しているのは次のコードです。

void setupScene(int clearColor[]) {
    glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
    //glClearColor(250, 250, 250, 1.0);  //  Set the cleared screen colour to black.
    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);  // This sets up the viewport so that the coordinates (0, 0) are at the top left of the window.

    // Set up the orthographic projection so that coordinates (0, 0) are in the top left.
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, -10, 10);

    // Back to the modelview so we can draw stuff.
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the screen and depth buffer.
}

void drawScene() {
    setupScene((int[]){250, 250, 250, 1});

    triangle(210, WINDOW_WIDTH, WINDOW_HEIGHT);

    glBegin(GL_QUADS);
    glColor3f(RGB(80), RGB(80), RGB(80));

    glPushMatrix();
    glTranslatef(400, 400, 0);
    glVertex2d(200, 100);
    glVertex2d(100, 100);
    glVertex2d(100, 200);
    glVertex2d(200, 200);
    glPopMatrix();
    glEnd();

    glutSwapBuffers();  // Send the scene to the screen.
}

void update(int value) {
    glutPostRedisplay();  // Tell GLUT that the display has changed.
    glutTimerFunc(25, update, 0);  // Tell GLUT to call update again in 25 milliseconds.
}

PS:初心者のように聞こえたら申し訳ありませんが、Java から C++ に移行したばかりなので、クロスプラットフォームのゲームをいくつか行うことができます。また、ゲームを開発したことはなく、Android、iOS、BlackBerry のアプリをいくつか開発しただけです。


解決

ありがとう@paddy、私はの使用を理解しようとしてglTranslatefいて、解決策がありました。作業コードは次のとおりです。100x100 で正方形を作成し、400x200 まで移動します。

void setupScene(int clearColor[]) {
    glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
    //glClearColor(250, 250, 250, 1.0);  //  Set the cleared screen colour to black.
    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);  // This sets up the viewport so that the coordinates (0, 0) are at the top left of the window.

    // Set up the orthographic projection so that coordinates (0, 0) are in the top left.
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, -10, 10);

    // Back to the modelview so we can draw stuff.
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the screen and depth buffer.
}

int a = 100;
int b = 200;
int x = 100;
int y = 100;

void drawScene() {
    setupScene((int[]){250, 250, 250, 1});

    triangle(210, WINDOW_WIDTH, WINDOW_HEIGHT);

    glPushMatrix();
    glTranslatef(x, y, 0);

    glBegin(GL_QUADS);
    glColor3f(RGB(80), RGB(80), RGB(80));

    glVertex2d(b, a);
    glVertex2d(a, a);
    glVertex2d(a, b);
    glVertex2d(b, b);

    glEnd();

    glPopMatrix();

    glutSwapBuffers();  // Send the scene to the screen.
}

void update(int value) {
    if (x != 400 && y != 200) {
        x += 4;
        y += 2;
    }
    glutPostRedisplay();  // Tell GLUT that the display has changed.
    glutTimerFunc(25, update, 0);  // Tell GLUT to call update again in 25 milliseconds.
}

OpenGL は思ったよりずっと簡単です。私は Java と JavaScript に慣れていたので C/C++ について常に恐れを抱いていましたが、C/C++ の素晴らしくシンプルでエレガントなところが大好きです。私を助けてくれてありがとう@paddy。:)

4

1 に答える 1

3

モデルビュー マトリックスを変換する必要があります。すでにモデルビュー モードになっていると仮定します。

glPushMatrix();
glTranslatef(x, y, z);
// Draw your shape
glPopMatrix();

[編集]

@パディ:このようなもの?これを試しましたが、四角形が動きません。pastebin.com/2PCsy5kC

モデルビュー マトリックスを明示的に選択してみてください。あなたの例は、現在どのモードにあるかを教えてくれません:

glSetMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(x, y, z);
// Draw your shape
glPopMatrix();

通常、レンダリングの開始時にすべてをリセットします... GL_PROJECTION モードに入り、呼び出しglLoadIdentity()てリセットし、カメラをセットアップしてから、GL_MODELVIEW マトリックスに対してもこれを行います。

于 2012-07-30T23:52:27.560 に答える