当呈现透明对象时,出现图像显示的奇怪效果。在旋转对象时的某些点,对象的透明度会发生某些事情。他们从前景消失了。有时会发生这种情况。这极大地阻碍了视口的导航。也许这与正常人有关。可以解决这个问题吗?代码:
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()
您需要指定一些算法来处理透明度渲染。自VTK 7.0以来,VTK本地具有深度剥离和双重深度剥离(并且i think think 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/wiki/vtk/examples/cxx/visualization/correctlyrendertranslucentgeementry有关参数的更多详细信息。请注意,它需要支持OpenGL版本至少3.2。如果您使用的是VTK 7.0或更高版本,则如果您的图形驱动程序支持它,则将自动使用"双重深度剥离",否则将使用标准深度剥离。