gluProject詳解_第1頁
gluProject詳解_第2頁
gluProject詳解_第3頁
gluProject詳解_第4頁
gluProject詳解_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、gluProject 詳解gluProject zz/ glGetDoublev(GL_PROJECTION_MATRIX, matP);/ glGetDoublev(GL_MODELVIEW_MATRIX, matM);/ glGetIntegerv(GL_VIEWPORT, portV);/ gluProject(0.0, 0.0, 0.0, / matM, matP, / portV , / & winx, &winy, &winz);/ /gluUnProject(GLdouble)disp_range0,(GLdouble)disp_r

2、ange 1,0.84,matM,matP,portV ,&winx,&winy,&winz)/ printf("%lf %lf %lfn", winx, winy, winz);在使用 OpenGL 進行三維建模工作的時候, gluProject 無疑是 必須使用的最重要的函數之一,但是我在很長一段時間內 直沒有弄明白這個函數的內在工作過程,相信很多作相關研 究的新手也并不真正清楚(我本身也是新手)。OpenGL紅寶 書中的相關講解也只是針對函數的用途、參數、注意事項等 的說明。當我們需要自己需要加載定標參數來寫一個新的投

3、影函數,或者說將我們定標得到的原始參數擴展成為符合OpenGL 對應的模型視圖矩陣、 投影矩陣、 視口向量的時候, 我們必須知道 OpenGL 的這個函數究竟是如何工作的。本文 只就 gluProject 的工作過程進行分析,對于各種定標參數矩 陣的擴展等內容將在以后的文章中說明。先來揭秘一下 gluProject 函數的本來面目(源代碼)view plaincopy to clipboardprint?static void transform_point(GLdouble out4, const GLdouble m16, const GLdouble in4)#define M(row,

4、col) mcol*4+rowout0 =M(0, 0) * in0 + M(0, 1) * in1 + M(0, 2) * in2 +M(0, 3) * in3;out1 =M(1, 0) * in0 + M(1, 1) * in1 + M(1, 2) * in2 +M(1, 3) * in3;out2 =M(2, 0) * in0 + M(2, 1)* in1 + M(2, 2) * in2 +M(2, 3) * in3;out3 =M(3, 0) * in0 + M(3, 1)* in1 + M(3, 2) * in2 +M(3, 3) * in3;#undef MOpenGL API

5、文檔 )/ gluProject source code ( 說明見GLint gluProject(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble modelMatrix16,const GLdouble projMatrix16, constGLint viewport4,GLdouble *winx, GLdouble *winy,GLdouble *winz)/ matrice transformationGLdouble in4, out4;/initialize matrice and column vecto

6、r as a transformer in0 = objx;in1 = objy;in2 = objz;in3 = 1.0;transform_point(out, modelMatrix, in);/ 乘以模型視圖矩陣transform_point(in, projMatrix, out); /乘以投影矩陣 / 齊次向量的第四項不能為 0 if(in3 = 0.0)return GL_FALSE;/向量齊次化標準化 in0 /= in3;in1 /= in3;in2 /= in3;/視口向量的作用 *winx = viewport0 + (1 + in0) * viewport2 / 2;*

7、winy = viewport1 + (1 + in1) * viewport3 / 2;*winz = (1 + in2) / 2;return GL_TRUE;從這個源碼中我們可以看出以下幾點:1 )觀察 transform_point 函數中矩陣元素和列向量的相乘過程可知,這個矩陣是被轉置后再和列向量相乘的。這就是為 什么說 OpenGL 的矩陣相乘是遵循列主元的,而我們使用gluProject 函數的時候輸入的矩陣參數卻是按照行主元的方 式。2)從列向量被變換的順序可以看出,一個齊次表示的3D點是先經過模型矩陣變換 (蘊含照相機的位移、 旋轉、 縮放等 幾何變換 ),在進行投影變換 (

8、蘊含照相機的內參數,即本身的參數 ),最后使用視口向量將齊次表示的 2D 點限定在當前的視口內。3)根據函數的輸入輸出可以看出,輸入的 3D 點是通過直接將向量的第四個元素 in3 賦值為 1 而齊次化的, 輸出的齊 次表示其實是( winx,winy,1 )。 winz 并不是投影在視口內的2D 坐標的齊次表示的第三個元素,它攜帶的含義是多方面 的:表面上看來,它表示了在視口上的深度值;實際上,它 是由于照相機參數的不精確性(所有照相機模型都是對實際 照相機的模擬,因而不可能完全精確的表達照相機本身)和 矩陣相乘過程中的計算誤差所造成的;因此假如照相機參數 對照相機的建模是完美的,并且計算過程是沒有誤差的,那 么 winz 的最終結果應該是 0 ,在實際的計算中此參數所返回 的值也應該是一個逼近于 0 的數,這個數的大小反映了誤差 的總量。所以我們在使用 gluProject 時通常不必關心 winz 返 回的參數。4)對于返回的( winx,winy ),論壇上曾有朋友發(fā)問說為什 么得到的投影點和實際的點是關于圖像上下倒置

溫馨提示

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

評論

0/150

提交評論