2013-05-10 62 views
0

使用glFrustum,繪製在非規範化座標 - glFrustum

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(-1, 1, -1, 1, 0.1, 1000.0); 
glLoadMatrxi(GL_MODELVIEW); 
glBegin(GL_QUADS); //A room's left wall 
glVertex3f(-1.0, 1.0, 0.0); 
glVertex3f(-1.0, 1.0, -0.4); 
glVertex3f(-1.0, -1.0, -0.4); 
glVertex3f(-1.0, -1.0, 0.0); 
glEnd(); 

我的所有圖紙發生在1,1(注意了//一個房間的左邊牆上上面的代碼中),即
X軸: -1成爲左邊,1成爲以中心爲原點的右邊。
Y軸:1變成頂部,-1變成右邊,原點位於中心

是否glFrustum會自動將我的座標更改爲[-1,1]?
如:

通常情況下,我會通過指定屏幕座標如下繪製一個立方體ofBox(512,384,0,10)給了我一個盒子在屏幕中心[窗口寬度:1024,窗口高度:768]

什麼如果我想繼續繪製,因爲我通常在像素座標中繪製,並且不希望通過嘗試將像素座標繪製轉換爲標準化座標,即使使用glFrustum,也不想使事情變得複雜?

回答

3

我認爲你仍然很難想象什麼是平截頭體,以及它如何與投影相關。簡單地說平截頭體與它的尖端的棱錐每隔一段距離切斷:

frustum

如果用作OpenGL的投影矩陣的平截頭體的邊界限定在視圖空間體積座標(即後模型視圖變換),通過投影變換和均勻分割,變換爲範圍{-1,1}²×{0,1}的立方體。

近平面的範圍定義視圖空間座標中的範圍 - 即將視圖點放置在(0,0,0)處的世界空間 - 將被映射(即「拉伸」和/或「捏「)到用glViewport定義的渲染窗口的範圍。

簡而言之:您使用glViewport來定義事物應該去的窗口中的像素座標和glFrustum來排除視圖空間中的切片(這是世界空間移動的方式,使得相機在(0,0,0))。

+0

在透視分割之後,立方體的x和y維映射到[-1,1]。但是,深度座標範圍是[0,1]。 – radical7 2013-05-10 22:03:53

+0

@ radical7:事實確實如此,然而OP正在與視角空間截錐體的概念鬥爭。我不想過分強調NDC方面的工作。 – datenwolf 2013-05-11 00:14:17

+0

@datenwolf:在時間軸中觀看和建模轉換之後,不是「glFrustum」是投影轉換的一個步驟嗎?對象空間座標轉換爲眼睛空間 - >剪輯空間 - > NDC空間。那麼爲什麼你提到的View/Eye Space中的這些問題呢? – user1240679 2013-05-13 12:58:17