c++ - 具有 >50 个(移动) Actor 的 Vtk Qt 场景

标签 c++ qt vtk qvtkwidget

我正在尝试实现(相当)简单的场景,其中我有大约 50 个正向特定方向移动的立方体。立方体的位置每秒变化 20 次。

我的第一次拍摄是在场景中添加和删除 Actor 。这种方法无法扩展。整个场景滞后,用户无法移动相机。

void draw(vtkRenderer *renderer)
{    
    renderer->RemoveAllViewProps(); 
    for(const Cube& cube : cubes_)
    {
        vtkSmartPointer<vtkCubeSource> cube_source = vtkSmartPointer<vtkCubeSource>::New();  
        cube_source->Update();
        cube_source->SetXLength(cube.lengt());
        cube_source->SetYLength(cube.width());
        cube_source->SetZLength(cube.height());

        vtkSmartPointer<vtkPolyDataMapper> poly_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        poly_mapper->SetInputConnection(cube_source->GetOutputPort());

        vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
        actor->SetMapper(poly_mapper);
        actor->SetPosition(cube.x(), cube.y(), cube.z());

        renderer->AddActor(actor);
    }
}

第二枪好一点。我创建了“ Actor 池”,在那里我重复使用 Actor 并隐藏不需要的 Actor 。 尽管如此,移动相机还是有延迟,我的 UI 的其余部分(我在 Vtk 小部件中有一些额外的小部件)似乎也有延迟。

我找不到场景是“动态”的 Vtk 的任何相关来源。所有示例都预加载所有场景元素并进一步使用它们。谁能告诉我我在这里做错了什么?

最佳答案

这是我的可视化 VTK 示例

.....
    vtkSmartPointer<vtkRenderer> m_vtkRenderer;
    vtkSmartPointer<MouseInteractor> m_mouseInteractor;
    QVector<vtkActor* > m_parcellationActors;
    QVector<vtkActor* > m_electrodesActors;
    QVector<vtkFollower* > m_textActors;
    QVector<vtkActor*> m_vectorFieldsActors;
    QVector<vtkActor*> m_streamlinesActors;
......
  void VisualizationWidget::create3DViewArea()
    {

    m_3DViewArea = new QStackedWidget(this);
    m_vtkWidget = new QVTKWidget(m_3DViewArea);
    m_vtkRenderer = vtkSmartPointer<vtkRenderer>::New();
    m_vtkRenderer->SetBackground(0.4, 0.4, 0.4);
    this->m_vtkWidget->GetRenderWindow()->AddRenderer(m_vtkRenderer);
    m_mouseInteractor = vtkSmartPointer<MouseInteractor>::New();
    m_mouseInteractor ->SetDefaultRenderer(m_vtkRenderer);
    this->m_vtkWidget->GetRenderWindow()->GetInteractor()->SetInteractorStyle( m_mouseInteractor);
    connect(m_mouseInteractor, &MouseInteractor::onActorSelected, this, &VisualizationWidget::onActorSelectedSlot);
    m_vtkLoadingWidget = new LoadingWidget(m_3DViewArea);
    m_vtkLoadingWidget->setIconPath(Icon::s_getTDCSLoadingGif);
    m_3DViewArea->addWidget(m_vtkLoadingWidget);
    m_3DViewArea->addWidget(m_vtkWidget);
}


void VisualizationWidget::setParcellationActors(QVector<vtkActor*> actors)
{
    m_parcellationActors = actors;
    for (int i = 0; i < m_parcellationActors.size(); ++i) {
        m_vtkRenderer->AddActor(m_parcellationActors.at(i));
    }

    m_vtkWidget->update();
}
void VisualizationWidget::setElectrodesActors(QVector<vtkActor*> actors)
{
    m_electrodesActors = actors;

    for (int i = 0; i < m_electrodesActors.size(); ++i) {
        m_vtkRenderer->AddActor(m_electrodesActors.at(i));
    }
    m_vtkWidget->update();
}

void VisualizationWidget::setElectrodesLabelsActors(QVector<vtkFollower*> actors)
{
    m_textActors = actors;

    for (int i = 0; i < m_textActors.size(); ++i) {
        m_textActors.at(i)->SetCamera(m_vtkRenderer->GetActiveCamera());
        m_vtkRenderer->AddActor(m_textActors.at(i));
    }
    m_vtkRenderer->ResetCamera();
    m_vtkWidget->update();
}

void VisualizationWidget::setVectorFieldsActors(QVector<vtkActor*> actors)
{
    for (int i = 0; i < m_vectorFieldsActors.size(); ++i) {
        m_vtkRenderer->RemoveActor(m_vectorFieldsActors.at(i));
    }
    m_vectorFieldsActors = actors;

    for (int i = 0; i <  m_vectorFieldsActors.size(); ++i) {
        changeActorOpacity(m_vectorFieldsActors[i], double(m_postProcResOpacSliders.at(i)->value()) / m_postProcResOpacSliders.at(i)->maximum());
        m_vtkRenderer->AddActor(m_vectorFieldsActors.at(i));
    }

    m_vtkRenderer->ResetCamera();
    m_vtkWidget->update();
}

void VisualizationWidget::setStreamlinesActors(QVector<vtkActor*> actors)
{
    for (int i = 0; i < m_streamlinesActors.size(); ++i) {
        m_vtkRenderer->RemoveActor(m_streamlinesActors.at(i));
    }
    m_streamlinesActors = actors;

    for (int i = 0; i < m_streamlinesActors.size(); ++i) {
        changeActorOpacity(m_streamlinesActors[i], double(m_streamLinesSlider->value()) / m_streamLinesSlider->maximum());
        m_vtkRenderer->AddActor(m_streamlinesActors.at(i));
    }

    m_vtkRenderer->ResetCamera();
    m_vtkWidget->update();
}

void VisualizationWidget::changeActorOpacity(vtkActor* actor, double opac)
{ 
    actor->SetVisibility(opac > 0.05);
    actor->GetMapper()->Modified();
    actor->GetProperty()->SetOpacity(opac);
}

关于c++ - 具有 >50 个(移动) Actor 的 Vtk Qt 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45297617/

相关文章:

c++ - 通过存储用户选择的索引值实现 QDialogBu​​ttonBox

c++ - 模板元编程评估

c++ - 从基类实例获取指向(纯)虚函数的指针

c++ - 在遗留非 qmake 构建中处理 Q_OBJECT?

c++ - 为什么 Qt 会从 .qrc 生成一个 .cpp 文件?

c++ - VTK:定位和缩放多架飞机

c++ - Visual-Studio:高效处理循环库依赖

c++ - 类的友元声明中定义的函数名称是否具有链接?

c# - 如何在vtk中为非结构化网格(.vtu)着色?

python - 使用 python3.8 和 Ubuntu 20.04 设置 VTK