How do glPushMatrix() and glPopMatrix() keep the scene the same?(glPushMatrix() 和 glPopMatrix() 如何保持场景相同?)
问题描述
我在网上找到了一些代码,可以在屏幕上移动一个框,然后在框到达屏幕末端后重置它.
代码如下:
I found some code online which will move a box across the screen, then reset it after the box hits the end of the screen.
Here is the code:
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() 在堆栈上放置(或推送)一个新矩阵供您执行操作,以便在您将其弹出后再次拥有干净"的石板.这就是为什么,如果我忽略 glEnd() 之后的 glPopMatrix(),我的方块似乎在加速而不是匀速移动.
Now, the way I understand glPushMatrix() and glPopMatrix() is that glPushMatrix() puts (or pushes) a new matrix on the stack for you to do things to, so that after you pop it back off you have a "clean" slate again. This is why, if I neglect the glPopMatrix() after glEnd(), my square seems to accelerate rather than move at a constant velocity.
但是,我在 glPushMatrix() 和 glPopMatrix() 中所做的更改是如何保留的?当我使用 glPushMatrix() 并对顶部矩阵进行更改时,它会显示更改,但是当我使用 glPopMatrix() 时,所有这些更改不是都消失了吗?当我再次恢复到干净"的状态时,我的盒子如何在屏幕上移动?
How is it, however, that the changes I make inside of glPushMatrix() and glPopMatrix() are kept? When I use glPushMatrix() and make a change to the top matrix, it visualizes the changes, but when i use glPopMatrix(), aren't all those changes gone? When I am restored to a "clean" slate again, how is it that my box moves across the screen?
如果我在进行更改后再次弹出矩阵,如何记录该翻译的状态?
How is the state of that translation recorded if i just pop the matrix off again after making the change?
推荐答案
只是用于变换坐标的矩阵,由glPopMatrix恢复.不是整个帧缓冲区.帧缓冲区包含四边形的渲染,之后更改矩阵不会影响已渲染的任何内容.
It's only the matrix, used to transform coordinates, that is restored by glPopMatrix. Not the whole framebuffer. The framebuffer contains the rendering of the quadrilateral, changing the matrix afterward doesn't affect anything already rendered.
这篇关于glPushMatrix() 和 glPopMatrix() 如何保持场景相同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:glPushMatrix() 和 glPopMatrix() 如何保持场景相同?
基础教程推荐
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 常量变量在标题中不起作用 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
