【问题标题】:Changing projection in OpenGL在 OpenGL 中更改投影
【发布时间】:2012-09-21 03:03:00
【问题描述】:

我在调整 GLUT 窗口大小时遇到​​问题。我想打印一个矩形,但是当我使用调整大小功能时,我似乎无法在窗口中绘制和塑造。我有以下代码,我想在调整窗口大小时改变正方形的宽度,但如果调整高度,我不希望它的高度改变。

#include <GLUT/glut.h>
#include <stdio.h>
#include <stdlib.h>
/* globals */
GLsizei wh = 500, ww = 500; 
/* initial window size */ 
GLfloat size = 3.0; 
/* half side length of square */

void myinit(void)
{
    glClearColor(0.0,0.0,1.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,1,0,1.0,-1.0,1.0);
    glViewport(0,0,ww,wh);
}

/* display callback -- required by GLUT 3.0 */
void renderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0,.5,.7);
    glBegin(GL_POLYGON);
        glVertex3f (0.25, 0.25, 0.0);
        glVertex3f (0.75, 0.25, 0.0);
        glVertex3f (0.75, 0.75, 0.0);
        glVertex3f (0.25, 0.75, 0.0);
    glEnd();

    glFlush();
}

void mouse(int button, int state, int x, int y) {
    if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       glOrtho(0.0,500,0.0,500,0.0,1.0);
   }
}
/*app quits if q is pressed*/
void keyboard(unsigned char key, int x, int y) {
     if(key == 'Q' | key == 'q')
        exit(0);
}

/* The main program -- note that there is no "flow of control" -- the program merely calls          functions to handle interactions */
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(ww,wh);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Square");

    myinit();

    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(renderScene);
    //glutReshapeFunc(changeSize);
    glutMainLoop();
    return 0;
}

我做了一个测试 changeSize 函数,当我使用它时,它只会显示一个空的蓝色窗口,其中没有矩形

【问题讨论】:

    标签: c opengl glut


    【解决方案1】:

    您的问题在于正交矩阵使用固定值:

    glOrtho(0.0,500,0.0,500,0.0,1.0);

    这就是说,不管我的窗口有多大,让0 的顶点位置映射到窗口的底部,而500 的顶点位置映射到窗口的顶部。

    因此,如果您有一个 500 像素高的窗口,并且您绘制了一个覆盖 100 个单位的正方形,这将映射到窗口中的 100 个像素。

    但是,如果您将窗口拉伸到 1000 像素高,那么现在您有一个从 0 到 500 的区域映射到高度为 1000 像素的窗口。因此,以前覆盖 100 像素高度的同一个正方形现在覆盖了 200 像素高度。

    如果您希望它在调整大小时始终保持相同大小,则需要更新正交矩阵以将更大的区域映射到新的更大窗口。因此,如果您更改正交矩阵以将区域 0 to windowHeight 映射到窗口,则 100 个单位的正方形将始终填充完全相同的高度。

    glOrtho( 0.0, //left
             500, //right
             0.0, //bottom
             height_in_pixels, //top
             0.0,   //near 
             1.0);  //far
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多