如何撤消glTranslatef的效果

How to undo the effect of glTranslatef

本文关键字:glTranslatef 撤消 何撤消      更新时间:2023-10-16

假设我想翻译一个多边形。如果在绘制之前我使用 glTranslatef,它会被翻译,但如果我想画两个多边形并且只翻译一个,我该怎么办?

#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>
#include "utility.h"
void init()
{
    glLoadIdentity();
    glOrtho(-1, 1, -1, 1, -1, 1);
}
void render()
{
    glClearColor(APPLE_GRAY);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glTranslatef(0.5, 0.0, 0.0);
    glBegin(GL_POLYGON);
    glColor4f(RED);
    glVertex2f(0,0.5);
    glVertex2f(-0.5,-0.5);
    glVertex2f(0.5, -0.5);
    glBegin(GL_POLYGON);
    glColor4f(BLUE);
    glVertex2f(0.5,0.5);
    glVertex2f(-0.5,0.5);
    glVertex2f(-0.5, -0.5);
    glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

我只想翻译三角形,而不是正方形。怎么做?

在翻译之前,请调用:

glPushMatrix()

然后在绘制第一个多边形后,调用:

glPopMatrix()

我还注意到,在第一个多边形之后,您没有glEnd()调用。 此外,除非有更多未列出的代码,否则我注意到您在调用 glOrtho() 时不会从模型视图切换到投影矩阵。 如果您仅在本例中使用模型视图矩阵,则这不是绝对必要的,但传统方法是像这样设置投影:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, -1, 1);

然后,渲染函数为多边形渲染设置模型视图矩阵。 同样,这不是一个要求,您的示例看起来会满足您的需求,因为您只使用一个矩阵。

参考: glPushMatrix() OpenGL 文档