OpenGL學習十 視口,正投影,透視投影

2021-06-20 06:49:44 字數 4792 閱讀 7471

正投影:將物體直接投影到螢幕上,不改變其大小

glortho (gldouble left, gldouble right, gldouble bottom, gldouble top, gldouble znear, gldouble zfar);

透視投影:遠處的東西看起來要小一些,近處的東西看起來會大一些,這就是透視原理

gluperspective(gldouble fovy,gldouble aspect,gldouble znear,gldouble zfar)

首先得設定gluperspective,來看看它的引數都表示什麼意思

fovy,這個最難理解,我的理解是,眼睛睜開的角度,即,視角的大小,如果設定為0,相當你閉上眼睛了,所以什麼也看不到,如果為180,那麼可以認為你的視界很廣闊,

aspect,這個好理解,就是實際視窗的縱橫比,即x/y

znear,這個呢,表示你近處剪裁面

zfar表示遠處剪裁面

glviewport(0,0,600,480);  

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(45.0f,(glfloat)600/(glfloat)480,0.1f,100.0f);

glmatrixmode(gl_modelview);

glloadidentity();

視窗的大小是800*600 視口的大小是600*480,可以看出視口是以視窗的左下角為原點的乙個區域

gltranslatef(0.0f,0.0f,-3.0f);

glbindtexture(gl_texture_2d, texture[0]);

glcolor3f(1.0f,1.0f,0.0f);//黃色圖形

glbegin(gl_quads)

gltexcoord2f(0.0f, 0.0f); glvertex3f(0.0f,0.0f,0.0f);

gltexcoord2f(1.0f,0.0f); glvertex3f(1.0f, 0.0f,0.0f);

gltexcoord2f(1.0f,1.0f);glvertex3f(1.0f, 1.0f, 0.0f);

gltexcoord2f(0.0f,1.0f);glvertex3f(0.0f, 1.0f, 0.0f);

glend();

glmatrixmode(gl_projection);

glpushmatrix();

glloadidentity()

glortho(0,800,0,600,-1,1);

glmatrixmode(gl_modelview);

glpushmatrix();

glloadidentity()

glcolor3f(0.0f,1.0f,0.0f);//綠色圖形

glbegin(gl_quads)

gltexcoord2f(0.0f, 0.0f); glvertex3i(10, 30, 0);

gltexcoord2f(1.0f,0.0f); glvertex3i(110, 30, 0);

gltexcoord2f(1.0f,1.0f);glvertex3i(110, 130, 0);

gltexcoord2f(0.0f,1.0f);glvertex3i(10, 130, 0);

glend();

glmatrixmode(gl_projection);

glpopmatrix()

glmatrixmode(gl_modelview);

glpopmatrix();

建立right=800,top=600的正投影。可以看到正投影以左下角為原點(雖然視口是600*400,此處會按照比例進行縮放)

glmatrixmode(gl_projection)

glpushmatrix();

glloadidentity();

glortho(0,800,600,0,-1,1);

glmatrixmode(gl_modelview);

glpushmatrix()

glloadidentity();

glscaled(2,2,2);

glcolor3f(1.0f,0.0f,0.0f);//紅色圖形

glbegin(gl_quads);

gltexcoord2f(0.0f, 0.0f);glvertex3i(10, 30, 0);

gltexcoord2f(1.0f,0.0f);glvertex3i(110, 30, 0);

gltexcoord2f(1.0f,1.0f);glvertex3i(110, 130, 0);

gltexcoord2f(0.0f,1.0f);glvertex3i(10, 130, 0);

glend();

glmatrixmode(gl_projection)

glpopmatrix();

glmatrixmode(gl_modelview)

glpopmatrix()

建立right=800,bottom=600的正投影。可以看到正投影以左上角為原點(雖然視口是600*400,此處會按照比例進行縮放)glscaled可以對正投影進行縮放,gltranslatef可對透視投影進行縮放

建立left=800,bottom=600的正投影。可以看到正投影以右上角為原點

建立left=800,top=600的正投影。可以看到正投影以右上角為原點

正投影是以原比例進行顯示不會隨著z軸的變化而變化

視口:viewport當我們投影完成以後投影內容會按照視口的比例進行拉伸和縮放

舉例:視口的大小是800*600  假設我們正投影設定為 width 8 height 6 那麼顯示出來的效果就是物體寬高都拉伸100倍

glviewport(0,0,800,600);

glortho(0,200,0,150,-1,1);

glbegin(gl_quads);

gltexcoord2f(0.0f, 0.0f); glvertex3f(0, 0,  0);

gltexcoord2f(1.0f,0.0f); glvertex3f(100, 0,  0);

gltexcoord2f(1.0f,1.0f);glvertex3f(100,  100,  0);

gltexcoord2f(0.0f,1.0f);glvertex3f(0,  100,  0);

glend()

分析:可知四邊形寬度和高度都是100,乘以係數 分別為weight(100*800/200),height(100*600/150)

OpenGL視口變換函式 glViewport

呼叫glviewport函式來決定視見區域,告訴opengl應把渲染之後的圖形繪製在窗體的哪個部位。當視見區域是整個窗體時,opengl將把渲染結果繪製到整個視窗。glviewport x glint y glint width glsizei height glsizei 其中,引數x,y指定了視...

OpenGL中的視窗與視口

目標 測試opengl視窗視口座標 結果 glutinitwindowsize 640,480 指定的是windows概念中視窗 看得見,可移動,最大化,最小化等操作 大小,以畫素為單位 opengl中的視窗和視口是邏輯上的概念,其中視窗範圍是畫圖時指定頂點座標使用的座標,而視口範圍是將window...

OpenGL概念辨析 視窗,視口,裁剪區域

1.視窗 這就不用解釋了吧 2.視口 就是視窗中用來顯示圖形的一塊矩形區域,它可以和視窗等大,也可以比視窗大或者小。只有繪製在視口區域中的圖形才能被顯示,如果圖形有一部分超出了視口區域,那麼那一部分是看不到的。通過glviewport 函式設定。如下圖所示 圖1.不同大小的視口 3.裁剪區域 平行投...