在這個章節中我們將在opengl應用程式中引進視景體的形狀。它是使用函式gluperspective
來定義透視投影,然後使用glulookat
函式來定義相機的位置。
首先,讓我們回味一下這些函式的引數(都是float型別):
1. gluperspective(fovy, ratio, neardist, fardist)
2. glulookat(px, py, pz, lx, ly, lz, ux, uy, uz);
金字塔的頂點就是相機的位置(px, py, pz)。乙個視線射線
方式可以由下面計算 d = l - p,其中l = (lx, ly, lz),和原點p = (px, py, pz)。近平面和遠平面都垂直於這條視線,並且相交於距離為neardist和fardist的位置,近平面和遠平面,就是函式中的距離,和fov(視線的垂直角度),和ratio(垂直和水平的比例)。
近平面的包圍矩形的高度和寬度定義如下:
hnear = 2 * tan (fov / 2) * neardist;
wnear = hnear * ratio
同樣的結論適用於遠平面:
為了定義視景體裁剪,我們需要兩個步驟:
1. 算出視景體的資訊-這個是在每一次視景體發生改變時做的,比如說,當相機移動或者透視改變時。
2. 測試物體跟視景體的相交結果來決定是否裁剪-這個是在每一幀中每個物體都需要計算的。如果每個裁剪狀態在幀之間保持不變那麼測試僅在相機移動時發生,比如說,視景體更新或者透視改變。
這個例子
開啟三個視窗:使用者相機視窗,乙個由使用者相機和視景體可以在頂端可以看到的視窗,最後乙個是從右邊看的視景體。在視景體裡面的球用綠色來表示,如果相交用黃色繪製,如果在外面用紅色繪製。
英文位址
層次化(Hierachy)視景體裁剪
視景體裁剪的最大優勢是層次化的裁剪方法。這意味著我們的世界將被分解成乙個樹形結構。一旦我們裁掉了上一層的結點就沒有必要去裁剪切一層的結點了,因為無論如何都是不可見的。這也就意味著我們沒有必要裁剪所有的結點。我們簡單的按層次結構來處理結點,這將大大的減少要進行視景體裁剪的結點的數量。沒有乙個層次處理的...
OpenGL視椎體 裁剪和剔除
畢設做的是 基於四叉樹的lod地形渲染 其中主要參考了潘李亮的 基於lod的大規模真實感室外場景試試渲染技術的初步研究 一文,如有有興趣做四叉樹lod的話,建議讀一讀這篇文章。但是在這篇文章的視椎體裁剪部分,說的不是很清除,而且在求解視椎體六個面的方程和判斷aabb包圍盒的與視椎體是否相交的方法上,...