2013-07-30 51 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)