vtk多个窗口进行交互,每个窗口需要有单独的vtkRenderWindowInteractor。
在render的时候,执行vtkRenderWindowInteractor::Start之后,主线程会被阻塞。
所以以下方式进行渲染是错误的。
void Render(int i)
{
....
interactor->Start();
}
for(int i=0;i<N;i++)
{
Render(i);
}
上述程序只有第Render(0)会被渲染,而后续的窗口会在前序窗口关闭之后渲染。
解决上述问题,可以使用下面的方法:
#include <vtkConeSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
class renderCone
{
public:
renderCone()
{
renderer =
vtkSmartPointer<vtkRenderer>::New();
}
void SetChild(renderCone* child)
{
next = child;
}
void SetColor(double r,double g,double b)
{
renderer->SetBackground(r, g, b); // Background color dark red
}
void Render()
{
//Create a cone
coneSource =
vtkSmartPointer<vtkConeSource>::New();
coneSource->Update();
//Create a mapper and actor
mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(coneSource->GetOutputPort());
actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
//Add the actors to the scene
renderer->AddActor(actor);
//Render and interact
renderWindow->Render();
if (next == nullptr)
{
renderWindowInteractor->Start();
}
}
private:
vtkSmartPointer<vtkConeSource> coneSource;
vtkSmartPointer<vtkPolyDataMapper> mapper;
vtkSmartPointer<vtkActor> actor;
vtkSmartPointer<vtkRenderer> renderer;
vtkSmartPointer<vtkRenderWindow> renderWindow;
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor;
renderCone* next{nullptr};
};
int main(int, char *[])
{
renderCone cone;
cone.SetColor(.5,0,0);
renderCone child;
child.SetColor(0, 0.5, 0);
cone.SetChild(&child);
cone.Render();
child.Render();
return EXIT_SUCCESS;
}