C 在OpenGL中改变投影

C 在OpenGL中改变投影,c,opengl,glut,C,Opengl,Glut,我无法调整过剩窗口的大小。我想打印一个矩形,但当我使用调整大小功能时,我似乎无法在窗口中绘制和塑造。我有下面的代码,我想改变宽度的广场,当我调整窗口,但如果高度调整,我不希望它的高度改变 #include <GLUT/glut.h> #include <stdio.h> #include <stdlib.h> /* globals */ GLsizei wh = 500, ww = 500; /* initial window size */ GLfloa

我无法调整过剩窗口的大小。我想打印一个矩形,但当我使用调整大小功能时,我似乎无法在窗口中绘制和塑造。我有下面的代码,我想改变宽度的广场,当我调整窗口,但如果高度调整,我不希望它的高度改变

#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;
}
#包括
#包括
#包括
/*全球的*/
GLsizei wh=500,ww=500;
/*初始窗口大小*/
GLfloat大小=3.0;
/*正方形的半边长*/
void myinit(void)
{
glClearColor(0.0,0.0,1.0,1.0);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,1,0,1.0,-1.0,1.0);
glViewport(0,0,ww,wh);
}
/*显示回调——GLUT 3.0所需*/
void renderScene(void)
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
GL3F(1.0,5,7);
glBegin(GL_多边形);
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);
格伦德();
glFlush();
}
无效鼠标(int按钮、int状态、int x、int y){
如果(按钮==GLUT\U RIGHT\U按钮和状态==GLUT\U DOWN){
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0.0500,0.0500,0.0,1.0);
}
}
/*如果按q,应用程序将退出*/
无效键盘(无符号字符键,整数x,整数y){
如果(键=='Q'|键=='Q')
出口(0);
}
/*主程序——请注意,没有“控制流”——程序只调用函数来处理交互*/
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitWindowSize(ww,wh);
位置(100100);
玻璃窗(“方形”);
myinit();
glutMouseFunc(小鼠);
键盘Func(键盘);
glutDisplayFunc(渲染场景);
//GLUTEFUNC(更改大小);
glutMainLoop();
返回0;
}

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

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

glOrtho(0.0500,0.0500,0.0,1.0)

这说明,无论我的窗口有多大,都要将
0
的顶点位置映射到窗口的底部,并将
500
映射到窗口的顶部

因此,如果你有一个500像素高的窗口,你画了一个覆盖100个单位的正方形,这将映射到窗口中的100个像素

但是,如果将窗口拉伸到1000像素高,则现在有一个从0到500的区域映射到1000像素高的窗口。所以,同样的正方形,曾经覆盖100个像素的高度,现在覆盖200个像素的高度

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

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

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

glOrtho(0.0500,0.0500,0.0,1.0)

这说明,无论我的窗口有多大,都要将
0
的顶点位置映射到窗口的底部,并将
500
映射到窗口的顶部

因此,如果你有一个500像素高的窗口,你画了一个覆盖100个单位的正方形,这将映射到窗口中的100个像素

但是,如果将窗口拉伸到1000像素高,则现在有一个从0到500的区域映射到1000像素高的窗口。所以,同样的正方形,曾经覆盖100个像素的高度,现在覆盖200个像素的高度

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

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