You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在远离原点绘制点时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:01:36