如何在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());
我是 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());