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() 如何保持场景相同?
基础教程推荐
- 从 std::cin 读取密码 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- Windows Media Foundation 录制音频 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01