1

我正在处理一个实验设置,其中向基因修饰的苍蝇显示一张简单的图片。画面被投射到与那只苍蝇有一定距离的屏幕上。

现在轮到我设置透视校正,以便显示的图像(例如水平条)在距离苍蝇视点较远的地方显得更宽(实验设置)。代码现在如下所示:

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 的信息:https ://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 我还检查了设置 3D OpenGL 透视投影的最简单方法,但这篇文章没有不要对待我的实验设置,这是我困惑的根源。

感谢您的任何帮助!

4

1 回答 1

0

这是平截头体方法比透视法更易于使用的主要示例之一。截锥体本质上是一个截断的金字塔。想象一下你的苍蝇在一个四面倾斜的金字塔的顶端。Near 值给出了到金字塔底部的距离,left、right、bottom 和 top 给出了金字塔底部每一侧到尖端的垂直距离。尖端位于基区“外部”是完全合理的。或者在你的飞行的情况下,中心可能就在“左”边缘的上方。

所以假设你的原始图片我们有这个:

平截头体

“近”给出了到投影屏幕的“距离”,右侧(当然还有顶部、底部和左侧)分别是尖端的距离,错误的,垂直于屏幕边缘飞行。

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

所以你可以编程如下:

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并且移位本质上是添加/减去两个相同的偏移量。

于 2016-06-24T12:31:33.327 回答