glViewport()和glOrtho()的理解-OpenGL_第1頁(yè)
glViewport()和glOrtho()的理解-OpenGL_第2頁(yè)
glViewport()和glOrtho()的理解-OpenGL_第3頁(yè)
glViewport()和glOrtho()的理解-OpenGL_第4頁(yè)
glViewport()和glOrtho()的理解-OpenGL_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、glViewport()和glOrtho()的理解-OpenGL在OpenGL中有兩個(gè)比較重要的投影變換函數(shù),glViewport和glOrtho.ortho實(shí)際上是orthographic projection正交投影的縮寫(xiě)。glViewport是視口變換它是設(shè)置視口,它設(shè)置的視口的左下角,以及寬度和高度。glOrtho是窗口變換,設(shè)置的是世界窗口俗稱(chēng)窗口。二維繪圖來(lái)說(shuō)世界窗口由gluOrth2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)設(shè)定。三維繪圖的世界窗口由glOrtho(left, right, bot

2、tom, top, near, far)設(shè)定。glOrtho是創(chuàng)建一個(gè)正交平行的視景體。一般用于物體不會(huì)因?yàn)殡x屏幕的遠(yuǎn)近而產(chǎn)生大小的變換的情況。比如,常用的工程中的制圖等。需要比較精確的顯示。 而作為它的對(duì)立情況, glFrustum則產(chǎn)生一個(gè)透視投影。這是一種模擬真是生活中,人們視野觀(guān)測(cè)物體的真實(shí)情況。例如:觀(guān)察兩條平行的火車(chē)到,在過(guò)了很遠(yuǎn)之后,這兩條鐵軌是會(huì)相交于一處的。還有,離眼睛近的物體看起來(lái)大一些,遠(yuǎn)的物體看起來(lái)小一些。glOrtho(left, right, bottom, top, near, far), left表示視景體左面的坐標(biāo),right表示右面的坐標(biāo),bottom表示下

3、面的,top表示上面的。這個(gè)函數(shù)簡(jiǎn)單理解起來(lái),就是一個(gè)物體擺在那里,你怎么去截取他。這里,我們先拋開(kāi)glViewport函數(shù)不看。先單獨(dú)理解glOrtho的功能。 假設(shè)有一個(gè)球體,半徑為1,圓心在(0, 0, 0),那么,我們?cè)O(shè)定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一個(gè)寬高都是3的框框把這個(gè)球體整個(gè)都裝了進(jìn)來(lái)。 如果設(shè)定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一個(gè)寬是1.5, 高是3的框框把整個(gè)球體的右面裝進(jìn)來(lái);如果設(shè)定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用

4、一個(gè)寬和高都是1.5的框框把球體的右上角裝了進(jìn)來(lái)。從上述三種情況,我們可以大致了解glOrtho函數(shù)的用法。-glViewport(): /設(shè)置視口glOrtho函數(shù)只是負(fù)責(zé)使用什么樣的視景體來(lái)截取圖像,并不負(fù)責(zé)使用某種規(guī)則把圖像呈現(xiàn)在屏幕上。glViewport主要完成這樣的功能。它負(fù)責(zé)把視景體截取的圖像按照怎樣的高和寬顯示到屏幕上。比如:如果我們使用glut庫(kù)建立一個(gè)窗體:glutInitWindowSize(500, 500); 然后使用glutReshapeFunc(reshape); reshape代碼如下:void reshape(int width, int height) gl

5、Viewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixModel(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10); .這樣是可以看到一個(gè)正常的球體的。但是,如果我們創(chuàng)建窗體時(shí)glutInitWindowSize(800, 500),那么看到的圖像就是變形的。因?yàn)槲覀兪怯靡粋€(gè)正方形截面的視景體截取的圖像,但是拉伸到屏幕上顯示的時(shí)候,就變成了glViewport(0, 0, 800, 500);也就是顯示屏變寬了,倒是顯示的時(shí)候把一個(gè)正方形的

