gpt4 book ai didi

c++ - glPushMatrix() 和 glPopMatrix() 如何保持场景不变?

转载 作者:可可西里 更新时间:2023-11-01 16:25:23 24 4
gpt4 key购买 nike

我在网上找到了一些代码,可以在屏幕上移动一个框,然后在框到达屏幕末端后重置它。
这是代码:

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(),我的方 block 似乎会加速而不是以恒定速度移动。

然而,我在 glPushMatrix()glPopMatrix() 中所做的更改如何保留?当我使用 glPushMatrix() 并对顶部矩阵进行更改时,它会将更改可视化,但是当我使用 glPopMatrix() 时,所有这些更改不是都消失了吗?当我再次恢复到“干净”状态时,我的盒子如何在屏幕上移动?

如果我在进行更改后再次弹出矩阵,如何记录翻译的状态?

最佳答案

glPushMatrix 复制堆栈顶部的矩阵(您始终使用顶部的矩阵)。您正在进行的任何其他转换都会修改这个顶层矩阵,即重复的矩阵。当您执行 glPopMatrix 时,我们回到了原始矩阵。

例如,假设您想画一辆汽车。您设置矩阵来绘制车身,我们称它为 M1。现在,你想画一个轮子。您可以计算 M2 - 正确显示车轮所需的矩阵 - 或者,由于车轮是相对于车身的(因此,有一个矩阵 M3 这样 M2 = M1 * M3) 你修改 M1。但是汽车有 4 个轮子,您需要保留一份 M1。您可以通过 glPushMatrix 执行此操作,您可以通过执行 glPopMatrix 取回拷贝。

glPushMatrix and glPopMatrix

当您在屏幕上绘制任何东西时,您就是在对象空间中给出坐标。要真正显示某些内容,需要转换这些坐标。为此,我们有一些矩阵。

在车轮示例中,您只有一个车轮几何图形,但由于您使用不同的矩阵,因此将绘制四个车轮。 glPushMatrixglPopMatrix 只与矩阵一起工作,实际的顶点数据保存在 GPU 中,每个 glVertex 发送另一个在那里,它不能删除。见下图,矩阵只是用于将物体坐标转换为世界坐标(实际上,所有矩阵都可以压入堆栈)

multiple matrices

关于c++ - glPushMatrix() 和 glPopMatrix() 如何保持场景不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7031842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com