【问题标题】:Problems with rendering transparent objects in VTK在 VTK 中渲染透明对象的问题
【发布时间】:2018-05-11 16:54:06
【问题描述】:

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

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()

【问题讨论】:

    标签: python render vtk lookup-tables marching-cubes


    【解决方案1】:

    您需要指定一些algorithm to handle transparency rendering。自 VTK 7.0 以来,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 或更高版本,如果您的图形驱动程序支持,将自动使用“双深度剥离”,否则将使用标准深度剥离。

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2013-07-05
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多