意外投射

时间:2013-04-17 23:24:42

标签: opengl

它应该是rect,这将占用窗口的整个宽度。我期待这一点,因为平截头体宽度为-5到5,矩形尺寸为10x10,而矩形位于相同的z轴位置,就像截头锥体的近似。结果非常小,看起来不像一个矩形,我不知道为什么?

void GLWidget::initializeGL() {

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
}

void GLWidget::resizeGL(int w, int h) {

    glViewport(0,0, w, h);
    glMatrixMode(GL_PROJECTION);
    double ratio = (double)w/(double)h;
    double size = ((10.0/ratio)/2.0);
    glFrustum(-5.0, 5.0, -size, size, 10.0, 50.0);

}

void GLWidget::paintGL() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -10.0f);

    glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_QUADS);
    glVertex3f(5.0f, -5.0f, 0.0f);
    glVertex3f(5.0f, 5.0f, 0.0f);
    glVertex3f(-5.0f, 5.0f, 0.0f);
    glVertex3f(-5.0f, -5.0f, 0.0f);
    glEnd();

    glFlush();


}

1 个答案:

答案 0 :(得分:1)

  

它应该是rect,这将占用窗口的整个宽度。

那么,在绘制矩形时,将投影切换为更适合的东西,即正射投影。此外,您必须在应用视锥或正射之前将投影矩阵重置为标识。

提示:resizeGL中的所有代码都应该进入paintGL方法。我看到你正在使用Qt,所以你可以使用widthheight getter函数方便地获取小部件的宽度和高度。同样glClearColor也会进入painGL

void GLWidget::initializeGL() {
}

void GLWidget::resizeGL(int w, int h) {


}

void GLWidget::paintGL()
{
    double const ratio = (double)width()/(double)height();
    double const size = ((10.0/ratio)/2.0);

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0,0, width(), height());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-5.0, 5.0, -size, size, 10.0, 50.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -10.0f);

    draw_perspective_stuff();

    glViewport(0,0, width(), height());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // using identity projection, this fills the viewport
    glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_QUADS);
    glVertex3f(-1.f, -1.f, 0.0f);
    glVertex3f( 1.f, -1.f, 0.0f);
    glVertex3f( 1.f,  1.f, 0.0f);
    glVertex3f(-1.f,  1.f, 0.0f);
    glEnd();

    glFlush();
}