OpenGL垂直翻转:-360 + -360 = 0?

时间:2013-07-30 13:27:58

标签: math opengl

我正在使用OpenGL,我想反转图像。所以我去了这里,问了一个问题,最后我得到了以下代码:

    glMatrixMode(GL_PROJECTION);
    glScalef(-1,1,1);
    glTranslatef(-width(),0,0);

根据我的理解,每个像素的位置都会反转,因此图像右侧的像素现在位于相同的绝对位置,但是图像的左侧,所以我必须移动整个事物返回与其宽度一样多的像素:360(这是“画布”的大小,因此在片段中使用函数width())!因此,要撤消此过程,我会再次反转图像,然后将其移回原来的位置:

    glMatrixMode(GL_PROJECTION);
    glScalef(-1,1,1);
    glTranslatef(width(),0,0);

不,黑屏。我必须完成两次相同的操作以撤消翻转:每次翻转图像时我都必须移动-360。为什么呢?

1 个答案:

答案 0 :(得分:1)

正如Daniel Fischer在评论中提到的那样。以下是该过程的说明。

您必须考虑的是变换在变换后的坐标系上运行。

我们从屏幕上的图像(灰色)开始(绿色):

F1

然后我们缩放图像。因此保留原点,但x轴是镜像的。

F2

不,我们必须再次将图像移动到屏幕上。因为x轴指向左侧(但我们想要将图像向右移动),我们必须使用负偏移量进行翻译:

F3

如果我们再次翻转图像,则会发生以下情况。保留原点并镜像x轴:

F4

所以我们必须用负偏移来翻译图像:

F5

撤消翻转的另一种方法是撤消操作(但顺序相反):

glTranslatef(width, 0, 0);
glScalef(-1,1,1);

数学原因是反演颠倒了奥德。如果我们有矩阵A = B * C,那么A^-1 = (C^-1 * B^-1)