如果我使用 glFrustum,为啥这个对象会有所不同?

Posted

技术标签:

【中文标题】如果我使用 glFrustum,为啥这个对象会有所不同?【英文标题】:Why is this object drawn different if I use glFrustum?如果我使用 glFrustum,为什么这个对象会有所不同? 【发布时间】:2017-10-30 15:27:18 【问题描述】:

我正在为我的计算机图形类做这个 OpenGL 项目,我在其中显示一个对象并旋转它和其他东西,问题是在项目开始时我们使用了glOrtho(),它看起来真的很棒。

但是现在老师说我们必须使用glFrustum()作为透视图,如果我使用那个函数,对象是这样绘制的,我真的不知道为什么会这样:

这是我来自 init() 函数的代码,一切都发生了变化:

void init (void)

    /*  select clearing (background) color       */
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0, 100.0, -60.0, 160.0, -100.0, 100.0);
    //glFrustum(-100, 100 ,-100 ,100 ,1 , 40);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(90,0,1,0);

感谢您的帮助。

编辑:如果我使用 glFrustum(-100, 100, -100, 100, 20, 200) 它看起来像这样,就像我越来越近了,但是 left、right、top 和 bottom 参数呢?他们同意这些价值观吗?

【问题讨论】:

尝试接近远近比例,你会得到更接近正交投影的结果。例如尝试 glFrustum(-100, 100 ,-100 ,100 , 20, 150)。 40 比 1 是极端的。 @Victor:far/near 的比例绝不会使透视投影更接近正交投影,40:1 的比例也绝不是“极端”的。 【参考方案1】:

如果没有更多信息,很难确定。也许该模型可以提供一些见解。但我怀疑它可能与传递给glFrustum (1, 40) 的参数有关。也许尝试将它们设置为更大的范围,例如您的 glOrtho 调用:1, 150(注意:nearValfarVal 在传递给 glFrustum 时都不能为负数)。

这一切都取决于模型的比例以及它相对于相机的位置。如果模型的一部分落在剪裁平面之外,那么它将被……剪裁。

【讨论】:

以上是关于如果我使用 glFrustum,为啥这个对象会有所不同?的主要内容,如果未能解决你的问题,请参考以下文章

使用 glFrustum 创建拼接场景

如果在一个表达式中同时使用左移和右移,为啥会有所不同?

为啥定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制]

如果我的 VBScript 是由批处理脚本而不是由人打开的,为啥它的功能会有所不同?

如果我将 UTC 时间加 1 小时并进行本地化,或者将本地时间加 1 小时,为啥会有所不同?

为啥 `void* = 0` 和 `void* = nullptr` 会有所不同?