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

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

远平面夹

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

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

观点

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

1 回答 1

2

2个问题:

  1. 您在同一个矩阵上混合模型视图(lookat)和投影(平截头体)操作。你需要2个不同的矩阵。

  2. 您在 ::frustum() 中将左右值都定义为 1.f。它行不通,它们需要不同。顶部和底部值相同。

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

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

因此,您对 frustum 的调用没有任何作用。

一旦你对 top/left/top/bottom 有了良好的值,也可以尝试使用近平面距离,因为它可能会裁剪你的对象而不是远平面。

于 2013-06-30T10:38:21.143 回答