vtkRenderWindowInteractor事件循环和线程

LBe*_*Bes 4 c++ qt multithreading vtk

我在使用vtk进行交互和渲染的应用程序中尝试做的是有两个不同的部分:1 - 带渲染的线程和用于与鼠标交互的vtkRenderWindowInteractor.2 - 调用VTK线程中定义的数据的某些修饰函数的线程.

从我迄今为止在研究中得到的结果看起来相当复杂,VTK不是线程安全的.现在我在VTK邮件列表上偶然发现了这篇文章(http://vtk.1045678.n5.nabble.com/Multi-threaded-VTK-td4514620.html),建议使用Qt信号和插槽.第一个问题是,仍然是一个好的解决方案吗?

第二个问题仍与之相关,也与我之前遇到过的一个问题有关start(),那vtkRenderWindowInteractor就是阻塞问题.到目前为止,无论我尝试过什么,只要调用start()方法(因为我进入渲染循环),所有通过旋转或平移或缩放功能完成的修改都不会完成.我的问题是:如果我使用Qt信号和插槽将阻止我解决这个问题?

这是我到目前为止渲染和推出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();
Run Code Online (Sandbox Code Playgroud)

因此,我可以通过询问来总结:Qt是否允许我必须调用转换函数,而vtk的渲染和交互线程正在使用阻塞start()方法运行vtkRenderWindowInteractor?如果不是,我应该更改我的代码并考虑在VTK中与我的对象进行交互的不同可能性?

Bli*_*ito 5

我在调用后已经能够进行旋转start(),但在我的情况下来自同一个线程.

诀窍是使用a vtkCommand并设置一个定时器vtkRenderWindowInteractor来调用该命令.该命令基本上是一个能够修改你的actor的回调.

您可以在此主题中看到此示例.

关于您正在使用的多线程方法,也许您可​​以保持渲染线程等待vtkCommand::Execute直到修改线程完成.如果您能够使用C++ 11,则可以使用STL中提供的许多新工具.