许多 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;
}
这样一切都很好。
关于 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;
}
这样一切都很好。