1

私はこのコードを持っています:

#include <iostream>
#include <vector>

using std::vector;

#ifdef __APPLE__
#include <GLUT/GLUT.h>
#else
#include <GL/GLUT.h>
#endif

#define heightWindow 500
#define widthWindow 500

struct point {
    double x;
    double y;
};

vector<struct point> arr(heightWindow);

void renderScene();

int main(int argc, char **argv)
{
    int k = 0;
    for (struct point& i : arr) {
        i.x = k;
        i.y = k;
        k++;
    }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(widthWindow, heightWindow);
    glutCreateWindow("2D NBody Problem");
    glutDisplayFunc(renderScene);
    glPointSize(3.0);
    glutMainLoop();
    return 1;
}

void renderScene() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    glColor3f(1.0, 1.0, 1.0);
    for (struct point& i : arr) {
        glVertex2f(i.x, i.y);
    }
    glEnd();
    glFinish();
    glutSwapBuffers();  
}

コードを設定した方法では、左上から右下に斜めの点のセットを出力する必要があります。しかし、これを実行すると、ウィンドウの中央に 1 つのポイントのみが表示されます。

これについて私にできることはありますか?

4

2 に答える 2

5

特別な設定をしなくても、OpenGL はモデルビューとプロジェクションに恒等変換を使用します。これは、ポイントの座標が NDC 空間に直接渡されることを意味します。NDC 空間の値の範囲は [-1;1]³ です。つまり、絶対デバイス座標 (ピクセル) ではなく、相対座標を使用しています。つまり、座標 (0,0) を持つ最初のポイントを除くすべてのポイントが可視範囲外になります。

したがって、ビュー空間座標 [0,viewport_width]×[0,viewport_height] を [-1;1]² にマッピングする投影を設定するか、NDC 座標でポイントを生成します。

ところで: OpenGL での単一点の描画はかなり非効率的です。即時モード (glBegin、glVertex、glEnd) が使用されている場合はなおさらです。ライン (GL_LINE) と頂点配列に適切なプリミティブを使用します。

于 2013-09-07T16:34:11.870 に答える
0

そのスケーリングの問題です。最初の点以外はすべてキャンバスの外に描画されます。

次のようなものが必要です

        glVertex2f(i.x / widthWindow, i.y / heightWindow);

他のコメンテーターが指摘したように、これは (a) 対角線の半分しか与えず、(b) 射影行列を指定するよりもエレガントではありません。

別の方法は次のことです

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, widthWindow, 0, heightWindow, -1, 1);

glBegin() を呼び出す前に。

于 2013-09-07T16:33:59.657 に答える