我正在尝试将远剪裁平面设置为更高的值,但我有点迷失。
我正在使用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());
现在,从这个角度看,我的物体被远处的飞机剪掉了。
我试图通过使用具有巨大值的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);
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());
答案 0 :(得分:2)
2个问题:
您正在同一矩阵上混合modelview(lookat)和投影(视锥体)操作。您需要2个不同的矩阵。
您将左右值定义为1.f in :: frustum()。它不能起作用,它们需要不同。 顶部和底部值相同。
以下是QMatrix4x4 :: frustum()的定义摘录:
if (left == right || bottom == top || nearPlane == farPlane)
return *this;
所以你对视锥体的呼吁没有做任何事情。
一旦你有顶/左/上/下的好值,尝试使用近平面距离,因为它可能会夹住你的物体而不是远处的飞机。