我正在查看一些可能无法正常工作的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,但如果这里有一些历史背景,我很乐意得到一般答案。
答案 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(),你调用的任何函数都会被调用,你期望在下一遍中生效通过管道。