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

时间:2013-06-30 10:20:09

标签: c++ opengl qt5 perspective graphical-programming

我正在尝试将远剪裁平面设置为更高的值,但我有点迷失。

我正在使用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

我试图通过使用具有巨大值的frustum矩阵运算来增加远平面距离。我想要的是修改后剪裁平面:

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

但是这没有任何区别,修改farPlane参数不会改变任何东西。这同样适用于ortho

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

perspective

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 个答案:

答案 0 :(得分:2)

2个问题:

  1. 您正在同一矩阵上混合modelview(lookat)和投影(视锥体)操作。您需要2个不同的矩阵。

  2. 您将左右值定义为1.f in :: frustum()。它不能起作用,它们需要不同。 顶部和底部值相同。

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

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

    所以你对视锥体的呼吁没有做任何事情。

    一旦你有顶/左/上/下的好值,尝试使用近平面距离,因为它可能会夹住你的物体而不是远处的飞机。