1

I have this code:

#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();  
}

The way I have set up my code, it should print a diagonal set of points from the upper left to the bottom right. But when I run this, only one point is shown, at the center of the window.

Is there anything that I can do about this?

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 回答