如何设置OpenGL透视校正?

时间:2016-06-24 10:21:33

标签: opengl perspective frustum

我正在处理一个实验设置,其中一个简单的图片显示在基因修改的苍蝇上。图片投影在与飞行距离一定距离的屏幕上。

现在轮到我设置透视校正,以便显示的图像(例如水平条)在距离苍蝇的视角更长的距离内显得更宽({{3 })。代码现在看起来像这样:

glMatrixMode(GL_PROJECTION);                        
glLoadIdentity();

if(!USEFRUSTUM)
   gluPerspective(90.0f, 2 * width/height, 0.1f, 100.0f);
else
   glFrustum(92.3f, 2.3f, -25.0f, 65.0f, 50.0f, 1000.0f);

这些价​​值是几年前由某人输入的,我们发现它们不再准确。但是,我很困惑要输入或更改哪些值以使投影正常工作,因为正如您在实验设置中看到的那样,飞行的视野有点倾斜。

我想到了这些价值观:

  • fovy = a和c之间的角度
  • 在投影屏幕上测量宽度和高度
  • 但zNear是什么?我应该测量从飞行到屏幕顶部或底部的距离吗?我不明白为什么有人输入了0.1f,因为这对我来说太近了。
  • 我如何知道zFar的价值?它是物体飞行的最大距离吗?

我从以下网址获取了关于glPerspective的信息:experimental setup 我还检查了https://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html,但这篇文章并没有对我的实验设置进行处理,这是我混淆的原因。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是截头方法比透视更容易使用的主要示例之一。截锥体本质上是一个截断的金字塔。想象一下你的飞行在一个四边倾斜金字塔的尖端。近值给出了金字塔底座的距离以及金字塔底座每边与顶端的垂直距离的左,右,底部和顶部。尖端在外面"是完全合理的。基地面积。或者如果你的飞行,中心可能正好在"左边"边缘。

假设您的原始图片我们有这个:

fly frustum

"近"给出距离"到投影屏幕和右边(当然还有顶部,底部和左边),尖端的相应距离,错误,垂直于屏幕边缘飞行。

"远"对于投影特征并不重要,仅用于确定深度范围。

所以你可以编程的是以下内容:

double near   = ${distance to screen in mm};
double left   = ${perpendicular to left screen edge in mm};
double right  = ${perpendicular to right screen edge in mm};
double top    = ${perpendicular to top screen edge in mm};
double bottom = ${perpendicular to bottom screen edge in mm};
double s = ${scaling factor from mm into OpenGL units};
double zrange = ${depth range in OpenGL units the far plane is behind near};
glFrustum(s*left, s*right, s*bottom, s*top, s*near, s*near + zrange);

请记住,左,右,上和下可能是负面的。所以说你想要在一个方向上对称(未移位)视图,left = -bottom并且移位实质上是对相同的偏移量加/减。