澄清glFrustum,以及为什么我看不到图像
Clarify glFrustum, and why I can't see the image
当前我的glFrustum设置为
glFrustum(0, 100.0, 0, 100.0, -50, 50);
我的图像是一个矩形立方体,尺寸为:当形状的尺寸小于观察框时,为什么我看不到图像?
//top
glBegin(GL_POLYGON);
glVertex3f(25, 60, 25);
glVertex3f(75, 60, 25);
glVertex3f(75, 60, -25);
glVertex3f(25, 60, -25);
glEnd();
//bottom
glBegin(GL_POLYGON);
glVertex3f(25, 55, 25);
glVertex3f(75, 55, 25);
glVertex3f(75, 55, -25);
glVertex3f(25, 55, -25);
glEnd();
//front
glBegin(GL_POLYGON);
glVertex3f(25, 55, 25);
glVertex3f(75, 55, 25);
glVertex3f(75, 60, 25);
glVertex3f(25, 60, 25);
glEnd();
//back
glBegin(GL_POLYGON);
glVertex3f(25, 60, -25);
glVertex3f(75, 60, -25);
glVertex3f(75, 55, -25);
glVertex3f(25, 55, -25);
glEnd();
此glFrustum()
调用的参数无效:
glFrustum(0, 100.0, 0, 100.0, -50, 50);
第5个参数nearVal
必须为正。来自手册页:
nearVal,farVal:指定到近深度剪裁平面和远深度剪裁平面的距离。两个距离都必须为正。
把这些想象成与相机的距离,沿着相机指向的方向。值为-50.0会将近剪裁平面置于摄影机后面,这是无效的。
要使其工作,同时保持相同的范围,您可以将其更改为例如:
glFrustum(0.0, 100.0, 0.0, 100.0, 50.0, 150.0);
在没有任何附加变换的情况下,摄影机将从原点指向负z轴。由于与原始代码相比,我们将远近距离移动了100.0,因此需要相应地移动对象,这对应于在z方向上平移-100.0。为此,您可以修改顶点的坐标,也可以将变换作为模型视图变换的一部分:
glPushMatrix();
glTranslatef(0.0f, 0.0f, -100.0f);
// draw calls
glPopMatrix();
还要注意,glFrustum()
调用的前4个参数有些非常规。它们指定了一个非对称的截头体。结果将看起来像是将相机放置在窗口的一角上方。虽然这是完全合法的,但它可能看起来很奇怪。对称截头体更常见,这意味着左/右和上/下都有相同的绝对值,符号相反。例如:
glFrustum(-50.0, 50.0, -50.0, 50.0, 50.0, 150.0);
要匹配此项,您需要将几何体的x/y坐标放置在原点周围。
相关文章:
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 为什么我的 FreeRTOS 任务看不到类成员?
- 为什么我看不到字符串?
- 我想使用 "cout" 命令慢慢打印文本,但我真的找不到任何解决方案
- handleMessage看不到我的类和函数
- 为什么即使链接器找到目标文件,我的程序也看不到函数定义?
- C++概念看到我的类型的函数,但看不到 std::vector 的函数
- QML可以看到我的Q_GADGET,但看不到Q_OBJECT
- 看不到我在 c++ 中传递给另一个函数的主函数中的值
- 我需要创建一个函数在用户下打印"=",但由于变量是使用 main() 声明的,因此函数看不到参数
- 为什么我看不到被捕获的图像
- 为什么在从 c++ 中的函数返回对象的情况下,我看不到正在调用的复制构造函数?
- 为什么Qt看不到我的插槽?
- 为什么我看不到任何输出迭代这个向量?
- 我的C++窗口程序运行,但我看不到
- 看不到我的 c++ 程序 (debian) 的输出
- Project1.exe已停止工作.我似乎找不到我的SDL代码到底出了什么问题
- 当我尝试将类放入标头中时,当我使用类中的字符串进行编译时,我收到找不到成员的错误
- 我收到"找不到标识符"错误
- 即使图书馆存在,我也找不到