2016-03-28 177 views
3

我知道OpenGL中的相機被定義爲在負Z方向上看。因此,在一個簡單的例子,我想象的要呈現我的頂點,他們必須定義類似以下內容:OpenGL:任何頂點Z座標都必須爲負數嗎?

rawverts = { 
    0.0f, 0.0f, -1.0f, 
    0.0f, 0.5f, -1.0f, 
    0.5f, 0.0f, -1.0f, 
}; 

但是,絕對沒有導遊會告訴我答案。無論我看到什麼,「Hello三角形」示例都是在z座標保持爲0的情況下製作的,每當定義更復雜的網格時,甚至不顯示座標。我仍然不知道他們的座標可能被繪製到屏幕上。舉個例子,GLM ::觀點:

glm::mat4 projectionMatrix = glm::perspective(
    FoV,   // The horizontal Field of View, in degrees : the amount of "zoom". Think "camera lens". Usually between 90° (extra wide) and 30° (quite zoomed in) 
    4.0f/3.0f, // Aspect Ratio. Depends on the size of your window. Notice that 4/3 == 800/600 == 1280/960, sounds familiar ? 
    0.1f,  // Near clipping plane. Keep as big as possible, or you'll get precision issues. 
    100.0f  // Far clipping plane. Keep as little as possible. 
); 

但是,如何才能裁剪平面與任何積極值定義?相機朝向-Z方向!此外,如果我在-1和-4等創建近/遠裁剪平面,現在是否使任何大於-1或小於-4的Z座標無效?或者,原始的z座標只能在0和-1之間有效(同樣,z座標絕對不能是正數?)..?

但讓我們假設實際發生的事情是,OpenGL(或glm)採用剪切平面值並暗中否定它們。所以,我的-1到-4變成1到4.現在這是否會使任何小於1且超過4的Z座標無效,因此0.0f, 0.0f, -1.0f將不會被繪製在屏幕上?

在這個階段,我會把答案視爲一本書的指針或一些有關此問題的資料。

+0

近和遠總是被定義爲距相機的距離,而不是空間中的某些點。否則,在移動相機時剪切平面會遍佈整個地方。恰恰相反,相機在默認情況下沿着-z查看。 – weltensturm

回答

3

不,點/頂點可以有一個正的z座標,但除非相機移回,否則不會看到它們。

This article談論關於通過的約三分之一。

+0

好吧,讓我說我把相機移回1000.0f單位,然後想使用'glm :: perspective()' - 接近和遠的飛機如何表現呢? –

+2

@MaxB剪切平面總是相對於相機。移動相機時不需要更改它們。 – HolyBlackCat

0

你的問題是你不理解座標系和變換。

首先是窗口座標。它是窗口中的像素網格,非常簡單。沒有z軸。

接下來是NDC。去谷歌上查詢。它是一個從xyz軸-1到1的立方體。如果您加載了模型視圖和投影矩陣以及標識,則這是您渲染的空間。通過指定您從NDC轉換到窗口座標的視口。剪切立方體外頂點的像素。

對投影和模型視圖矩陣的處理是,您在NDC立方體上創建一個轉換,使其覆蓋對象。移動相機時,您可以改變轉換。變換可以將頂點從任何位置轉換到NDC立方體,包括負Z座標。

這是事情工作的簡短版本。長版本太長而無法進入此處。欲瞭解更多信息,請詢問具體問題或更好地閱讀有關該主題的文獻。