为什么我用vtkVRMLExporter导出的场景没有颜色

Why is there no color in the scene I exported with vtkVRMLExporter

我想导出结果,用ParaView打开后总是没有正确的颜色。 如果您有任何其他建议,请告诉我。

    polydata = vtkAppendPolyData()
    reader = vtkNIFTIImageReader()
    reader.SetFileName('Brats18_2013_10_1_seg.nii.gz')

    for label,color,name in zip(labels,Colors,CC):
        pointColors = vtkUnsignedCharArray()
        pointColors.SetNumberOfComponents(3)
        pointColors.SetName('Colors')

        dmc = vtkDiscreteMarchingCubes()
        dmc.SetInputConnection(reader.GetOutputPort())
        dmc.SetValue(0, label)

        smooth = smooth_functions(dmc, 1)

        output = smooth.GetOutput()

        for i in range(output.GetNumberOfPoints()):
            pointColors.InsertNextTuple3(*color)

        output.GetPointData().Update()
        output.GetPointData().SetScalars(pointColors)
        polydata.AddInputData(output)


    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(polydata.GetOutputPort())
    actor = vtkActor()

    actor.SetMapper(mapper)

    ren = vtkRenderer()
    ren.AddActor(actor)
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    iren.Initialize()
    iren.Start()

    exporter = vtkVRMLExporter()
    exporter.SetRenderWindow(renWin)
    exporter.SetActiveRenderer(ren)

    exporter.SetFileName("test.wrl")
    exporter.Write()

我本来是用多个actor来显示不同的部分,但是导出的结果不能用ParaView打开,所以我用了vtkAppendPolyData

请注意两个 (VTK?) 概念之间的区别:ExporterWriter(以及对应的 ImporterReader

Exporter/Importer

导出器旨在将整个场景(就可见对象而言)存储在一个文件中。它考虑到每个对象、背景、当前颜色等...... 导入生成的文件应提供外观相同的场景。 但是在这个过程中你可能会丢失很多信息,在导出时不可见

Writer/Reader

它们旨在只在磁盘上写入一个但完整的数据集,并且与任何类型的可视化属性无关。它通常包含一个网格和相关数据,但没有背景颜色或类似的东西。

你的问题

您正在混合使用这两种方法。 ParaView 使用 Reader 范式,但您使用 exporter 范式。这可能就是为什么你不能用多演员版本打开文件,为什么你现在没有颜色。

可能的解决方案

  1. 第一种方法是确保正确呈现所需的颜色。如果是,也许 export / reader 会起作用。

  2. 另一种可能性是使用编写器而不是导出器。没有 vtkVRMLWriter(至少从我的快速搜索来看),但您可以使用任何支持多边形网格的格式(如 vtkXMLPolyDataWriter

  3. 最后一个选项,在我看来更清晰,是保留单独的对象:您可以去掉 vtkPolyDataAppend 并将其替换为 vtkGroupDataSetsFilter 并编写它(例如)与 vtkXMLMultiBlockDataWriter)