OpenGL的规范化坐标

时间:2013-05-09 08:59:46

标签: c++ algorithm opengl 3d frustum

我试图通过使用glFrustum限制观看音量来在屏幕上剪辑图像。在Glfrustum的官方文档中,提到left, right, top, bottom, near, far是裁剪的坐标。我认为它们是屏幕坐标,并试着这样做:

glFrustum(100, 924, 100, 668, 3, 1000);

上面没有在屏幕上显示任何内容。所以,我只是在某个地方查找并看到一些代码如下(但为什么这些坐标为负?):

glFrustum(-1, 1, -1, 1, 0.5, 1000);

我使用了同样的东西并开始在屏幕上获取图像的某些部分。随后,我小心翼翼地摆弄near的坐标,并注意到观看量的变化。

glFrustum(-10,10,-10,10,10,1000);
glFrustum(-100,100,-100,100,100,1000);
glFrustum(-0.5,0.5,-0.5,0.5,0.5,1000);

以上所有内容都是在屏幕上向我提供相同的图像输出。但是我观察到glFrustum使用的大多数地方,我注意到在[-1,1](例如here)之间使用的值以及在规范化范围内讨论计算的人。为什么在归一化值方面对left, right, bottom, top, near, far重要(近似和远远也包括在归一化值?)中进行计算?是否可以使用屏幕坐标中的值执行相同的操作?

2 个答案:

答案 0 :(得分:3)

  

注意:此问题和答案仅适用于旧版本(版本3之前的版本)OpenGL。

首先,glFrustum与您的屏幕分辨率无关。

此函数定义一个用于绘制场景的体积,也就是说,将忽略/剪切在该体积之外的所有screne元素。 glFrustum的Coordenates是相对于你的场景,而不是你的屏幕。

enter image description here

考虑到正确的表示,必须正确配置其他参数,如场景旋转/翻译等。

glFrustum(-10,10,-10,10,10,1000);
glFrustum(-100,100,-100,100,100,1000);
glFrustum(-0.5,0.5,-0.5,0.5,0.5,1000);
     

以上所有内容都是在屏幕上向我提供相同的图像输出

不完全是,如果您的3D模型靠近POV(camara),示例2将在示例3不会的地方剪切它。但是当你按照“左”,“上”,“下”和“右”的比例增加/减少“近”距离时,结果是相似的。

答案 1 :(得分:0)

这些参数不在您认为的坐标系(空间)中。我发现了这个:http://www.matrix44.net/cms/notes/opengl-3d-graphics/coordinate-systems-in-opengl