除了視景體的6個裁剪平面(左、右、底、頂、近和遠)之外,還可以另外再指定最多可達6個的其他裁剪平面,對視景體施加進一步的限制。
每個平面都是由它的方程式ax + by + cz + d= 0的係數所指定的。裁剪平面會根據模型和檢視矩陣自動執行適當的變換。最終的裁剪區域將是視景體與其他裁剪平面定義的所有半空間的交集。記住,opengl會自動對部分被裁剪的多邊形的邊進行正確的重構。
void glclipplane(glenum plane, const gldouble *equation);
定義乙個裁剪平面。equation引數指向平面方程ax + by + cz + d = 0的4個係數。滿足(a b c d)m-1 (xe ye ze we) t≥0的所有視覺座標(xe ye ze we)點都位於這個平面定義的半空間中,其中m是在呼叫glclipplane()時的當前模型檢視矩陣。所有不是位於這個半空間內的點都將裁剪掉。plane引數是gl_clip_planei,其中i是乙個整數,表示需要定義哪個有效裁剪平面。i的值位於0和最大其他裁剪平面數減1之間。
我們需要啟用每個被定義的裁剪平面:
glenable(gl_clip_planei);
也可以用下面這個函式禁用乙個裁剪平面:
gldisable(gl_clip_planei);
所有的opengl實現都必須支援至少6個其他裁剪平面,有些實現可能允許超過6個的其他裁剪平面。可以用gl_max_clip_planes為引數呼叫glgetintegerv()函式,查詢自己使用的opengl實現所支援的其他裁剪平面的最大數量。
呼叫glclipplane()函式所執行的裁剪是在視覺座標中完成的,而不是在裁剪座標中進行的。如果投影矩陣為奇異矩陣(也就是把三維座標壓平到二維座標的真正投影矩陣),這個區別就非常大。在視覺座標中進行裁剪時,即使投影矩陣是奇異矩陣,裁剪仍然是在三維空間中進行的。
下面的例子通過兩個裁剪平面對球體進行了裁剪。
//
// main.cpp
// opengl_10_clipplane
////
#include #include /**
* 初始化操作
*/void init()
/** * 展示繪製效果
*/void display() ;
gldouble equn2[4] = ;
//設定裁剪平面,y>0
glclipplane(gl_clip_plane0, equn);
glenable(gl_clip_plane0);
//設定裁剪平面,x>0
glclipplane(gl_clip_plane1, equn2);
glenable(gl_clip_plane1);
//沿x軸旋轉90度
glrotatef(90.0f, 1.0f, 0.0f, 0.0f);
//渲染乙個球體,球體半徑,以z軸上線段為直徑分布的圓周線的條數(經線),圍繞在z軸周圍的線的條數(維線)
glutwiresphere(2.0f, 20.0f, 16.0f);
//彈出棧頂矩陣
glpopmatrix();
//強制完成繪製指令
glflush ();
}/**
* 調整視窗尺寸
* * @param width 寬度
* @param height 高度
opengl演算法學習 直線裁剪演算法
裁剪是從資料集合提取資訊的過程,它是計算機圖形學許多重要問題的基礎。裁剪典型的用途就是從乙個大的場景中提取所需的資訊,以顯示某一區域性場景或檢視。比如瀏覽地圖時,對感興趣的區域放大顯示,此時視窗內顯示的內容會相應減少。確定圖形的哪些部分在視窗內,哪些部分在視窗外 不可見區域 只顯示視窗內的那部分圖形...
C 基礎學習(09) 結構
c c 陣列允許定義可儲存相同型別資料項的變數,但是結構是 c 中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。為了定義結構,您必須使用 struct 語句。struct 語句定義了乙個包含多個成員的新的資料型別,struct 語句的格式如下 struct type name o...
C 學習之路 09語句01
語句 每一條語句都以 結束,有簡單語句和復合語句。簡單語句 只有一條語句。復合語句 有多條語句,必須用括起來。注意 一行中只有 也算是一條語句。語句的種類 條件語句 if語句 int a 1 if a 0 if語句,表示如果a 0則執行裡面的內容 if a 0 if else語句,表示如果a 0則執...