視錐體裁剪(從矩陣中提取6個裁剪面)

視錐體(frustum),是指場景中攝像機的可見的一個錐體範圍。它有上、下、左、右、近、遠,共6個面組成。在視錐體內的景物可見,反之則不可見。爲提高性能,只對其中與視錐體有交集的對象進行繪製。

視錐體
視錐體

我們計算出視錐體六個面的空間平面方程,將點座標分別代入六個面的平面方程做比較,則可以判斷點是否在視錐體內。

空間平面方程可表示爲:

    Ax+By+Cz=0

對於點(x1, y1, z1),有

若 Ax1+By1+Cz1 = 0,則點在平面上;
若 Ax1+By1+Cz1 < 0,則點在平面的一側;
若 Ax1+By1+Cz1 = 0,則點在平面的另一側;

求視錐平面係數1

這裏介紹的算法,可以直接從世界、觀察以及投影矩陣中計算出Viewing Frustum的六個面。它快速,準確,並且允許我們在相機空間(camera space)、世界空間(world space)或着物體空間(object space)快速確定Frustum planes。

我們先僅僅從投影矩陣(project)開始,也就是假設世界矩陣(world)和觀察矩陣(view)都是單位化了的矩陣。這就意味着相機位於世界座標系下的原點,並且朝向Z軸的正方向。

定義一個頂點v(x y z w=1)和一個4*4的投影矩陣M=m(i,j),然後我們使用該矩陣M對頂點v進行轉換,轉換後的頂點爲v'= (x' y' z' w'),可以寫成這樣:

轉換後,viewing frustum實際上就變成了一個與軸平行的盒子,如果頂點 v' 在這個盒子裏,那麼轉換前的頂點 v 就在轉換前的viewing frustum裏。在OpenGL下,如果下面的幾個不等式都成立的話,那麼 v' 就在這個盒子裏。


 
  1. -w' < x' < w'

  2. -w' < y' < w'

  3. -w' < z' < w'

  4.  
  5.  

可得到如下結論,列在下表裏:

我們假設現在想測試 x' 是否在左半邊空間,只需判斷

    -w < x'

用上面的信息,等式我們可以寫成:

    −(v • row4 ) < (v • row1 )

    0 < (v • row4 ) + (v • row1 )

    0 < v • (row4 + row1 )

寫到這裏,其實已經等於描繪出了轉換前的viewing frustum的左裁剪面的平面方程:

    x(m41 + m11) + y(m42 + m12) + z(m43 + m13) + w(m44 + m14) = 0

當W = 1,我們可簡單成如下形式:

    x(m41 + m11) + y(m42 + m12) + z(m43 + m13) + (m44 + m14) = 0

這就給出了一個基本平面方程:

    ax + by + cz + d = 0

其中,a = ( m41 + m11) , b = ( m42 + m12 ), c = ( m43 + m13) , d = ( m44 + m14 )

到這裏左裁剪面就得到了。重複以上幾步,可推導出到其他的幾個裁剪面,具體見參考文獻1.

需要注意的是:最終得到的平面方程都是沒有單位化的(平面的法向量不是單位向量),並且法向量指向空間的內部。這就是說,如果要判斷 v 在空間內部,那麼6個面必須都滿足ax + by + cz + d > 0

到目前爲止,我們都是假設世界矩陣( world )和觀察矩陣( view )都是單位化了的矩陣。但是,本算法並不想受這種條件的限制,而是希望可以在任何條件下都能使用。實際上,這也並不複雜,並且簡單得令人難以置信。如果你 仔細想一下就會立刻明白了,所以我們不再對此進行詳細解釋了,下面給出3個結論:

  • 1. 如果矩陣 M 等於投影矩陣 P ( M = P ),那麼算法給出的裁剪面是在相機空間(camera space)
  • 2. 如果矩陣 M 等於觀察矩陣 V 和投影矩陣 P 的組合( M = V * P ),那麼算法給出的裁剪面是在世界空間(world space)
  • 3. 如果矩陣 M 等於世界矩陣 W,觀察矩陣 V 和投影矩陣 P 的組合( M = W* V * P ),呢麼算法給出的裁剪面是在物體空間(object space)

判斷節點是否在視錐內

通過各種包圍體方法求出近似包圍體,對包圍體上的各個點對視錐六個面作判斷,存在以下三種情況:

  • 如果所有頂點都在視錐範圍內,則待判區域一定在視錐範圍內;
  • 如果只有部分頂點在視錐範圍內,則待判區域與視錐體相交,我們同樣視爲可見;
  • 如果所有頂點都不在視錐範圍內,那麼待判區域很可能不可見了,但有一種情況例外,就是視錐體在長方體以內,這種情況我們要加以區分。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章