我正在使用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。为什么呢?
答案 0 :(得分:1)
正如Daniel Fischer在评论中提到的那样。以下是该过程的说明。
您必须考虑的是变换在变换后的坐标系上运行。
我们从屏幕上的图像(灰色)开始(绿色):
然后我们缩放图像。因此保留原点,但x轴是镜像的。
不,我们必须再次将图像移动到屏幕上。因为x轴指向左侧(但我们想要将图像向右移动),我们必须使用负偏移量进行翻译:
如果我们再次翻转图像,则会发生以下情况。保留原点并镜像x轴:
所以我们必须用负偏移来翻译图像:
撤消翻转的另一种方法是撤消操作(但顺序相反):
glTranslatef(width, 0, 0);
glScalef(-1,1,1);
数学原因是反演颠倒了奥德。如果我们有矩阵A = B * C
,那么A^-1 = (C^-1 * B^-1)
。