VTK中Update()函数的作用是什么?仅使用vtkNew创建对象可以运行吗?
关于VTK中vtkSphereSource的Update()方法作用
VTK的可视化管线采用*延迟执行(懒计算)*的设计模式,Update()的核心作用是主动触发当前节点及上游管线的计算逻辑,生成可访问的输出数据,具体差异如下:
- 仅执行
vtkNew<vtkSphereSource> sphereSource;时,VTK只会完成该数据源对象的初始化,给相关参数设置默认值(比如球体半径默认0.5、中心在坐标原点、经纬度细分段数默认各8),但不会执行任何生成球体网格的计算操作,此时调用sphereSource->GetOutput()拿到的是空数据集。 - 调用
sphereSource->Update()后,才会触发vtkSphereSource的实际计算逻辑:按照配置参数生成球体的顶点坐标、面片拓扑、法向量等完整数据,并存到输出的vtkPolyData对象中,此时才能正常读取数据源的输出结果。
你觉得不写Update()也能正常运行,是因为存在隐式触发场景:如果你后续直接把sphereSource的输出端口连接到vtkMapper等下游管线节点,窗口渲染时VTK的渲染器会自动触发整条管线的更新,相当于隐式调用了Update(),这种场景下确实不需要手动写。
但如果你需要在渲染之前直接访问球体的生成结果,比如读取顶点数量、修改顶点坐标、统计网格面数,就必须手动调用Update(),否则拿到的都是无效的空数据。
相关代码示例:
错误写法(输出结果为0)
vtkNew<vtkSphereSource> sphereSource; // 未调用Update,输出数据为空 std::cout << sphereSource->GetOutput()->GetNumberOfPoints() << std::endl;
正确写法(输出默认参数下的顶点数50)
vtkNew<vtkSphereSource> sphereSource; sphereSource->Update(); std::cout << sphereSource->GetOutput()->GetNumberOfPoints() << std::endl;
内容的提问来源于stack exchange,提问作者Free Code
相关产品推荐
相关产品推荐

