我正在使用VTK创建一个线程软件,我需要实时更改模型本身,而我需要更改他的渲染方法。一切都运行正常,但问题从interactor->start();
开始,模型数据更新得很好,但是当我移动相机时它只显示在屏幕上。我还选择了一些从imagedata文件生成3D数据的方法,因为我需要关闭vtk窗口(交互器窗口),然后代码将重新打开它并将生成的新数据发送给它...
我需要这样的东西:
int force close_window = false; int refresh_interactor = false;
我设法让窗口关闭,但只能使用vtkcommand::Keypressed
命令,但idk如何处理新命令:S,我尝试了vtkcommand::UserEvent
但我没有找到关于如何处理这些数据的好信息(比如某种方式来调用它)
我处理VTK的方式是两个线程,第一个是关于vtk iren循环,第二个是管理模型并检查iren是否需要更新。
在我的梦想代码中应该是这样的:
=============================================== ========
bool VTKWindow()
{
...
vtkSmartPointer ator = vtkSmartPointer::New();
iren = vtkSmartPointer::New();
RenWindow = vtkSmartPointer::New();
render->SetBackground(.1, .2, .3);
RenWindow->AddRenderer(renderer);
iren->SetRenderWindow(RenWindow);
if(data_type == voxel_type)
{
Render->AddViewProp(VoxelData);
}
else
{
actor->SetMapper(PolyData);
Render->AddActor(Actor);
}
RenWindow->Render();
iren->Start();
}
void ManageVTK()
{
while true loop...
if(force close_window == true)
do some command to exit the iren loop
if(refresh_interactor == true)
do some command to refresh iren
}
对不起英文,它不是我的母语,也对问题格式感到抱歉,这是我第一次使用stackoverflow
答案 0 :(得分:1)
这可能听起来很愚蠢,但是,我找到了解决这个问题的方法。 我在相关链接上看到了这个人vtkRenderWindowInteractor event loop and threading,这几乎是同样的问题......
class VTKNewEvent : public vtkCommand{
public:
vtkTypeMacro(VTKNewEvent , vtkCommand);
static VTKNewEvent * New(){
return new VTKNewEvent ;
}
void Execute(vtkObject * caller, unsigned long vtkNotUsed(eventId), void * vtkNotUsed(callData)){
vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller);
if (iren_close == true){
iren->GetRenderWindow()->Finalize // Stop the interactor
iren->TerminateApp();
iren_close = false;
}
if (iren_update== true){
renderJanela->Render();
iren_update= false;
}
}
};
bool VTKWindow(){
vtkSmartPointer<VTKNewEvent > IrenRefresh= vtkSmartPointer<VTKNewEvent>::New();
...
iren->CreateRepeatingTimer(1);//this makes that IrenRefresh will be called at every 1ms
iren->AddObserver(vtkCommand::TimerEvent, IrenRefresh);
iren->Start();
...
}
这很简单,但是,也许不是最好的,但是它做了工作,我希望这个链接可以帮助那些开始进入VTK世界的人,因为线程+渲染循环不是一个简单的工作来理解发生了什么上