Administrator
Administrator
发布于 2025-11-14 / 1 阅读

解决设置多层renderer与拾取功能的冲突

vtk 有些时候需要添加不同的vtkRenderer,并且给不同的vtkRenderer设置不同的层,比如给视口添加二维网格功能,一般会在第0层renderer添加三维物体,在更高的层(1-N)添加透明层的renderer,但是拾取操作时,我们往往希望拾取第0层的物体,但是第1-N透明层的存在, 会影响到vtkPropPicker vtkCellPicker等拾取功能。当然我们不能反过来第0层放置透明物体,第1层放置普通三维物体,因为这样三维物体会挡住第0层的物体,甚至如果第1层设置了背景颜色,会完全挡住第0层的显示。

解决办法如下:

self.grid_renderer = vtk.vtkRenderer()
self.grid_renderer.SetLayer(1) 
self.grid_renderer.SetPreserveDepthBuffer(1)  # 重要:不清除深度缓冲区。解决第1-N层透明层影响第0层的物体的拾取。

另外如果第1层是不需要任何鼠标交互的,可以设置网格渲染器为非交互式(否则grid_renderer也会受到鼠标交互)

self.grid_renderer.InteractiveOff()

注意,SetLayer是设置成非0,那么会自动设置成透明背景(具体可以查看SetLayer函数),如果想设置成非0层,又希望非透明背景,可以在SetLayer之后,设置:

renderer.SetPreserveColorBuffer(False)