0

私は単純な立方体を描画し、左矢印キーと右キーを押して画面に沿って移動しようとしています(それぞれ左方向と右方向)。私はgluOrtho2d(leftortho、rightortho、bottomortho、toportho)の正確な考えを持っていません。glOrtho(leftortho,rightortho,bottomortho,toportho,-1.0,1.0) を 6 つのパラメータで試しましたが、結果は同じです。立方体が右上隅に移動して消えます..この点について助けが必要です..

double leftortho=5.0,rightortho=1.0,bottomortho=5.0,toportho=1.0;

void init(void) 
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
}

void display(void)
{
    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f (1.0, 1.0, 1.0);
    glutWireCube (1.0);

    gluOrtho2D(leftortho,rightortho,bottomortho,toportho);
    glFlush ();
}

void reshape (int w, int h)
{
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
}

float move_unit = 0.001;
void keyboardown(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_RIGHT:
        {
        leftortho+=move_unit;
        rightortho+=move_unit;
        //bottomortho+=move_unit;
        //toportho+=move_unit;

        break;
        }

    case GLUT_KEY_LEFT:
        {
        leftortho-=move_unit;
        rightortho-=move_unit;
        //bottomortho-=move_unit;
        //toportho-=move_unit;

        break;
        }

    case GLUT_KEY_UP:
        //posY+=move_unit;;
        break;

    case GLUT_KEY_DOWN:
        // posY-=move_unit;;
        break;

    default:
        break;
    }
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    init ();
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape);
    glutSpecialFunc(keyboardown);
    glutMainLoop();
    return 0;
}
4

2 に答える 2

1

これを試してみてください:

#include <GL/glut.h>

double leftortho=-1.0;
double rightortho=1.0;
double bottomortho=-1.0;
double toportho=1.0;
float move_unit = 0.01;
void keyboardown(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_RIGHT:
        leftortho-=move_unit;
        rightortho-=move_unit;
        break;

    case GLUT_KEY_LEFT:
        leftortho+=move_unit;
        rightortho+=move_unit;
        break;

    case GLUT_KEY_UP:
        toportho-=move_unit;
        bottomortho-=move_unit;
        break;

    case GLUT_KEY_DOWN:
        toportho+=move_unit;
        bottomortho+=move_unit;
        break;

    default:
        break;
    }
    glutPostRedisplay();
}

void display(void)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glShadeModel (GL_FLAT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho(leftortho,rightortho,bottomortho,toportho, -10, 10);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3f (1.0, 1.0, 1.0);
    glutWireCube (1.0);

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    glutDisplayFunc(display); 
    glutSpecialFunc(keyboardown);
    glutMainLoop();
    return 0;
}
于 2013-04-28T17:55:21.123 に答える
0

問題は、を呼び出す前に射影行列をリセットしていないgluOrtho2d()ため、移動が累積していることだと思います。これを行う必要があると思います:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2d(left,right,bottom,top);

また、上下が入れ替わっているように見えることに注意してください。これは合法ですが、左矢印キーと右矢印キーが逆に見える場合があります。それは基本的にあなたの変換を後方と逆さまに設定します。

于 2013-04-28T06:40:30.200 に答える