vtk 使用PolygonOffset实现actor的层级显示

使用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);

这样设置之后,红线就能始终显示在黄线上层,完全包裹住黄线。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个简单的Python脚本,使用VTK库来显示一个VTK_QUAD: ```python import vtk # 创建一个四边形 quad = vtk.vtkQuad() quad.GetPointIds().SetId(0, 0) quad.GetPointIds().SetId(1, 1) quad.GetPointIds().SetId(2, 2) quad.GetPointIds().SetId(3, 3) # 创建一个点集,并将四个点添加到点集中 points = vtk.vtkPoints() points.InsertNextPoint(0, 0, 0) points.InsertNextPoint(1, 0, 0) points.InsertNextPoint(1, 1, 0) points.InsertNextPoint(0, 1, 0) # 创建一个拓扑结构,并将四边形添加到拓扑结构中 cellArray = vtk.vtkCellArray() cellArray.InsertNextCell(quad) # 创建一个PolyData对象,并将点集和拓扑结构添加到其中 polyData = vtk.vtkPolyData() polyData.SetPoints(points) polyData.SetPolys(cellArray) # 创建一个Mapper,并将PolyData对象设置为其输入数据 mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polyData) # 创建一个Actor,并将Mapper设置为其Mapper actor = vtk.vtkActor() actor.SetMapper(mapper) # 创建一个Renderer,并将Actor添加到其中 renderer = vtk.vtkRenderer() renderer.AddActor(actor) # 创建一个RenderWindow,并将Renderer设置为其Renderer renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) # 创建一个RenderWindowInteractor,并将RenderWindow设置为其RenderWindow interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # 显示窗口 renderWindow.Render() interactor.Start() ``` 上述脚本将创建一个单位正方形,并在窗口中显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值