为何在远离原点绘制点时OpenGL窗口显示空白?
问题分析与解决
你的问题核心是OpenGL默认的可见区域范围太小,导致初始坐标(10,10)的点被裁剪掉了,所以窗口显示空白。
为什么会这样?
OpenGL默认的投影矩阵和模型视图矩阵会把标准化设备坐标(NDC)的[-1, -1]到[1, 1]区域映射到整个窗口。当你的点坐标是(10,10)时,这个位置远在NDC范围之外,会被OpenGL的裁剪阶段直接丢弃,自然看不到任何内容。
另外还有个潜在问题:你在display函数里直接修改全局变量m[1],而display会被GLUT多次调用(比如窗口重绘、resize时),这会导致每次重绘时点的位置都往下偏移,最终也会跑出可见区域。
解决方法
1. 设置合适的正交投影矩阵
通过gluOrtho2D(或者glOrtho)定义你需要的可见坐标范围,让(10,10)落在这个范围内。比如如果你想显示x从0到20、y从0到20的区域,就可以在初始化时设置这个投影。
2. 避免在display中修改全局变量
把点的位置计算放在局部变量里,或者每次display时重置初始坐标,防止多次重绘导致位置偏移。
修改后的代码示例
#include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <iostream> #include <cmath> const int WINDOW_WIDTH = 800; const int WINDOW_HEIGHT = 600; const int SPIRAL_SIZE = 200; // 初始坐标 float m[2] = {10.0f, 10.0f}; void init() { // 设置正交投影,定义可见区域:x从0到20,y从0到20 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 20.0, 0.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display() { glPointSize(3.0); glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); // 使用局部变量保存当前初始位置,避免修改全局变量导致多次重绘偏移 float currentX = m[0]; float currentY = m[1]; for (int i = 1; i <= 5; ++i) { glBegin(GL_POINTS); glVertex2f(currentX, currentY); currentY += 0.05; glEnd(); } glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); glutCreateWindow("Example"); init(); // 调用初始化投影的函数 glutDisplayFunc(display); glutMainLoop(); return 0; }
额外说明
- 如果你需要更大的可见区域,只需要调整
gluOrtho2D的参数即可,比如gluOrtho2D(-50.0, 50.0, -50.0, 50.0)可以显示x和y从-50到50的区域。 - 记得在
init函数里设置矩阵模式,先切换到投影矩阵,设置完再切回模型视图矩阵,这是OpenGL固定管线的标准流程。
内容的提问来源于stack exchange,提问作者vashist99
相关产品推荐
相关产品推荐

