如何在QOpenGLWidget中设置远剪裁平面?

How to set far clipping plane in QOpenGLWidget?

我是 Qt 的新手,如果这是一个简单的问题,我很抱歉。

我正在使用 Qt 5.5 并尝试在 QOpenGLWidget 中可视化点云。

这是我的 header:

class PointCloudWindow : public QOpenGLWidget
{
public:
    void setDepthMap(DepthMapGrabber* grabber);

protected:
    void initializeGL();
    void paintGL();

private:
    QMatrix4x4 m_projection;
    DepthMapGrabber* m_grabber;
};

这里是对应的cpp:

void PointCloudWindow::setDepthMap(DepthMapGrabber* grabber) {
    m_grabber = grabber;

    QTimer* updatePointCloud = new QTimer(this);
    connect(updatePointCloud, SIGNAL(timeout()), SLOT(update()));
    updatePointCloud->start();
}

void PointCloudWindow::initializeGL() {
    glewInit(); // TODO: check for return value if error occured

    glEnable(GL_DEPTH_TEST);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void PointCloudWindow::paintGL() {
    m_grabber->getNextDepthFrame(); // TODO: check for return value if error occured

    m_projection.setToIdentity();
    m_projection.perspective(45.0f, width() / (float)height(), 0.01f, 100.0f);

    if (m_grabber->getDepthMap()->cloud) {
        glBegin(GL_POINTS);
        glColor3f(0.8f, 0.8f, 0.8f);
        for (UINT i = 0; i < m_grabber->getDepthMap()->size; ++i)
        {
            glVertex3f(m_grabber->getDepthMap()->cloud[i].X, m_grabber->getDepthMap()->cloud[i].Y, m_grabber->getDepthMap()->cloud[i].Z);
        }
        glEnd();
    }
}

这是我的点云可视化后的样子:

我的问题是,如您所见(例如,显示器被切成两半)如果一个点的 z 值更大,那么 1.0 就会被剪掉。我试图设置近平面和远平面,但没有效果。我搜索了 Google 并尝试了几件事,但无法弄清楚这在 Qt 中是如何工作的。我之前用 OpenGL 和 GLUT 设法可视化了这个点云。非常感谢任何帮助或解释如何在 Qt 中执行此操作!

m_projection只是你的class中的一个成员变量。它不会自动 "jump" 进入 OpenGL 上下文。您必须明确地将其加载到 OpenGL 中。通常,您会将这样的矩阵加载到制服中,以便在着色器中使用。但是由于您没有使用着色器 (booo!;-) ) 并使用旧的、丑陋的和缓慢的即时模式(不要那样做),您必须将它加载到固定函数投影矩阵中。

glMatrixMode(GL_PROJECTION);
glLoadMatrixd(m_projection.constData());