Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • VTK VTK
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 733
    • Issues 733
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 203
    • Merge requests 203
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • VTK
  • VTKVTK
  • Issues
  • #18173

Closed
Open
Created Apr 14, 2021 by IvanKosik@IvanKosik

vtkDepthSortPolyData does not work in VTK 9.0.1

image

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)

Assignee
Assign to
Time tracking