OpenGL中增加远裁剪面距离的简单方法是什么?

3
我正在尝试将远裁剪平面设置为更高的值,但我有些迷失。
我正在使用类似于 QMatrix4x4 的相机透视查看一个复杂对象:
glMatrixMode(GL_MODELVIEW);
m_view = QMatrix4x4();
m_view.lookAt(QVector3D(17.f, 36.f, 36.f),  // eye
              QVector3D(17.f,  0.f, 19.f),  // center
              QVector3D( 0.f,  0.f, -1.f)); // up
glLoadMatrixf(m_view.data());

现在,从这个角度来看,我的物体正在被远平面剪裁。

far plane clip

我尝试使用截锥体矩阵操作并设置一个巨大的值来增加远平面距离。我想要修改的只是后方裁剪平面:

m_view.frustum(1.f, 1.f, 1.f, 1.f, 1.f, 200000.f);

但这并没有显示出任何差异,修改farPlane参数不会改变任何东西。 正交投影也是如此:
m_view.ortho(1.f, 1.f, 1.f, 1.f, 1.f, 200000.f);

或者角度

m_view.perspective(0.f, 1.f, 1.f, 200000.f);

我的方法有什么问题?如何修改远裁剪面?

编辑

我已经扩展了上面的代码片段,因为问题不可见。显然我的错误是修改了GL_MODELVIEW而不是GL_PROJECTION

正常工作的代码应该像这样:

// Projection
m_projection = QMatrix4x4();
m_projection.perspective(20.f, m_width / m_height, 0.01f, 2000.f); // note the far plane
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(m_projection.data());
// Model view
m_view = QMatrix4x4();
m_view.lookAt(QVector3D(17.f, 36.f, 36.f),  // eye
              QVector3D(17.f,  0.f, 19.f),  // center
              QVector3D( 0.f,  0.f, -1.f)); // up
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m_view.data());
1个回答

2

有两个问题:

  1. 您正在同一个矩阵上混合modelview(lookat)和projection(frustum)操作。您需要两个不同的矩阵。

  2. 您在::frustum()中将左值和右值均定义为1.f。这是行不通的,它们需要不同。顶部和底部值也是如此。

以下是QMatrix4x4 :: frustum()定义的摘录:

if (left == right || bottom == top || nearPlane == farPlane)    
    return *this;

所以你对棱台的调用没有任何作用。

一旦你有了良好的top/left/bottom值,请尝试调整近平面距离,因为它可能是剪裁你的物体而不是远平面。


零值和负值均无效。:( - q9f
使用负值来设置z轴可能会有问题,尝试同时使用负值来设置远裁剪平面。另外,请确保这是您想要的。通常情况下,up向量是(0,1,0)(y轴指向上方)。 - Yohan Danvin
是的,我也试过了。在任何方向上修改近和远都没有任何效果。 - q9f
1
嗯。你确定之后会使用m_view吗?如果你改变它没有效果,也许是因为它根本没有生效,你正在改变一个未使用的变量。 - Yohan Danvin
是的。看一下我的问题中的代码,m_view.lookAt() 的工作效果很好,但是 m_view.frustum() 对近平面和远平面没有任何影响。修改视锥体的左、右、上、下参数确实在某种程度上起作用。只有近平面和远平面没有变化。 - q9f
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接