投影變換是一種很關鍵的圖形變換,opengl中只提供了兩種投影方式,一種是正射投影,另一種是透視投影。不管是呼叫哪種投影函式,為了避免不必要的變換,其前面必須加上以下兩句:
glmatrixmode(gl_projection)
;glloadidentity(
);
事實上,投影變換的目的就是定義乙個視景體,使得視景體外多餘的部分裁剪掉,最終影象只是視景體內的有關部分。本節將詳細講述投影變換的概念以及用法。
1 正射投影(orthographic projection)
正射投影,又叫平行投影。這種投影的視景體是乙個矩形的平行管道,也就是乙個長方體,如圖所示。正射投影的最大乙個特點是無論物體距離相機多遠,投影後的物體大小尺寸不變。這種投影通常用在建築藍圖繪製和計算機輔助設計等方面,這些行業要求投影後的物體尺寸及相互間的角度不變,以便施工或製造時物體比例大小正確。
此種模式下,不需要設定照相機位置、方向以及視點的位置,也就是說不需要glulookat函式。
opengl正射投影函式共有兩個。
乙個函式是:
void glortho(gldouble left,gldouble right,gldouble bottom,gldouble top, gldouble near,gldouble far)
它建立乙個平行視景體。實際上這個函式的操作是建立乙個正射投影矩陣,並且用這個矩陣乘以當前矩陣。其中近裁剪平面是乙個矩形,矩形左下角點三維空間座標是(left,bottom,-near),右上角點是(right,top,-near);遠裁剪平面也是乙個矩形,左下角點空間座標是(left,bottom,-far),右上角點是(right,top,-far)。所有的near和far值同時為正或同時為負。如果沒有其他變換,正射投影的方向平行於z軸,且視點朝向z負軸。這意味著物體在視點前面時far和near都為負值,物體在視點後面時far和near都為正值。
另乙個函式是:
void gluortho2d(gldouble left,gldouble right,gldouble bottom,gldouble top)
它是乙個特殊的正射投影函式,主要用於二維影象到二維螢幕上的投影。它的near和far預設值分別為-1.0和1.0,所有二維物體的z座標都為0.0。因此它的裁剪面是乙個左下角點為(left,bottom)、右上角點為(right,top)的矩形。
2 透視投影(perspective projection)
透視投影符合人們心理習慣,即離視點近的物體大,離視點遠的物體小,遠到極點即為消失,成為滅點。它的視景體類似於乙個頂部和底部都被切除掉的稜椎,也就是稜臺。這個投影通常用於動畫、視覺**以及其它許多具有真實性反映的方面。opengl透視投影函式也有兩個,其中函式glfrustum()。
此種情況下,需要用glulookat設定照相機位置、照相機方向(一般設定為(0,1,0))、以及視點位置。
這個函式原型為:
void glfrustum(gldouble left,gldouble right,gldouble bottom,gldouble top, gldouble near,gldouble far)
;
它建立乙個透視視景體。其操作是建立乙個透視投影矩陣,並且用這個矩陣乘以當前矩陣。這個函式的引數只定義近裁剪平面的左下角點和右上角點的三維空間座標,即(left,bottom,-near)和(right,top,-near);最後乙個引數far是遠裁剪平面的z負值,其左下角點和右上角點空間座標由函式根據透視投影原理自動生成。near和far表示離視點的遠近,它們總為正值。
另乙個函式是:
void gluperspective(gldouble fovy,gldouble aspect,gldouble znear, gldouble zfar)
;
它也建立乙個對稱透視視景體,但它的引數定義於前面的不同,如圖所示。其操作是建立乙個對稱的透視投影矩陣,並且用這個矩陣乘以當前矩陣。引數fovy定義視野在x-z平面的角度,範圍是[0.0,180.0];引數aspect是投影平面寬度與高度的比率;引數znear和far分別是遠近裁剪面到眼睛的距離,它們總為正值。 兩種if判斷
上海面試三 下面是c語言中兩種if語句判斷方式。請問哪種寫法更好?為什麼?int a if a1 第一種判斷方式 if 1a 第二判斷方式 答 這是個主觀題,不過多數人認為第二種好。從執行效率上講,第二種效率更高。另外,在編寫 時如果不小心將 寫成 即變成 1 a 這時編譯器將會給出錯誤提示。而如果...
mysql的兩種引擎 mysql的兩種儲存引擎
背景 最近在使用spring data jpa操作mysql,在使用jpa的自動建表功能之後,處理多對多關係 manytomany的時候,spring data jpa會給中間表的兩個欄位都加上外來鍵引用。當前使用的版本預設的資料庫儲存引擎為myisam。這種儲存引擎是為資料庫查詢效能而生的,不支援...
jQuery兩種擴充套件
如下 如下 jquery.extend jquery.fn.extend function 我們可以用 extend去擴充套件自定義的物件,如 如下 var myself extend myself,myself.setname tom 通過 extend為物件myself新增了setname方法。...