我对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();
}
}
这是我的点云在可视化后的样子:
我的问题是,正如你所看到的那样(例如,监视器被切成两半)如果一个点有一个更大的z值,那么1.0就会被剪掉。我试图设置近和远的平面,但没有效果。我搜索了谷歌并尝试了几件事,但无法弄清楚它在Qt中是如何工作的。我以前用OpenGL和GLUT可视化这个点云。任何帮助或解释如何在Qt中执行此操作将非常感谢!
答案 0 :(得分:2)
m_projection
只是您班级中的成员变量。它不会自动“跳转”到OpenGL上下文中。您必须将其显式加载到OpenGL中。通常,您将这样的矩阵加载到制服中以用于着色器。但是既然你没有使用着色器(booo!;-))并使用旧的,丑陋的和慢的立即模式(不要这样做),你必须将它加载到固定的函数投影矩阵中。
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(m_projection.constData());