Brighter side
Brighter side

Reputation: 402

Unexpected gluLookAt behavior with a point draw on OpenGL

I am currently working on the printing loop of my software that reads 3D obj file. I have stored my obj file read in the variable tie. This variable contain an OpenGL list. My objective is to be able to move around the read object by using keyboard. The keyboard reading is implemented correctly (i can see in through the logs).

Issue

When i compile the following code loop, the gluLookAt exucute properly and I am able to move around my object by changing the value of the parameters.

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            light();
            gluPerspective (60.0, 250/(float)250, 0.1, 500.0);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);

            glPushMatrix();
            glRotated(45,0,0,1);
            glTranslated(0,0,50);
            glBindTexture(GL_TEXTURE_2D,texture1);
            //glCallList(xwing); //ICI
            glEnd();
            glPopMatrix();
                glColor3d(1,1,1);
                glDisable(GL_LIGHTING);
                glBindTexture(GL_TEXTURE_2D,texture2);
                GLUquadric* params = gluNewQuadric();
                gluQuadricDrawStyle(params,GLU_FILL);
                gluQuadricTexture(params,GL_TRUE);
                gluSphere(params,100,20,20);
                gluDeleteQuadric(params);
                glEnable(GL_LIGHTING);
            glBindTexture(GL_TEXTURE_2D,texture1);
            glCallList(tie); //ICI
            glPointSize(5.0);
            glBegin(GL_POINTS);
                glColor3f(1.0f,0.0f,0.0f);
                glVertex3f(-1.0f,0.0f,0.0f);
            glEnd();


            SwapBuffers(hDC);
        //} //else
        Sleep(1);

But when i comment these 4 lines:

glBegin(GL_POINTS);
                glColor3f(1.0f,0.0f,0.0f);
                glVertex3f(-1.0f,0.0f,0.0f);
glEnd();

My object doesn't move anymore. As if gluLookAt didn't succeed to execute. Do you have any idea why is this happening. Did I forget something in my code?

Upvotes: 1

Views: 63

Answers (1)

Rabbid76
Rabbid76

Reputation: 210877

glBegin and glEnd delimit the vertices that define a primitive or a group of like primitives. You have to ensure, the each glBegin is followed by a glEnd.
This means, if your Display Lists contains a glBegin then it should contain a glEnd, too. I strongly recommend to do it this way. The other possibility would be to do it manually after glCallList:

glCallList(tie);
glEnd();


glPushMatrix and glPopMatrix are used to push matrices on and pop matrices from the matrix stack. If you want to add a model matrix to the view matrix, then you have to do the following steps.

  • Push the view matrix glPushMatrix. This pushs a copy of the view matrix on the stack.
  • Add the model matrix to the current view matrix (glRotated, glTranslated, ... )
  • Draw the model. (glCallList, gluSphere, ... )
  • Restore the original view matrix (glPopMatrix).


Adapt your code somehow like this:

// set up view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);

// save view matrix
glPushMatrix();

// add model matrix
glRotated(45,0,0,1);
glTranslated(0,0,50);

// do the drawing
glColor3d(1,1,1);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture2);
GLUquadric* params = gluNewQuadric();
gluQuadricDrawStyle(params,GLU_FILL);
gluQuadricTexture(params,GL_TRUE);
gluSphere(params,100,20,20);
gluDeleteQuadric(params);
glEnable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture1);
glCallList(tie); 
glEnd(); // <-- maybe this could be done in "tie"

// restore the view matrix
glPopMatrix();

Upvotes: 1

Related Questions