Search code examples
openglglulookat

Why isn't this square in the middle of the screen?


I wrote some code, expecting to see a square in the middle of the screen, instead the square appears higher up, in some aspect ratios near the top of the screen, and slightly to the left.

here's what's drawn on my screen

With another aspect ratio:

another example

Here's the relevant part of my code:

void resize(uint32_t height, uint32_t width){
    glViewport(0, 0, width, height);

    glMatrixMode (GL_PROJECTION); //set the matrix to projection
    glLoadIdentity();
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 1000.0);
}


void draw(){
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    //set up camera
    glLoadIdentity();
    gluLookAt(0,10,0,0,0,0,0.001,0.999,0);

    //draw a square in the center of the screen
    glBegin(GL_TRIANGLE_FAN);
    glColor4f(0,1,1,1);
    glVertex3f(-1,0,-1);
    glVertex3f(-1,0,1);
    glVertex3f(1,0,1);
    glVertex3f(1,0,-1);
    glEnd();

    glPopMatrix();
}

Isn't 0,0,0 supposed to be the middle of the screen? And isn't gluLookAt supposed to put whatever coordinate i specify in the center of the screen?


Solution

  • Change the value of up vector

    gluLookAt(0,10,0,0,0,0,0,0,1);
    

    your eyes is at positive y-axis and reference point at center and up (head) vector must be along z-axis. You have done another mistake in your resize function

    void resize(uint32_t height, uint32_t width){
    glViewport(0, 0, width, height);
    .....................
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 1000.0);
    }
    

    your variable height stores width of screen and variable width stores height, you have defined the glViewport and in gluPerspective you think your are taking ratio width by height, but actually you are taking ratio height by width, so it occurs the problem. Edit you code as follows:

    void resize(uint32_t width, uint32_t height){
    glViewport(0, 0, width, height);
    ..................
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 1000.0);
    }