vtkDepthSortPolyData does not work in VTK 9.0.1
I have a little bit modified example of https://vtk.org/Wiki/VTK/Tutorials/TranslucentGeometry.
vtkDepthSortPolyData works good in VTK 8.1.0 (Python 3.6.13).
But vtkDepthSortPolyData does nothing, when used in VTK 9.0.1 (Python 3.8.8).
The code to reproduce the images:
import sys
import vtk
def create_sphere_source(center, radius: float = 1, color=(1, 0, 0, 0.5), theta: int = 100, phi: int = 100):
source = vtk.vtkSphereSource()
source.SetCenter(center)
source.SetRadius(radius)
source.SetThetaResolution(theta)
source.SetPhiResolution(phi)
source.Update()
cell_colors = vtk.vtkUnsignedCharArray()
cell_colors.SetNumberOfComponents(len(color))
cell_qty = source.GetOutput().GetNumberOfCells()
cell_colors.SetNumberOfTuples(cell_qty)
for i in range(cell_qty):
cell_colors.SetTuple(i, [c * 255 for c in color])
source.GetOutput().GetCellData().SetScalars(cell_colors)
return source
def create_overlapping_bunch_of_spheres():
alpha = 0.6
green_color = (0, 1, 0, alpha)
red_color = (1, 0, 0, alpha)
red_sphere_qty = 4
colors = [green_color] + red_sphere_qty * [red_color]
green_radius = 1.0
red_radius = 0.5
radiuses = [green_radius] + red_sphere_qty * [red_radius]
centers = [[0, 0, 0], [1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0]]
append_data = vtk.vtkAppendPolyData()
for i in range(1 + red_sphere_qty):
sphere_source = create_sphere_source(centers[i], radiuses[i], colors[i])
append_data.AddInputConnection(sphere_source.GetOutputPort())
return append_data
def create_translucent_actor(use_depth_sort: bool, camera):
print('use_depth_sort:', use_depth_sort)
translucent_geometry = create_overlapping_bunch_of_spheres()
mapper = vtk.vtkPolyDataMapper()
mapper.ScalarVisibilityOn()
mapper.SetColorModeToDirectScalars()
if use_depth_sort:
depth_sort = vtk.vtkDepthSortPolyData()
depth_sort.SetInputConnection(translucent_geometry.GetOutputPort())
depth_sort.SetDirectionToBackToFront()
depth_sort.SetCamera(camera)
depth_sort.SortScalarsOff()
depth_sort.Update()
mapper.SetInputConnection(depth_sort.GetOutputPort())
else:
mapper.SetInputConnection(translucent_geometry.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.RotateX(-72) # put the objects in a position where it is easy to see different overlapping regions
return actor
def show_window_with_translucent_actor():
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)
translucent_actor = create_translucent_actor(use_depth_sort=True, camera=renderer.GetActiveCamera())
renderer.AddActor(translucent_actor)
renderer.SetBackground(1, 1, 1)
renderer.ResetCamera()
renderer.GetActiveCamera().Zoom(2.2)
render_window.SetSize(600, 400)
render_window_interactor.Initialize()
render_window.Render()
render_window_interactor.Start()
if __name__ == '__main__':
print('Python', sys.version)
print(vtk.vtkVersion.GetVTKSourceVersion())
show_window_with_translucent_actor()
Tested on Win 10 x64 (GeForce GTX 1080 Ti)