c++ - OpenGL 的标准化坐标

标签 c++ algorithm opengl 3d frustum

我试图通过使用 glFrustum 限制观看体积来剪辑屏幕上的图像。在Glfrustum的官方文档中,提到左、右、上、下、近、远是裁剪的坐标。我认为它们是屏幕坐标并尝试这样做:

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 )以及人们谈论标准化范围内的计算。就归一化值而言,为什么计算左、右、下、上、近、远很重要(近和远也包含在归一化值中?)?是否也可以使用屏幕坐标中的值执行相同的操作?

最佳答案

NOTE: This question and answer is only valid for older (before version 3) OpenGL.

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

此函数定义了一个将在其中绘制场景的体积,也就是说,屏幕中抛出该体积之外的所有元素都将被忽略/剪切。 glFrustum 的坐标是相对于您的场景,而不是您的屏幕。

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

All the above were giving the same output of the images to me on the screen

不完全是这样,如果您的 3D 模型靠近 POV(摄像机),示例 2 会剪切它,而示例 3 则不会。但是,当您按“左”、“上”、“下”和“右”的比例增加/减少“近”距离时,结果是相似的。

关于c++ - OpenGL 的标准化坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458048/

相关文章:

c++ - 如何简化这个冗余的 C++ 代码?

c++ - 为什么 float 是 "unexpected type"

c++ - 指没有glGetUniformLocation的制服

c++ - OpenGL - 使用 glDrawElements 进行索引绘制

c++ - GCC -msse2 不生成 SIMD 代码

c++ - QODBC3 无法绑定(bind)到变量

c++ - 我的 ifstream 似乎不起作用

javascript - 很难理解最长回文算法

c - 位图缩放同时保持居中

algorithm - 迭代格雷码更改位置的有效方法