vtkRenderWindowInteractor 事件循环和线程
vtkRenderWindowInteractor event loop and threading
我在使用 vtk 进行交互和渲染的应用程序中尝试做的是有两个不同的部分:
1 - 一个带有 Rendering 和 vtkRenderWindowInteractor 的线程,用于与鼠标交互。
2 - 调用 VTK 线程中定义的数据的一些修饰函数的线程。
从我目前的研究来看,它似乎相当复杂,而且 VTK 不是线程安全的。现在我在建议使用 Qt 信号和插槽的 VTK 邮件列表上偶然发现了这个 post (http://vtk.1045678.n5.nabble.com/Multi-threaded-VTK-td4514620.html)。第一个问题是这仍然是好的解决方案吗?
第二个问题仍然与此有关,并且与我之前遇到的一个问题有关,即 vtkRenderWindowInteractor
的 start()
正在阻塞。到目前为止,无论我尝试过什么,只要调用 start() 方法(因为我进入了渲染循环),所有通过旋转、平移或缩放函数完成的修改都不会完成。
那么我的问题是:如果我使用 Qt Signals and Slots 会阻止我遇到那个问题吗?
这是我目前用于渲染和启动 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();
所以我可以通过提问来总结:当 vtk 的渲染和交互线程是 运行 阻塞 start()
方法时,Qt 是否允许我必须调用转换函数 vtkRenderWindowInteractor
?如果不是,我应该更改我的代码并考虑与 VTK 中的对象交互的不同可能性吗?
调用 start()
后我已经能够进行轮换,但在我的情况下来自同一个线程。
诀窍是使用 vtkCommand
并在 vtkRenderWindowInteractor
中设置一个计时器来调用该命令。该命令基本上是一个能够修改您的演员的回调。
您可以在 中看到一个工作示例。
关于您使用的多线程方法,也许您可以让渲染线程在 vtkCommand::Execute
中等待,直到修改线程完成。如果您能够使用 C++11,则可以使用 STL 中提供的许多新工具。
我在使用 vtk 进行交互和渲染的应用程序中尝试做的是有两个不同的部分: 1 - 一个带有 Rendering 和 vtkRenderWindowInteractor 的线程,用于与鼠标交互。 2 - 调用 VTK 线程中定义的数据的一些修饰函数的线程。
从我目前的研究来看,它似乎相当复杂,而且 VTK 不是线程安全的。现在我在建议使用 Qt 信号和插槽的 VTK 邮件列表上偶然发现了这个 post (http://vtk.1045678.n5.nabble.com/Multi-threaded-VTK-td4514620.html)。第一个问题是这仍然是好的解决方案吗?
第二个问题仍然与此有关,并且与我之前遇到的一个问题有关,即 vtkRenderWindowInteractor
的 start()
正在阻塞。到目前为止,无论我尝试过什么,只要调用 start() 方法(因为我进入了渲染循环),所有通过旋转、平移或缩放函数完成的修改都不会完成。
那么我的问题是:如果我使用 Qt Signals and Slots 会阻止我遇到那个问题吗?
这是我目前用于渲染和启动 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();
所以我可以通过提问来总结:当 vtk 的渲染和交互线程是 运行 阻塞 start()
方法时,Qt 是否允许我必须调用转换函数 vtkRenderWindowInteractor
?如果不是,我应该更改我的代码并考虑与 VTK 中的对象交互的不同可能性吗?
调用 start()
后我已经能够进行轮换,但在我的情况下来自同一个线程。
诀窍是使用 vtkCommand
并在 vtkRenderWindowInteractor
中设置一个计时器来调用该命令。该命令基本上是一个能够修改您的演员的回调。
您可以在
关于您使用的多线程方法,也许您可以让渲染线程在 vtkCommand::Execute
中等待,直到修改线程完成。如果您能够使用 C++11,则可以使用 STL 中提供的许多新工具。