6、圖像“活生生的給拉寬了”。就會(huì)產(chǎn)生變形。這樣,就需要我們調(diào)整我們的OpenGL顯示屏了。我們可以不用800那么寬,因?yàn)槲覀兪怯玫恼叫蔚囊暰绑w,所以雖然窗體是800寬,但是我們只用其中的500就夠了。修改一下程序。void reshape(int width, int height) int dis = width height ? width : height; glViewport(0, 0, dis, dis); /*這里dis應(yīng)該是500*/ glMatrixModel(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5,

7、 1.5, -10, 10); .OK. 如果你能看明白我寫(xiě)的內(nèi)容。你可能對(duì)glViewport函數(shù)有個(gè)大致的了解。不過(guò),我們采用上面的辦法,就是只使用了原來(lái)屏幕的一部分(寬度從501到800我們沒(méi)有用來(lái)顯示圖像)。如果我們想用整個(gè)OpenGL屏幕顯示圖像,但是又不使圖像變形怎么辦?那就只能修改glOrtho函數(shù)了。也就是說(shuō),我們使用一個(gè)和窗體一樣比例的視景體(而不再是正方形的視景體)來(lái)截取圖像。例如,對(duì)于(800, 500)的窗體,我們使用glOrtho(-1.5 * 800/500, 1.5 * 800/500, -1.5, 1.5, -10, 10),就是截取的時(shí)候,我們就使用一個(gè)“扁扁

8、”的視景體截取,那么,顯示的到OpenGL屏幕時(shí)(800, 500),我們只要正常把這個(gè)扁扁的截取圖像顯示(扁扁的截取圖像是指整個(gè)截取的圖像,包括球形四周的黑色部分。 球形還是正常圓形的),就可以了。如:void reshape(int width , int height) glViewport(width, height); /按照窗體大小制作OpenGL屏幕 glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (width = height) glOrtho(-1.5, 1.5, -1.5 * (GLfloat)height/(GLfloa

9、t)width, 1.5 * (GLfloat)height/(GLfloat)width, -10.0, 10.0); else glOrtho(-1.5*(GLfloat)width/(GLfloat)height, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); .另外,關(guān)于glViewport()函數(shù),我們還可以用來(lái)調(diào)整圖像的分辨率。例如,保持目前的窗體大小不變,我們?nèi)绻眠@個(gè)size來(lái)只顯示整個(gè)物體的一部分,那么圖像的分辨率就必然會(huì)增大。例如:void reshape(int w, int h) glViewport(0, 0,

10、 (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w = h) glOrtho(0, 1.5, 0, 1.5 * (GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho(0, 1.5*(GLfloat)w/(GLfloat)h, 0, 1.5, -10.0, 10.0);可以把分辨率擴(kuò)大4倍。而如果再修改一下glViewport(0, 0, 2 * (GLsizei)w, 2 * (GLsizei)h); 則可以把分辨率擴(kuò)大16倍。完整的測(cè)試程序:

11、/*Build on ubuntu 9.04*/#include #include #include void init(void) GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0; GLfloat mat_shininess = 50.0; GLfloat light_position = 1.0, 1.0f, 1.0, 0.0; GLfloat white_light = 1.0, 1.0, 1.0, 1.0; GLfloat lmodel_ambient = 0.1, 0.1, 0.1, 1.0; glClearColor(0.0, 0.0, 0.0,

12、 0.0); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); glLightModelfv(GL_

13、LIGHT_MODEL_AMBIENT, lmodel_ambient); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);void display(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSolidSphere(1.0, 20, 16); glFlush();void reshape(int w, int h) glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(G

14、L_PROJECTION); glLoadIdentity(); if (w = h) glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h/(GLfloat)w, 1.5 * (GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho(-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();int main(int argc, char *a

15、rgv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv0); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;/*CMakeLists.txt*/PROJECT(s5)CMAKE_MINIM

16、UM_REQUIRED(VERSION 2.6)ADD_EXECUTABLE(s5 main.cpp)FIND_PACKAGE(OpenGL)FIND_PACKAGE(GLUT)IF(OPENGL_FOUND)INCLUDE_DIRECTORIES($OPENGL_INCLUDE_DIR)TARGET_LINK_LIBRARIES($PROJECT_NAME $OPENGL_LIBRARIES)ELSE(OPENGL_FOUND)MESSAGE(FATAL_ERROR OpenGL not found)ENDIF(OPENGL_FOUND)IF(GLUT_FOUND)INCLUDE_DIRECTORIES($GLUT_INCLUDE_DIR)TARGET_LINK_L

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論