0

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関数をテストしました。これを使用すると、長方形がない空の青いウィンドウが表示されます。

4

1 に答える 1

3

問題は、正射行列に固定値を使用することにあります。

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
于 2012-09-20T18:37:48.677 に答える