2013-07-30 52 views
0

我正在使用OpenGL,我想反转图像。于是我就在这里,问了一个问题,最后我有下面的代码:OpenGL垂直翻转:-360 + -360 = 0?

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 <= x <= w'中,则翻转('glScalef(-1,1,1)')翻转每个像素的x坐标的符号,因此您的图像现在在'-w <= x <= 0'中,由'-w'翻译将其移回到视口中。如果在第二次翻转后用'w'翻译,则将其从视口中移出,而不是移到视口中。 –

回答

1

这与Daniel Fischer在评论中提到的完全相同。这是一个过程的例子。

你必须记住的是,变换对变换后的坐标系进行操作。

我们先从屏幕(绿色)的图像(灰色):

F1

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

F2

不,我们必须将图像再次移动到屏幕上。由于x轴指向左侧(但我们要移动右图),我们必须使用负的平移偏移:

F3

如果我们再次,该翻转图像发生下列事件起源是保留的,x轴镜像:

F4

因此,我们必须把由负偏移图像:

F5

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

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

数学上的原因是,inver锡永颠倒了奥德。如果我们有Matrix A = B * CA^-1 = (C^-1 * B^-1)