如何设置OpenGL透视校正?

How to set up OpenGL perspective correction?

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

现在轮到我设置透视校正了,这样显示的图像(例如水平条)在距离苍蝇视点更远的地方显得更宽 (experimental setup)。代码现在看起来像这样:

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);

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

我考虑过那些值:

我从以下渠道获得了有关 glPerspective 的信息:https://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 我还检查了 Simplest way to set up a 3D OpenGL perspective projection ,但是这个 post 没有处理我的实验设置,这是我困惑的根源。

感谢您的帮助!

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

假设您的原始图片是这样的:

"Near"把"distance"给投影屏和右(当然还有上、下、左)尖端各自的距离,呃,垂直于投影的边缘飞屏幕。

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

所以你可以编程为以下内容:

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 和移动本质上是 adding/subtracting 到相同的偏移量。