2013-04-28 2 views
0

Я пытаюсь рисовать и простую куб и перемещать его по экрану в левой стрелке и правой клавишей вниз (влево и вправо соответственно). У меня нет точной идеи gluOrtho2d (leftortho, rightortho, bottomortho, toportho). Я попробовал glOrtho (leftortho, rightortho, bottomortho, toportho, -1.0,1.0) с шестью параметрами, но результат тот же. Куб перемещается в верхнем правом углу и исчезает .. Мне нужна помощь в этом отношении ..Open GL установка орфографической проекции

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; 
} 

ответ

0

Я думаю, что проблема в том, что вы не сбросить матрицу проекции перед вызовом gluOrtho2d(), поэтому ваши движения накапливаются. Я думаю, что вам нужно сделать, это:

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

Заметим также, что слева и справа, кажется, поменялись местами, как это делают свой низ и верх. Это законно, но может привести к тому, что клавиши со стрелками влево и вправо будут отображаться в обратном порядке. Это в основном заставляет ваше преобразование быть назад и вверх дном.

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; 
}