Я нашел в сети какой-то код, который переместит поле по экрану, а затем сбросит его после того, как поле достигнет конца экрана.
Вот код:
void display(void) {
int sign = 1;
if (lastFrameTime == 0) {
/*
* sets lastFrameTime to be the number of milliseconds since
* Init() was called;
*/
lastFrameTime = glutGet(GLUT_ELAPSED_TIME);
}
int now = glutGet(GLUT_ELAPSED_TIME);
int elapsedMilliseconds = now - lastFrameTime;
float elapsedTime = float(elapsedMilliseconds) / 1000.0f;
lastFrameTime = now;
int windowWidth = glutGet(GLUT_WINDOW_WIDTH);
if (boxX > windowWidth) {
boxX -= windowWidth;
}
boxX += (sign)*256.0f * elapsedTime;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//creates a new matrix at the top that we can do things to?
glTranslatef(boxX, 0.0f, 0.0f);
/*
* draw a "quad" (rectangle)
*/
glBegin(GL_QUADS);
glVertex2f(0.0f, 0.0f);
glVertex2f(128.0f, 0.0f);
glVertex2f(128.0f, 128.0f);
glVertex2f(0.0f, 128.0f);
glEnd();
glPopMatrix();
//pops that matrix off the stack so we can have a "clean" version to do something next time.?
glutSwapBuffers();
}
ТеперьЯ понимаю, что glPushMatrix()
и glPopMatrix()
состоит в том, что glPushMatrix()
помещает (или помещает) новую матрицу в стек для вас, чтобы вы могли что-то делать, так что после того, как вы попэто обратно у вас есть "чистый" сланец снова.Вот почему, если я пренебрегаю glPopMatrix()
после glEnd()
, мой квадрат скорее ускоряется, чем движется с постоянной скоростью.
Однако как получается, что изменения, которые я делаю внутри glPushMatrix()
и glPopMatrix()
хранятся?Когда я использую glPushMatrix()
и вносю изменения в верхнюю матрицу, она визуализирует изменения, но когда я использую glPopMatrix()
, разве все эти изменения не пропали?Когда я снова возвращаюсь к «чистому» списку, как получается, что моя коробка перемещается по экрану?
Как записывается состояние этого перевода, если я просто вытащил матрицу снова после внесения изменения?