我有以下代码:

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

我设置代码的方式应该从左上角到右下角打印一组对角线。但是,当我运行此命令时,在窗口中心仅显示一个点。

有什么我可以做的吗?

最佳答案

无需任何额外设置,OpenGL即可使用身份转换进行模型 View 和投影。这意味着您的点的坐标将直接传递到NDC空间。 NDC空间的值范围为[-1; 1]³,即它不使用绝对设备坐标(像素),而是相对坐标。这意味着除第一个坐标为(0,0)的点之外的每个点都将在可见范围之外。

因此,要么建立一个将 View 空间坐标[0,viewport_width]×[0,viewport_height]映射到[-1; 1]²的投影,要么在NDC坐标中生成点。

顺便说一句:用OpenGL绘制单点效率很低。如果使用立即模式(glBegin,glVertex,glEnd),则更是如此。将适当的图元用于线(GL_LINE)和顶点数组。

关于c++ - 在屏幕上绘制点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18675283/

10-09 06:35