我有这段代码:
#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();
}
我设置代码的方式应该是从左上角到右下角打印一组对角点。但是当我运行它时,只在窗口的中心显示一个点。
我能做些什么吗?
答案 0 :(得分:4)
没有任何额外设置,OpenGL使用身份转换进行模型视图和投影。这意味着您的点的坐标将直接传递到NDC空间。 NDC空间的值范围为[-1; 1]³,即它不使用绝对设备坐标(像素),而是使用相对坐标。这意味着除了第一个点之外的每个点,坐标(0,0)都在可见范围之外。
因此要么设置一个投影,将视图空间坐标[0,viewport_width]×[0,viewport_height]映射到[-1; 1]²,要么生成NDC坐标中的点。
BTW:使用OpenGL绘制单点效率相当低。如果使用立即模式(glBegin,glVertex,glEnd)则更是如此。对线(GL_LINE)和顶点数组使用正确的基元。答案 1 :(得分:0)
这是一个扩展问题。除了第一点之外的所有点都是在画布之外绘制的。
你需要像
这样的东西 glVertex2f(i.x / widthWindow, i.y / heightWindow);
正如其他评论者所指出的,这(a)只给出对角线的一半,而(b)不如指定投影矩阵那么优雅。
另一种方法是
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, widthWindow, 0, heightWindow, -1, 1);
在你调用glBegin()之前。