2013-12-18 57 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