如何设置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);
几年前有人输入了这些值,我们发现它们不再准确了。但是,我对输入或更改哪些值以使投影正常工作感到困惑,因为正如您在实验设置中看到的那样,苍蝇的视野有点倾斜。
我考虑过那些值:
- fovy = a 和 c 之间的角度
- 测量投影屏幕上的宽度和高度
- 但是zNear是什么?我应该测量飞行到屏幕顶部或底部的距离吗?我不明白为什么有人输入 0.1f,因为这对我来说似乎太近了。
- 我怎么知道zFar的价值?是物体到苍蝇的最大距离吗?
我从以下渠道获得了有关 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 到相同的偏移量。
我正在处理一个实验装置,其中一张简单的图片正在显示给基因修饰的苍蝇。图片投射在屏幕上,与那只苍蝇有一定的距离。
现在轮到我设置透视校正了,这样显示的图像(例如水平条)在距离苍蝇视点更远的地方显得更宽 (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);
几年前有人输入了这些值,我们发现它们不再准确了。但是,我对输入或更改哪些值以使投影正常工作感到困惑,因为正如您在实验设置中看到的那样,苍蝇的视野有点倾斜。
我考虑过那些值:
- fovy = a 和 c 之间的角度
- 测量投影屏幕上的宽度和高度
- 但是zNear是什么?我应该测量飞行到屏幕顶部或底部的距离吗?我不明白为什么有人输入 0.1f,因为这对我来说似乎太近了。
- 我怎么知道zFar的价值?是物体到苍蝇的最大距离吗?
我从以下渠道获得了有关 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 到相同的偏移量。