Question

I'm trying to move a cube drawn wit OpenGL in a QGLWidget. Here is part of the code:

void Hologram::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawBox();
}

void Hologram::drawBox() {
    for (int i = 0; i < 6; i++) {
        glBegin(GL_QUADS);
        glNormal3fv(&n[i][0]);
        glVertex3fv(&v[faces[i][0]][0]);
        glVertex3fv(&v[faces[i][1]][0]);
        glVertex3fv(&v[faces[i][2]][0]);
        glVertex3fv(&v[faces[i][3]][0]);
        glEnd();
    }
    qDebug() << "drawing box";
}

void Hologram::initializeGL() {    
    /* Enable a single OpenGL light. */
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

    /* Use depth buffering for hidden surface elimination. */
    glEnable(GL_DEPTH_TEST);
    /* Setup the view of the cube. */
    glMatrixMode(GL_PROJECTION);
    gluPerspective( /* field of view in degree */ 40.0,
                    /* aspect ratio */ 1.0,
                    /* Z near */ 1.0, /* Z far */ 10.0);
    glMatrixMode(GL_MODELVIEW);

//    qDebug() << "vx:" << vx << "vy:" << vy << "vz:" << vz;

    gluLookAt(0.0, 0.0, 5.0,  // eye position
              0.0, 0.0, 0.0,      // center
              0.0, 1.0, 0.);      // up vector

    // Adjust cube position
    glTranslatef(0.0, 0.0, -1.0);
}

void Hologram::animate() {
    glTranslatef(0.0, 0.0, -0.1);
    updateGL();
}

I've implemented a timer that periodically calls animate() via a signal&slot connection. Shouldn't it add -0.1 to the z-coordinate every time when animate() is executed and therefore move the cube in z-direction? Depending on the value I choose, the cube is either not moving (for values approx. <-0.3) or I cannot see it at all (values approx. >0.4). First I thought it either might move very fast and disappear or it moves very slow and therefore I couldn't see any changes. But playing around with z value always ended up in one of the above mentioned cases... Isn't that strange? What am I doing wrong?

Was it helpful?

Solution

Problem solved: The correct way to do it is

void Hologram::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.0, 0.0, -dz);

    drawBox();
}

The reason why I got the strange behaviour described above is due to the fact that the object was clipped by the near/far planes of the perspective set with gluPerspective()...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top