使用VTK显示两个空间坐标一致的actor时,两个actor之间会交错显示,在旋转、移动等交互时尤为明显,形成闪烁的效果。
图中显示了一条红线和一条黄线,两条线使用的是一样的数据,空间坐标也一致。即使设置红线的线宽大于黄线,在显示上仍然是两条线交错。设置vtkMapper的CoincidentTopology可以解决这个问题。
代码示例
vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();//这是一个全局设置
vtkSmartPointer<vtkPolyData> lineData = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyDataMapper> redLineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkPolyDataMapper> yellowLineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
redLineMapper->SetRelativeCoincidentTopologyLineOffsetParameters(-4.0, -4.0);//负值会靠近相机,正值会远离相机
yellowLineMapper->SetRelativeCoincidentTopologyLineOffsetParameters(0.0, 0.0);//初始值就是0.0
//使用SetRelativeCoincidentTopologyPolygonOffsetParameters 设置面
//使用SetRelativeCoincidentTopologyPointOffsetParameter 设置点
vtkSmartPointer<vtkActor> redLineActor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkActor> yellowLineActor = vtkSmartPointer<vtkActor>::New();
redLineMapper->SetInputData(lineData);
redLineActor->SetMapper(redLineMapper);
yellowLineMapper->SetInputData(lineData);
yellowLineActor->SetMapper(yellowLineMapper);
这样设置之后,红线就能始终显示在黄线上层,完全包裹住黄线。