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

Doc*_*awk 4 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();
Run Code Online (Sandbox Code Playgroud)

在我看来,呼叫Modified()是不必要的,调用四个Set功能应该自动发出相机已被修改的信号.

实际上,Kitware VTK相机示例不适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);
Run Code Online (Sandbox Code Playgroud)

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

有一些规则来确定何时Modified()Update()需要被调用,当他们不这样做?是否有某些类型的对象需要它们而某些类型的对象不需要它们?或者它与调用它们的函数类型有关?

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

Dav*_*ria 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();
Run Code Online (Sandbox Code Playgroud)

如果,另一方面,你要采取读者,将其连接到一个映射,映射器连接到一个演员,并在RenderWindow的显示演员,然后在时间的渲染说:"好了,现在我需要驱动整个链的数据",管道将返回并在阅读器上调用Update().这是管道执行模型的全部原因/好处.


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