在Visualization Toolkit中,哪些类型的对象需要调用Update()和Modified()以及何时调用?

时间:2014-06-05 16:59:18

标签: vtk

我正在查看一些可能无法正常工作的VTK代码。这是一个片段:

vtkSmartPointer<vtkCamera> cam = vtkSmartPointer<vtkCamera>::New();
cam->SetFocalPoint(0, 0, 0);
cam->SetViewUp(perp[0], perp[1], perp[2]);

cam->SetPosition(first_cam_pos);
cam->SetViewAngle(20);
cam->Modified();

在我看来,调用Modified()不一定是必要的,调用四个Set函数会自动发出相机已被修改的信号。

事实上,Kitware VTK camera example并没有对相机使用Modified()

vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 20);
camera->SetFocalPoint(0, 0, 0);

// Create a renderer, render window, and interactor
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

renderer->SetActiveCamera(camera);

在其他情况下,我正在查看的可能无效的VTK代码使用Update()手动更新 - 不是用于相机对象,而是用于其他地方。我再次认为这可能不是必要的;但显然Update()Modified()出于某种原因

是否有一些规则可以确定何时需要调用Modified()Update()以及什么时候不需要?是否有某些类型的对象需要它们和某些不适合的类型?或者它与它们上面调用的函数类型有关吗?

我使用的是VTK 6.1,但如果这里有一些历史背景,我很乐意得到一般答案。

1 个答案:

答案 0 :(得分:5)

如果要在管道为您更新对象之前使用对象,则需要

Update()。一个例子是:

vtkSmartPointer<vtkXMLPolyDataReader> reader = \
        vtkSmartPointer<vtkPolyDataReader>::New();

reader->SetFileName("myfile.vtp");

// At this point, the reader hasn't yet read the file, so the
// following line with result in polydata being null (or 
// something like that)

vtkPolyData* badPolydata = reader->GetOutput();

// However, once you tell the reader "update right now, don't wait
// for the pipeline to update you" with:

reader->Update();

// you can now get access to the data it has read:

vtkPolyData* goodPolydata = reader->GetOutput();

另一方面,如果您打算带读者,请将其附加到映射器,将映射器附加到actor,然后在渲染窗口中显示actor,然后在渲染器显示“Ok,现在我需要驱动整个链的数据“,管道将返回并在阅读器上调用Update()。这是管道执行模型的全部原因/好处。


如果要在下一次通过时通知管道,则需要使用Modified(),您需要重新处理此对象“。这是由大多数Set *函数在内部完成的,所以我猜你只需看一下实现,看看是否调用了Modified(),你调用的任何函数都会被调用,你期望在下一遍中生效通过管道。