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

时间:2015-11-17 17:26:16

标签: qt opengl qt5 qt5.5

我对Qt很新,很抱歉,如果这是一个直截了当的问题。

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

这是我的标题:

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

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

point cloud from Kinect V2

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

1 个答案:

答案 0 :(得分:2)

m_projection只是您班级中的成员变量。它不会自动“跳转”到OpenGL上下文中。您必须将其显式加载到OpenGL中。通常,您将这样的矩阵加载到制服中以用于着色器。但是既然你没有使用着色器(booo!;-))并使用旧的,丑陋的和慢的立即模式(不要这样做),你必须将它加载到固定的函数投影矩阵中。

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