gpt4 book ai didi

c++ - glPushMatrix() glPopMatrix() 不起作用

转载 作者:行者123 更新时间:2023-11-28 01:20:17 25 4
gpt4 key购买 nike

我尝试对两个独立移动的对象进行编码,这意味着它们都在两个不同的方向上移动它有效但不能连续移动。当我将 glTranslatef() 放在 glPushMatrix() 之外时 ... glPopMatrix() 它正常工作。

void display()
{
glClearColor(0.356, 0.701, 0.0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// if put gltransate() at here the object will moving continuous

glPushMatrix();
glTranslatef(.5, 0, 0);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.8, 0.8);
glVertex2f(-0.2, 0.8);
glVertex2f(-0.2, 0.5);
glEnd();
glPopMatrix();

glPushMatrix();
glTranslatef(-.5, 0, 0);
glBegin(GL_QUADS);
glColor3f(.0, .0, .0);
glVertex2f(-0.8, 0.2);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.2, 0.5);
glVertex2f(-0.2, 0.2);
glEnd();
glPopMatrix();

}

我希望第一个方形对象会不断向右移动,但似乎只是平移一次然后停在该位置。

最佳答案

请注意,通常我建议使用像 OpenGL Mathematics 这样的数学库做矩阵计算和glLoadMatrix()glm::mat4 类型的矩阵加载到当前矩阵。

无论如何,像glTranslatef()这样的操作创建一个新矩阵并将当前矩阵乘以新矩阵。这就是为什么连续调用 glTranslatef 会导致渐进式“移动”。

glPushMatrix / glPopMatrix在矩阵栈上存储和恢复矩阵。所以连续移动是行不通的,因为当前矩阵在每一帧的开始都保持不变。


一种解决方案是将翻译存储到一个变量中并递增该变量:

GLfloat trans_a = 0.0f;
GLflaot trans_b = 0.0f;

void display()
{
glClearColor(0.356, 0.701, 0.0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

trans_a += 0.5f;
glTranslatef(trans_a, 0, 0);

glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.8, 0.8);
glVertex2f(-0.2, 0.8);
glVertex2f(-0.2, 0.5);
glEnd();
glPopMatrix();

glPushMatrix();

trans_b += 0.5f;
glTranslatef(trans_b, 0, 0);

glBegin(GL_QUADS);
glColor3f(.0, .0, .0);
glVertex2f(-0.8, 0.2);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.2, 0.5);
glVertex2f(-0.2, 0.2);
glEnd();
glPopMatrix();
}

一个更通用的解决方案是通过 glGetFloatv(GL_MODELVIEW_MATRIX, ...) 获取和存储当前矩阵(翻译后)并通过 glLoadMatrix() 重新加载它:

// init identity matrices
GLfloat mat_a[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
GLfloat mat_b[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };

void display()
{
glClearColor(0.356, 0.701, 0.0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

glLoadMatrixf(mat_a)
glTranslatef(0.5f, 0, 0);
glGetFloatv(GL_MODELVIEW_MATRIX, mat_a);

glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.8, 0.8);
glVertex2f(-0.2, 0.8);
glVertex2f(-0.2, 0.5);
glEnd();
glPopMatrix();

glPushMatrix();

glLoadMatrixf(mat_b)
glTranslatef(0.5f, 0, 0);
glGetFloatv(GL_MODELVIEW_MATRIX, mat_b);

glBegin(GL_QUADS);
glColor3f(.0, .0, .0);
glVertex2f(-0.8, 0.2);
glVertex2f(-0.8, 0.5);
glVertex2f(-0.2, 0.5);
glVertex2f(-0.2, 0.2);
glEnd();
glPopMatrix();
}

请注意,在这种情况下,mat_amat_b 应该在 View 矩阵初始化之后加载,当 View 矩阵发生变化时,矩阵不会考虑这一点。

关于c++ - glPushMatrix() glPopMatrix() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617328/

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