我试图通过使用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
重要(近似和远远也包括在归一化值?)中进行计算?是否可以使用屏幕坐标中的值执行相同的操作?
答案 0 :(得分:3)
注意:此问题和答案仅适用于旧版本(版本3之前的版本)OpenGL。
首先,glFrustum与您的屏幕分辨率无关。
此函数定义一个用于绘制场景的体积,也就是说,将忽略/剪切在该体积之外的所有screne元素。 glFrustum的Coordenates是相对于你的场景,而不是你的屏幕。
考虑到正确的表示,必须正确配置其他参数,如场景旋转/翻译等。
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