Ошибка с vtkactor во многих vtkrenderer

о vtkActor у кого-нибудь были проблемы с добавлением того же актера в более » vtkRenderer»

У меня есть три vtkRenderer в трех vtkRenderWindow.
Я добавляю одного актера внутри трех vtkRenderer, но процесс актера только первый vtkRenderer.

образец:

void EstudoMaxilaMandibula::AddPointer(double* p)
{

    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();

    sphereSource->SetCenter(0.0, 0.0, 0.0);
    sphereSource->SetRadius(2.0);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    listActor.push_back(actor);

    actor->SetMapper(mapper);
    actor->SetPosition(p);

    for (int i = 0; i < 3; i++) {
        corte->imageViwer[i]->GetRenderer()->AddActor(actor);
        corte->imageViwer[i]->Render();
    }
}

1 ответ

  1. Я нашел проблему.

    Актеры в VTK не могут быть добавлены в более чем одном vtkrenderwindow. Но они могут быть добавлены в нескольких vtkrenderer. Но эти рендеры должны быть в одном и том же vtkrenderwindow.

    На этой должности в группе ВТК есть более подробная информация.

    Делая путь я сказал выше, у нас есть что-то вроде этого:

    int main(int, char* [])
    {
    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    
    vtkSmartPointer<vtkInteractorStyleTrackballActor> style =
        vtkSmartPointer<vtkInteractorStyleTrackballActor>::New();
    
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    
    renderWindowInteractor->SetInteractorStyle(style);
    renderWindowInteractor->SetRenderWindow(renderWindow);
    
    // Define viewport ranges
    double xmins[4] = { 0, .5, 0, .5 };
    double xmaxs[4] = { 0.5, 1, 0.5, 1 };
    double ymins[4] = { 0, 0, .5, .5 };
    double ymaxs[4] = { 0.5, 0.5, 1, 1 };
    
    // Create a sphere
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetCenter(0.0, 0.0, 0.0);
    sphereSource->SetRadius(5);
    sphereSource->Update();
    
    // Create a mapper and actor
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    
    for (unsigned i = 0; i < 4; i++)
    {
        vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    
        renderWindow->AddRenderer(renderer);
        renderer->SetViewport(xmins[i], ymins[i], xmaxs[i], ymaxs[i]);
    
        renderer->AddActor(actor);
        renderer->ResetCamera();
    
        renderWindow->Render();
        renderWindow->SetWindowName("Multiple ViewPorts");
    }
    
    renderWindowInteractor->Start();
    
    return EXIT_SUCCESS;
    }
    

    так все будет хорошо.