2013-12-18 86 views
2

我有一個程序做增強現實技術在OpenGL使用:glFrustum,gluPerspective和FOV

glFrustum(-near*centerImageX/(GLfloat)fx, near*(imageWidth-centerImageX)/(GLfloat)fx, near*(centerImageY-imageHeight)/(GLfloat)fy, near*centerImageY/(GLfloat)fy, near, far); 

這是確定的,我得到了很好的觀點,我的3D對象以及插在我的照片。現在我想能夠放大/縮小。通常情況下,它通過改變gluPerspective中的fov來完成,但我不使用gluPerspective,因爲我無法獲得良好的插入。

隨着http://dmi.uib.es/~josemaria/files/OpenGLFAQ/transformations.htm,問題 「?9.085怎樣才能做出glFrustum(通話),我調用gluPerspective()匹配」,我試着用:

fov=360.0*atan(imageHeight/(2*fy))/Pi; //computed with parameters top and bottom of my glFrustum 
aspect=-centerImageY*fx/(fy*(centerImageX-imageWidth)); //computed with parameters left and bottom of my glFrustum 

無效glFrustum(GLdouble左,GLdouble右,GLdouble底部,GLdouble頂部,GLdouble近,GLdouble遠);

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble near,GLdouble far);

然後:

gluPerspective(fov, aspect, near, far); 

但我的目標是扭曲的,這不是正確的所有軸縮放比例不存。

那麼我需要做什麼/修改我的glFrustum參數來獲得放大/縮小效果?

+0

我覺得你的邊界的計算在'glOrtho(近平面...)'可能是錯的。你的左和底錐臺從中心開始。通常該中心將是...中心。我期望看到* near(*)*(centerImageX-imageWidth/2.0)/(GLfloat)如果你正確導出它們,縱橫比應該與'imageHeight'和'imageWidth'的比率相關,並且與'centerImageX'無關。除非我在這裏錯過了一些基本的東西 –

回答

0

通常,這不是通過更改fov in gluPerspective()來完成的。

通常情況下,您可以將轉換應用於模型和/或視圖矩陣。如果您想要移動模型,通常在模型矩陣中執行此操作。如果你想改變「相機位置」,你通常會在視圖矩陣中做到這一點。

就你而言,你可能會翻譯視圖矩陣。因爲這可以解決您的3D物體錯位的問題,或者更接近相機。

如果您仍在使用固定功能管道,則可以通過調用以下某些功能來執行這些更改。

  • glMatrixMode(x); - 其中x是GL_PROJECTION_MATRIXGL_MODELVIEW_MATRIX
  • glLoadIdentity(); - 「復位」 當前選擇的矩陣。
  • glTranslate*(x, y, z);
  • glRotate*(angle, x, y, z);
  • glScale*(x, y, z);

不過,如果你使用OpenGL的現代化,那麼請不要使用上述(你也真的不能再)。相反,你想自己計算所有的矩陣變換,並將它們傳遞給着色器。如果你不想自己計算所有這些高級矩陣運算,你可以得到像GLM(OpenGL Mathematics)這樣的東西。

+0

最後,我保留了glFrustum,我只是用一個比例因子乘以我的變換矩陣,並且它做了我想要的。謝謝! – SteveTJS

+0

@SteveTJS:我意識到這很晚了,但如果這解決了你的問題,你應該投票並接受答案。 – ray

+0

有點迂腐(也很晚),但實際上「縮放」_應該修改透視FOV。翻譯視圖矩陣將等同於「移動車」。這是一個微妙的區別,但他們在實踐中看起來不同。 – criptych