0

我在我的项目中使用libQGLViewer来绘制机器人的轨迹。为此,我从示例中提供的simpleViewer的代码开始。

为了做我的事情,我将这些代码行放在draw函数中:

void Viewer::draw()
{

  glPushMatrix();
  for (auto pose : poses)
  {
    std::vector<float> m;
    poseToVector(pose, m);

    glPushMatrix();
    multMatrix(m);
    drawReferenceSystem();
    glPopMatrix();
  }
  glPopMatrix();
}

其中poseToVector和函数是 OpenGL 包装器multMatrixdrawReferenceSystem用于实现所需的功能。

现在,我的问题是,在poses我的代码的每次迭代中,向量都被填充了一个新的姿势。因此,我现在正在做的是在第 1 次迭代中绘制姿势 1,在第 2 次迭代中绘制姿势 1 和 2,在第 3 次迭代中绘制姿势 1,2 和 3,依此类推。

出于这个原因,我想知道是否有更有效的方法来执行此操作。但是,如果我只是得到back向量的 ,我将在每个时间瞬间只看到最后一个姿势。我猜这是因为每次draw调用该函数时都会清除帧缓冲区。

因此,我的问题是:是否可以避免清除缓冲区或者我只是在胡说八道?

4

1 回答 1

1

preDraw清除屏幕并重置矩阵。您可以继承 QGLViewer 并覆盖它以删除清除行为。

默认实现是:

void QGLViewer::preDraw() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // this line should be removed here or in a sublass.

  // GL_PROJECTION matrix
  camera()->loadProjectionMatrix();
  // GL_MODELVIEW matrix
  camera()->loadModelViewMatrix();

  Q_EMIT drawNeeded();
}
于 2019-12-20T14:53:19.340 回答