Qt 与 VTK 集成之间的动画冲突

问题描述 投票:0回答:1

我在 Qt 应用程序中遇到一个问题,涉及使用 VTK(可视化工具包)的动画。使用本机 VTK 渲染时,我的动画可以无缝运行。但是,当 Qt 开始通过 vtkGenericOpenGLRenderWindow 管理渲染时,动画将停止工作。在 Qt 版本中,立方体视图不会平滑旋转,而是突然到达终点。

是否应该使用特定的设置或方法来确保 VTK 动画在 Qt 环境中正确集成?

for (int frame = 0; frame < self->animatorTotalFrames_; ++frame)
{
    viewCubeWidget->InterpolateCamera(frame);
    viewCubeWidget->parentRenderer_->ResetCamera();
    viewCubeWidget->Render();
}

在检查

Render()
调用的差异时,我观察到以下情况:

原生VTK场景下,我们直接执行

vtkOpenGLRenderWindow::Render()
。但是,在 Qt 应用程序中,会调用
vtkGenericOpenGLRenderWindow::Render()
,内部会调用
vtkOpenGLRenderWindow::Render()

void vtkGenericOpenGLRenderWindow::Render()
{
  if (this->ReadyForRendering)
  {
    vtkOpenGLCheckErrorMacro("error before running VTK rendering code");
    if (!this->Initialized)
    {
      this->OpenGLInit();
    }
    this->MakeCurrent();
    if (!this->IsCurrent())
    {
      vtkLogF(TRACE, "rendering skipped since `MakeCurrent` was not successful.");
    }
    else
    {
      // Query current GL state and store them
      auto state = this->GetState();
      state->Reset();
      state->Push();

      this->Superclass::Render(); // CALLED vtkOpenGLRenderWindow::Render()

      // Restore state to previous known value
      state->Pop();
    }
    vtkOpenGLCheckErrorMacro("error after running VTK rendering code");
  }
}


void vtkOpenGLRenderWindow::Render()
{
  if (this->Initialized)
  {
    vtkOpenGLRenderUtilities::MarkDebugEvent("Starting vtkOpenGLRenderWindow::Render");
  }
  this->Superclass::Render();

  if (this->FirstRenderTime < 0)
  {
    this->FirstRenderTime = vtkTimerLog::GetUniversalTime();
  }
  this->GetShaderCache()->SetElapsedTime(vtkTimerLog::GetUniversalTime() - this->FirstRenderTime);

  if (this->NoiseTextureObject && this->GetTextureUnitForTexture(this->NoiseTextureObject) >= 0)
  {
    this->NoiseTextureObject->Deactivate();
  }
  if (this->Initialized)
  {
    vtkOpenGLRenderUtilities::MarkDebugEvent("Completed vtkOpenGLRenderWIndow::Render");
  }
}

我尝试寻找解决方案,但我找到的解决方案并不适合我的情况。

for (int frame = 0; frame < self->animatorTotalFrames_; ++frame)
{
    self->InterpolateCamera(frame);
    self->parentRenderer_->ResetCamera();
    self->Render();
    QCoreApplication::processEvents();
}
qt render vtk
1个回答
0
投票

我认为这是同样的问题在此处输入链接描述

© www.soinside.com 2019 - 2024. All rights reserved.