如何选择vtkVolumeMapp使用的标量

2024-07-03 07:51:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含多个数据数组的卷,并使用vtkVolumeMapper(vtkFixedPointVolumeRayCastMapper)渲染它。你知道吗

如何告诉映射器使用特定数组作为标量? (SelectColorArray不是vtkVolumeMapper的函数)

我用的是vtk6

    # Create the reader for the data
    reader = vtk.vtkXMLImageDataReader()
    reader.SetFileName(self.scan_analysis.content.vtk_path)
    reader.GetOutput().GetPointData().SetActiveScalars('smooth')

    # Create transfer mapping scalar value to opacity
    opacityTransferFunction = vtk.vtkPiecewiseFunction()
    opacityTransferFunction.AddPoint(5, 0.0)
    opacityTransferFunction.AddPoint(80, 0.4)
    opacityTransferFunction.AddPoint(81, 0.0)
    opacityTransferFunction.AddPoint(100, 0.0)

    # Create transfer mapping scalar value to color
    lut = vtk.vtkColorTransferFunction()
    lut.AddRGBPoint(0.0, 0.0, 0.0, 1.0)
    lut.AddRGBPoint(50.0, 1.0, 1.0, 1.0)
    lut.AddRGBPoint(100.0, 1.0, 0.0, 0.0)

    # The property describes how the data will look
    volumeProperty = vtk.vtkVolumeProperty()
    volumeProperty.SetColor(lut)
    volumeProperty.SetScalarOpacity(opacityTransferFunction)
    volumeProperty.ShadeOn()
    volumeProperty.SetInterpolationTypeToLinear()

    # The mapper / ray cast function know how to render the data
    #volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
    #volumeMapper = vtk.vtkSmartVolumeMapper()
    volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
    volumeMapper.SetBlendModeToComposite()
    volumeMapper.SetInputConnection(reader.GetOutputPort())
    volumeMapper.SelectColorArray('smooth') ## -> exception

    # The volume holds the mapper and the property and
    # can be used to position/orient the volume
    volume = vtk.vtkVolume()
    volume.SetMapper(volumeMapper)
    volume.SetProperty(volumeProperty)

另外,是否可以将单元标量用于体积映射器?你知道吗

谢谢

更新: 我结束了对每个标量使用不同的vtk文件。 它工作正常,不会占用更多的磁盘空间。。。 但我知道这不是正确的解决方案(令人沮丧)


Tags: thetodatacreatereader标量vtkvolume
1条回答
网友
1楼 · 发布于 2024-07-03 07:51:37

我使用setCalarsName找到了以下解决方案:

from vtk import (vtkUnstructuredGridReader, vtkDataSetMapper, vtkActor,
                 vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor)

# Read the source file.
reader = vtkUnstructuredGridReader()
reader.SetFileName("FileName")

reader.SetScalarsName("ScalarNameYouWant")  ### this command should do it

#reader.ReadAllScalarsOn()
reader.Update()  # Needed because of GetScalarRange
output = reader.GetOutput()
output_port = reader.GetOutputPort()
scalar_range = output.GetScalarRange()
# Create the mapper that corresponds the objects of the vtk file
# into graphics elements
mapper = vtkDataSetMapper()
mapper.SetInputConnection(output_port)
mapper.SetScalarRange(scalar_range)
# Create the Actor
actor = vtkActor()
actor.SetMapper(mapper)

# Create the Renderer
renderer = vtkRenderer()
renderer.AddActor(actor)
renderer.SetBackground(1, 1, 1) # Set background to white

# Create the RendererWindow
renderer_window = vtkRenderWindow()
renderer_window.AddRenderer(renderer)

# Create the RendererWindowInteractor and display the vtk_file
interactor = vtkRenderWindowInteractor()
interactor.SetRenderWindow(renderer_window)
interactor.Initialize()
interactor.Start()

解决方案:
https://vtk.org/gitweb?p=VTK.git;a=blob;f=Examples/DataManipulation/Python/pointToCellData.py

相关问题 更多 >