代码之家  ›  专栏  ›  技术社区  ›  Михаил Рябинин

在VTK中渲染透明对象的问题

  •  0
  • Михаил Рябинин  · 技术社区  · 7 年前

    使用python VTK库渲染透明对象时,会出现奇怪的图像显示效果。当我们旋转物体时,物体的透明度会发生变化。它们从前景中消失。有时会发生,有时不会。这大大阻碍了视口中的导航。也许这与法线有关。有可能解决这个问题吗? 代码:

    import vtk
    import numpy as np
    
    data_matrix = np.zeros([75, 75, 75], dtype=np.uint8)
    data_matrix[1:35, 1:35, 1:35] = 1
    data_matrix[25:55, 25:55, 25:55] = 2
    data_matrix[45:74, 45:74, 45:74] = 3
    
    w, d, h = data_matrix.shape
    dicom_images = vtk.vtkImageImport()
    dicom_images.CopyImportVoidPointer(data_matrix.tostring(),
                                       len(data_matrix.tostring()))
    dicom_images.SetDataScalarTypeToUnsignedChar()
    dicom_images.SetNumberOfScalarComponents(1)
    dicom_images.SetDataExtent(0, h - 1, 0, d - 1, 0, w - 1)
    dicom_images.SetWholeExtent(0, h - 1, 0, d - 1, 0, w - 1)
    dicom_images.SetDataSpacing(1, 1, 1)
    
    render = vtk.vtkRenderer()
    render_window = vtk.vtkRenderWindow()
    render_window.AddRenderer(render)
    render_interact = vtk.vtkRenderWindowInteractor()
    render_interact.SetRenderWindow(render_window)
    
    threshold_dicom_image = vtk.vtkImageThreshold()
    threshold_dicom_image.SetInputConnection(dicom_images.GetOutputPort())
    threshold_dicom_image.Update()
    
    discrete_marching_cubes = vtk.vtkDiscreteMarchingCubes()
    discrete_marching_cubes.SetInputConnection(threshold_dicom_image.GetOutputPort())
    discrete_marching_cubes.GenerateValues(3, 1, 3)
    discrete_marching_cubes.ComputeNormalsOn()
    discrete_marching_cubes.Update()
    
    colorLookupTable = vtk.vtkLookupTable()
    colorLookupTable.SetNumberOfTableValues(3)
    colorLookupTable.Build()
    colorLookupTable.SetTableValue(0, 1, 0, 0, 0.5)
    colorLookupTable.SetTableValue(1, 0, 1, 0, 1)
    colorLookupTable.SetTableValue(2, 0, 0, 1, 0.5)
    
    dicom_data_mapper = vtk.vtkPolyDataMapper()
    dicom_data_mapper.SetInputConnection(discrete_marching_cubes.GetOutputPort())
    dicom_data_mapper.ScalarVisibilityOn()
    dicom_data_mapper.SetLookupTable(colorLookupTable)
    dicom_data_mapper.SetScalarRange(1, 3)
    dicom_data_mapper.Update()
    
    actor_dicom_3d = vtk.vtkActor()
    actor_dicom_3d.SetMapper(dicom_data_mapper)
    
    render.AddActor(actor_dicom_3d)
    render.ResetCamera()
    
    render_window.Render()
    render_interact.Start()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   tomj    7 年前

    您需要指定一些 algorithm to handle transparency rendering . VTK本机已实现深度剥离,并且 dual depth peeling 认为 VTK 8.0引入了一些新功能,但我尚未对此进行检查)。

    因此,“启用”透明度的最简单方法是在渲染器上启用深度剥离:

    render.SetUseDepthPeeling(1)
    render.SetOcclusionRatio(0.1)
    render.SetMaximumNumberOfPeels(100)
    render_window.SetMultiSamples(0)
    render_window.SetAlphaBitPlanes(1)
    

    看见 https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderTranslucentGeometry 有关参数的更多详细信息。注意,它需要至少3.2版本的openGL支持。如果您使用的是VTK 7.0或更高版本,如果图形驱动程序支持,“双深度剥离”将自动使用,否则将使用标准深度剥离。