Loop e encadeamento de eventos vtkRenderWindowInteractor
O que estou tentando fazer em um aplicativo usando vtk para interagir e renderizar é ter duas partes diferentes: 1 - Um thread com Rendering e vtkRenderWindowInteractor para interação com o mouse. 2 - Um thread que chama algumas funções modificadoras dos dados definidos no Thread do VTK.
Pelo que obtive até agora em minha pesquisa, parece bastante complicado e o VTK não é seguro para threads. Agora eu me deparei com este post (http://vtk.1045678.n5.nabble.com/Multi-threaded-VTK-td4514620.html) na lista de correspondência do VTK que sugere o uso de sinais e slots de Qt. Uma primeira pergunta seria: essa ainda é a boa solução?
Uma segunda pergunta que ainda está ligada a isso e a um problema que eu já encontrei antes é que ostart()
dovtkRenderWindowInteractor
está bloqueando. E até agora, não importa o que eu tentei, todas as modificações feitas pelas funções de rotação, translação ou dimensionamento não serão feitas desde que o método start () seja chamado (porque eu insiro um loop de renderização). Minha pergunta seria: Se eu usar Qt Signals and Slots, isso me impedirá de resolver esse problema?
Aqui está o código básico que eu tenho até agora para renderizar e lançar o vtkRenderWindowInteractor:
std::string filename = BUNNY;
// Read all the data from the file
vtkSmartPointer<vtkXMLPolyDataReader> reader =vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName(filename.c_str());
reader->Update();
inputPolyData = reader->GetOutput();
cout << "File Found and Loaded : " << filename << endl ;
vtkSmartPointer<vtkTransform> translation = vtkSmartPointer<vtkTransform>::New();
translation->Translate(0.3, -0.05, 0);
transformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
//transformFilter->SetInputConnection(reader->GetOutputPort());
transformFilter->SetInputData(inputPolyData);
transformFilter->SetTransform(translation);
//transformFilter->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformFilter->GetOutputPort());
mainActor = vtkSmartPointer<vtkActor>::New();
mainActor->SetMapper(mapper);
ren->AddActor(mainActor);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(win);
vtkInteractorStyleMultiTouchCamera *style =
vtkInteractorStyleMultiTouchCamera::New();
iren->SetInteractorStyle(style);
//Start the event loop
iren->Initialize();
iren->Start();
//defineClipping();
win->PolygonSmoothingOn();
win->Render();
win->Start();
ctxView->Render();
Para que eu pudesse resumir, perguntando: o Qt me permitirá chamar funções de transformação enquanto o segmento de renderização e interação do vtk estiver em execução com o bloqueiostart()
método devtkRenderWindowInteractor
? Caso contrário, devo alterar meu código e pensar em diferentes possibilidades de interação com meus objetos no VTK?