Как мне точно обновить положение объектов в OpenGL, используя Qt QGLWidget?

Я пытаюсь переместить куб, нарисованный с помощью OpenGL, в QGLWidget. Вот часть кода:

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

Я реализовал таймер, который периодически вызывает animate () через сигнал&слот подключения. Разве он не должен добавлять -0.1 к координате z каждый раз, когда выполняется animate (), и поэтому перемещать куб в направлении z? В зависимости от выбранного значения куб либо не движется (для значений ок. <-0.3) или я его вообще не вижу (значения прибл.> 0.4). Сначала я подумал, что он может либо двигаться очень быстро и исчезать, либо двигаться очень медленно, и поэтому я не мог видеть никаких изменений. Но игра со значением z всегда заканчивалась в одном из вышеупомянутых случаев … Разве это не странно? Что я делаю неправильно?

0

Решение

Проблема решена: правильный способ сделать это

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

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

drawBox();
}

Причина, по которой я получил странное поведение, описанное выше, связана с тем, что объект был обрезан ближними / дальними плоскостями перспективы, установленной с помощью gluPerspective () …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]