opengl 螢幕座標

2021-06-19 22:46:57 字數 1558 閱讀 8937

建立opengl模型過程:

opengl座標變換很有特點,為了簡單描述先定義2個座標系:

(1)世界座標系:

無論如何變換,世界座標系都不動,以螢幕中心為原點(0, 0, 0),你面對螢幕,你的右邊是x正軸,上面是y正軸,螢幕指向你的為z正軸。

(2)當前繪圖座標系(即區域性座標系):

當前繪圖座標系是繪製物體時的座標系。程式剛初始化時,世界座標系和當前繪圖座標系是重合的,當用gltranslatef()等變換函式做移動和旋轉時,都是改變的當前繪圖座標系,改變的位置都是當前繪圖座標系相對自己的x,y,z軸所做的改變,改變以後,再繪圖時,都是在當前繪圖座標系進行繪圖,所有的函式引數也都是相對當前繪圖座標系來講的。

glloadidentity():另當前繪圖座標系從新回到世界座標系的位置,另他們重合。

gltranslatef(x,y,z):使繪圖座標系相對世界座標係沿x,y,z軸移動x,y,z個單位

其他關鍵概念:

(1)裁剪區域

佔據視窗的的笛卡爾空間區域,只有在裁剪區域內的物體才可見。

void glortho(gldouble left,gldouble right,gldouble bottom,gldouble top,gldouble near,gldouble far)

注:在使用glortho之前,要先呼叫一下兩個函式

glmatrixmode(gl_projection);

glloadidentity();

(2)視口

裁剪區域的寬度和高度很少能夠正好與視窗的寬度和高度(以畫素為單位)相匹配,因此,座標系必須從邏輯笛卡爾座標對映到物理螢幕座標,這個對映是通過視口的設定來指定的。視口就是視窗內部用於繪製裁剪區域的客戶區域。

void glviewport(glint x,glint y,glsizei width,glsizei height)

x,y引數指定了視窗內部視口的左下角。通常,x,y都是0。視口以實際螢幕座標定義了視窗中的區域。

(3)螢幕座標

windows螢幕座標以左上角為原點, x軸正方向朝右, y軸正方向朝下.

windows螢幕座標和虛擬3d世界座標不是簡單對映的, 這個過程很複雜.我們只有將滑鼠的熱點的座標通過windows座標到3d pipeline的螢幕座標及3d pipeline的逆轉換後, 才能得到在3d世界的對應點, 最後確定這個點是否有物體, 這就是picking.

當視窗大小發生改變時,需要對裁剪區域進行同步的修改,一確保影象不會發生變形。

example:

//建立裁剪區域(通常寫在changesize函式當中)

aspectratio=(glfloat)w/(glfloat)h;

if(w<=h)

glortho(-100.0,100.0,-100.0/aspectratio,100.0/aspectratio,1.0,-1.0);

else

glortho(-100.0*aspectratio,100.0*aspectratio,-100.0,100.0,1.0,-1.0);

有的時候,我們在繪畫圖形是,當點座標超過1.0時變無法出圖,願意就是沒有設定好裁剪區域

OpenGL 螢幕座標向OpenGL座標轉換

螢幕座標向opengl座標轉換 很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz g...

螢幕座標向OpenGL座標轉換

很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,pos...

螢幕座標向OpenGL座標轉換

很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,pos...