OpenGL坐標(biāo) 逆變換和模擬變換_第1頁(yè)
OpenGL坐標(biāo) 逆變換和模擬變換_第2頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

逆變換和模擬變換幾何處理管線擅長(zhǎng)使用視圖和投影矩陣以及用于裁剪的視口把頂點(diǎn)的世界(物體)坐標(biāo)變換為窗口(屏幕)坐標(biāo)。但是,在有些情況下,需要反轉(zhuǎn)這個(gè)過(guò)程。一種常見(jiàn)的情形就是應(yīng)用程序的用戶利用鼠標(biāo)選擇了三維空間中的一個(gè)位置。鼠標(biāo)只返回一個(gè)二維值,也就是鼠標(biāo)光標(biāo)的屏幕位置。因此,應(yīng)用程序必須反轉(zhuǎn)變換過(guò)程,確定這個(gè)屏幕位置源于三維空間的什么地方。OpenGL工具函數(shù)庫(kù)中g(shù)luUnProject()和gluUnProject4()函數(shù)用于執(zhí)行這種逆變換操作。只要提供一個(gè)經(jīng)過(guò)變換的頂點(diǎn)的三維窗口坐標(biāo)以及所有對(duì)它產(chǎn)生影響的變換,gluUnProject()就可以返回這個(gè)頂點(diǎn)的源物體坐標(biāo)。如果深度范圍不是默認(rèn)的[0,1],應(yīng)該使用gluUnProject4()函數(shù)。intgluUnProject(GLdoublewinx,GLdoublewiny,GLdoublewinz,constGLdoublemodelMatrix[16],constGLdoubleprojMatrix[16],constGLintviewport[4],GLdouble*objx,GLdouble*objy,GLdouble*objz);這個(gè)函數(shù)使用由模型視圖矩陣(modelMatrix)、投影矩陣(projMatrix)和視口(viewport)定義的變換,把指定的窗口坐標(biāo)(winx,winy,winz)映射到物體坐標(biāo)。它產(chǎn)生的物體坐標(biāo)是在objx、objy和objz中返回的。這個(gè)函數(shù)返回GL_TRUE(表示成功)或GL_FALSE(表示失敗,例如矩陣不可逆)。這個(gè)函數(shù)并不會(huì)使用視口對(duì)坐標(biāo)進(jìn)行裁剪,也不會(huì)消除那些位于glDepthRange()范圍之外的深度值。對(duì)變換過(guò)程進(jìn)行逆操作存在一些固有的難度。二維屏幕上的一個(gè)位置可以來(lái)自于三維空間中一條直線上的任意一點(diǎn)。為了消除這種歧義,gluUnProject()要求提供一個(gè)窗口深度坐標(biāo)(winz),它是根據(jù)glDepthRange()函數(shù)指定的。關(guān)于深度范圍的更多信息,參見(jiàn)第3.4.2節(jié)。如果使用的是glDepthRange()的默認(rèn)值,winz為0.0表示這個(gè)經(jīng)過(guò)變換的點(diǎn)的物體坐標(biāo)位于近側(cè)裁剪平面上,如果winz是1.0表示它的坐標(biāo)位于遠(yuǎn)側(cè)裁剪平面上。示例程序3-8說(shuō)明了gluUnProject()函數(shù)的用法。這個(gè)程序讀取鼠標(biāo)位置,并確定鼠標(biāo)光標(biāo)位置經(jīng)過(guò)變換之后在三維空間的近側(cè)裁剪平面和遠(yuǎn)側(cè)裁剪平面上的點(diǎn)。經(jīng)過(guò)計(jì)算得的物體坐標(biāo)被打印到標(biāo)準(zhǔn)輸出,但渲染的窗口本身仍然保持為黑色。示例程序3-8逆變換幾何處理管線:unproject.cvoiddisplay(void){glClear(GL_COLOR_BUFFER_BIT);glFlush();}voidreshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0,(GLfloat)w/(GLfloat)h,1.0,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidmouse(intbutton,intstate,intx,inty){GLintviewport[4];GLdoublemvmatrix[16],projmatrix[16];GLintrealy;/*OpenGLycoordinateposition*/GLdoublewx,wy,wz;/*returnedworldx,y,zcoords*/110第3章switch(button){caseGLUT_LEFT_BUTTON:if(state==GLUT_DOWN){glGetIntegerv(GL_VIEWPORT,viewport);glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);/*noteviewport[3]isheightofwindowinpixels*/realy=viewport[3]-(GLint)y-1;printf("Coordinatesatcursorare(%4d,%4d)\n",x,realy);gluUnProject((GLdouble)x,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);printf("Worldcoordsatz=0.0are(%f,%f,%f)\n",wx,wy,wz);gluUnProject((GLdouble)x,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);printf("Worldcoordsatz=1.0are(%f,%f,%f)\n",wx,wy,wz);}break;caseGLUT_RIGHT_BUTTON:if(state==GLUT_DOWN)exit(0);break;default:break;}}intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMouseFunc(mouse);glutMainLoop();return0;}GLU1.3引入了一個(gè)經(jīng)過(guò)修改的gluUnProject()版本。gluUnProject4()可以處理非標(biāo)準(zhǔn)的glDepthRange()值,也可以處理w坐標(biāo)值不等于1的情況。intgluUnProject4(GLdoublewinx,GLdoublewiny,GLdoublewinz,GLdoubleclipw,constGLdoublemodelMatrix[16],constGLdoubleprojMatrix[16],constGLintviewport[4],GLclampdzNear,GLclampdzFar,GLdouble*objx,GLdouble*objy,GLdouble*objz,GLdouble*objw);總體上說(shuō),這個(gè)函數(shù)的功能類(lèi)似于gluUnProject()。它使用由模型視圖矩陣、投影矩陣、視口和深度范圍值z(mì)Near和zFar定義的變換,把指定的窗口坐標(biāo)(winx,winy,winz)映射到物體坐標(biāo)。它產(chǎn)生的物體坐標(biāo)是在objx、objy、ojbz和objw中返回的。gluProject()是另一個(gè)工具函數(shù)庫(kù)中的函數(shù),和gluUnProject()相對(duì)應(yīng)。gluProject()模擬變換管線的操作。只要提供三維物體坐標(biāo)以及對(duì)它們產(chǎn)生影響的所有變換,gluProject()就會(huì)返回經(jīng)過(guò)變換的窗口坐標(biāo)。intgluProject(GLdoubleobjx,GLdoubleobjy,GLdoubleobjz,constGLdoublemodelMatrix[16],constGLdoubleprojMatrix[16],constGLintviewport[4],GLdouble*winx,GLdouble*winy,GLdouble*winz);這個(gè)函數(shù)使用由模型視圖矩陣、投影矩陣和視口定義的變換,把指定的物體坐標(biāo)(objx,objy,objz)變換為窗口坐標(biāo)。它產(chǎn)生的窗口坐標(biāo)是在winx、winy和winz中返回的。這個(gè)函數(shù)返回GL_TRUE(表示成功)或GL_FALSE(表示失敗)。注意:傳遞給gluUnProject()、gluUnProject4()

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論