许多 vtkrenderer 中的 vtkactor 错误

Error with vtkactor in many vtkrenderer

关于 vtkActor 有没有人在更多 "vtkRenderer"

中添加同一个演员时遇到问题

我在三个vtkRenderWindow 中有三个vtkRenderer。 我在三个vtkRenderer里面添加了一个actor,但是actor只处理第一个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();
    }
}

我发现了问题。

VTK中的actor不能添加到多个vtkrenderwindow中。但是它们可以添加在几个 vtkrenderer 中。但是这些渲染器必须在同一个 vtkrenderwindow 中。

在这个post在vtk组有更多的信息。

按照我上面说的方式,我们有这样的东西:

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;
}

这样一切都很好。