2015-09-10 4 views
0

Когда я запускаю свою программу, просто просматривая ось xyz, иногда перспектива меняется.
Чаще всего это выглядит как this. Но иногда это выглядит как this.
На первом изображении все, что находится на переднем плане, намного меньше. Если во втором изображении все выглядит примерно того же размера. Я предпочитаю второй образ, но я не знаю, что происходит!
Вот мой код:Ось OpenGL, представляющая разные

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)  // Resize And Initialize The GL Window 
{ 
    if (height == 0)          // Prevent A Divide By Zero By 
    { 
    height = 1;          // Making Height Equal One 
    } 

    glViewport(0, 0, width, height);      // Reset The Current Viewport 

    aspectRatio = (GLfloat)width/(GLfloat)height; 
    screenHeight = (GLfloat)height; 
    screenWidth = (GLfloat)width; 
} 

int InitGL(GLvoid)          // All Setup For OpenGL Goes Here 
{ 
    glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
    glClearColor(1.0f, 1.0f, 1.0f, 0.5f);    // Black Background 
    glClearDepth(1.0f);         // Depth Buffer Setup 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 
    return TRUE;          // Initialization Went OK 
} 

int DrawGLScene(GLvoid)         // Here's Where We Do All The Drawing 
{ 
    //3D setup 
    glDepthMask(GL_TRUE); 
    glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
    glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 
    glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix 
    glLoadIdentity();         // Reset The Projection Matrix 

    gluPerspective(45.0f, aspectRatio, 0.1f, 500.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer 

    //3D stuff 
    glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut);    // Move and zoom axes 
    glRotatef(rotateLeftRight, 0.0f, 1.0f, 0.0f);     // Rotations 
    glRotatef(rotateUpDown, 1.0f, 0.0f, 0.0f); 
    //axes 
    glLineWidth(1.0); 
    glColor3f(0.0, 0.0, 1.0); 
    glBegin(GL_LINES);//x axis 
    glVertex3f(-20.0, 0.0, 0.0); 
    glVertex3f(20.0, 0, 0); 
    glEnd(); 
    glBegin(GL_LINES);//y axis 
    glVertex3f(0.0, 20.0, 0.0); 
    glVertex3f(0.0, -20.0, 0); 
    glEnd(); 
    glBegin(GL_LINES);//z axis 
    glVertex3f(0.0, 0.0, 20.0); 
    glVertex3f(0.0, 0.0, -20.0); 
    glEnd(); 

    //2D setup 
    glDepthMask(GL_FALSE); 
    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluOrtho2D(0, screenWidth, 0, screenHeight); //left,right,bottom,top 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    //2D overlay goes here 

    return TRUE;          // Keep Going 
} 

Что я сделал это изменение, как ось выглядеть?

ответ

1

Я не вижу ничего плохого в вашем коде.

Ваш код перевода немного странно glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut);

Вы на X = -8, Y = 0 линии и вы называете ваш Z координату zoomInOut. Which is not a zoom but a position. Это то же самое, как если бы вы находились в лифте с внешним видом и смотрели на фонтан в середине квадрата внизу здания, вы не увеличиваете масштаб, вы просто смотрите ближе (like that).

Чтобы сделать реальный зум, вы должны изменить поле зрения (первый параметр gluPerspective).

Вы рисуете 3 линии от -20 до 20 по оси X, Y и Z.

На ваших снимках экрана мы почти видим их от одного конца до другого. Нет странного зажима (ваши пределы Z от gluPerspective хороши [0.1f, 500.0f]).

Тот факт, что ваш мозг когда-то не видит перспективу, должен ли это быть не ошибкой, это просто потому, что вы смотрите на плоское изображение только с двумя цветами (без тени, тумана ...).

«3D» изображения (от OpenGl & co.) - всего лишь король оптической иллюзии, а программа, которую вы написали, просто рисует плохую иллюзию.

Плохой, но правильный! Это хорошее начало.