2011-03-19 142 views
4

我正在學習openGL以及如何進行轉換,如翻譯和縮放。我知道你必須通常翻譯成原點,然後做任何你想做的事(比如說比例尺),然後回頭翻譯。根據我的理解,這是手動完成的,但你可以用glScale()做同樣的事情。OpenGL轉換(glScale,glTranslate等)

我的問題是,如果我使用glScale函數,是否還需要翻譯成原點和返回?

回答

14

您可能不需要對原點和背面進行任何翻譯,只需按照所需順序進行轉換即可。請記住,應用的最後一次轉換髮生在先前變換的空間中。例如:

// draw object centred on (1,2,3) and ten times bigger 
glTranslatef(1,2,3); 
glScalef(10,10,10); 
drawObject(); 

// draw object centred on (10,20,30) and ten times bigger 
glScalef(10,10,10); 
glTranslatef(1,2,3); 
drawObject(); 
+0

好的非常感謝,幫助。所以基本上我只需要做我的轉換,即:translate - > scale - >旋轉我相信,但我不必翻譯成原點和背部,因爲看起來gl函數爲你做了。 – Katianie 2011-03-19 19:28:35

+3

不,他們不會爲你做這件事,但往往沒關係。這裏沒有明確的規則:你需要了解發生了什麼。例如。如果你想要一個行星圍繞太陽旋轉,你首先要做旋轉,然後是旋轉。正如你想要的那樣,翻譯的方向將被前一輪旋轉。但是對於行星本身的日常旋轉,你需要在翻譯後進行另一次旋轉*。希望這是有道理的。 – 2011-03-20 10:48:08

+0

在第一個例子中,我們縮放然後翻譯,在第二個例子中我們翻譯爲1,2,3然後縮放,那麼如何繪製10,20,30中的對象? – vexe 2015-11-23 03:01:16

3

所有glScale確是將當前矩陣乘以比例矩陣。所以是的,對於你想要做的事情,你會想在應用翻譯之前應用比例矩陣。請參閱glScale reference

3

你要想想發生在棧上的轉換。換句話說,您指定的最後一個轉換首先發生。所以,

glTranslatef(1,2,3); 
glScalef(10,10,10); 
glRotatef(45,1,0,0); 
drawObject(); 

將第一繞x軸45度,然後縮放對象到(10,10,10),然後轉化爲(1,2,3)。但是,您還必須記住,您應用的任何轉換都會影響轉換。如果我們顛倒上述變換的順序,那麼旋轉將圍繞不同的點旋轉。