正投影:將物體直接投影到螢幕上,不改變其大小
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.裁剪區域 平行投...