- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试对两个独立移动的对象进行编码,这意味着它们都在两个不同的方向上移动它有效但不能连续移动。当我将 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_a
和 mat_b
应该在 View 矩阵初始化之后加载,当 View 矩阵发生变化时,矩阵不会考虑这一点。
关于c++ - glPushMatrix() glPopMatrix() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617328/
我正在OpenGL项目上工作,即使我包含glut.h并链接了诸如opengl32.lib,glfw3.lib,glaux.lib,glu32.lib,glut32.lib之类的常见库文件,也遇到了以下
我尝试对两个独立移动的对象进行编码,这意味着它们都在两个不同的方向上移动它有效但不能连续移动。当我将 glTranslatef() 放在 glPushMatrix() 之外时 ... glPopMat
我有以下代码: void drawObj1(){ glPushMatrix(); glTranslatef(rBaseInitPos + (rBaseDim[0]
我在网上找到了一些代码,可以在屏幕上移动一个框,然后在框到达屏幕末端后重置它。 这是代码: void display(void) { int sign = 1; if (lastFrameTi
当对对象应用转换时,我们使用 glPushMatrix/glPopMatrix。但是为什么我们不只使用 glLoadIdentity 呢? 因此 glPushMatrix() ..ap
我尝试从传入的 iphone 麦克风流中绘制波形。数据的提取没有问题,绘图工作正常。只有当我使用 OpenGL 异常断点时,xcode 才会在 glPushMatrix() & glPopMatrix
我在 OpenGl 中遇到了一个非常奇怪的问题。以下代码按预期生成黄色立方体 glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (
OpenGL ES 2.0是否仍支持glPushMatrix和glPopMatrix?我目前以下列方式使用它们: glPushMatrix(); glTranslatef(xLoc, yLoc, 0)
我正尝试在 Linux 专用视频播放器中进行一些优化以提高性能,因为播放 MP4 文件对 CPU 占用很大,因为视频帧是用 YV12 编码的 并且 OpenGL 不提供显示此格式的 native 方式
我是一名优秀的程序员,十分优秀!