为什么我用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?) 概念之间的区别:Exporter
和 Writer
(以及对应的 Importer
和 Reader
)
Exporter/Importer
导出器旨在将整个场景(就可见对象而言)存储在一个文件中。它考虑到每个对象、背景、当前颜色等......
导入生成的文件应提供外观相同的场景。
但是在这个过程中你可能会丢失很多信息,在导出时不可见
Writer/Reader
它们旨在只在磁盘上写入一个但完整的数据集,并且与任何类型的可视化属性无关。它通常包含一个网格和相关数据,但没有背景颜色或类似的东西。
你的问题
您正在混合使用这两种方法。 ParaView 使用 Reader
范式,但您使用 exporter
范式。这可能就是为什么你不能用多演员版本打开文件,为什么你现在没有颜色。
可能的解决方案
第一种方法是确保正确呈现所需的颜色。如果是,也许 export / reader 会起作用。
另一种可能性是使用编写器而不是导出器。没有 vtkVRMLWriter
(至少从我的快速搜索来看),但您可以使用任何支持多边形网格的格式(如 vtkXMLPolyDataWriter )
最后一个选项,在我看来更清晰,是保留单独的对象:您可以去掉 vtkPolyDataAppend
并将其替换为 vtkGroupDataSetsFilter 并编写它(例如)与 vtkXMLMultiBlockDataWriter
)
我想导出结果,用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?) 概念之间的区别:Exporter
和 Writer
(以及对应的 Importer
和 Reader
)
Exporter/Importer
导出器旨在将整个场景(就可见对象而言)存储在一个文件中。它考虑到每个对象、背景、当前颜色等...... 导入生成的文件应提供外观相同的场景。 但是在这个过程中你可能会丢失很多信息,在导出时不可见
Writer/Reader
它们旨在只在磁盘上写入一个但完整的数据集,并且与任何类型的可视化属性无关。它通常包含一个网格和相关数据,但没有背景颜色或类似的东西。
你的问题
您正在混合使用这两种方法。 ParaView 使用 Reader
范式,但您使用 exporter
范式。这可能就是为什么你不能用多演员版本打开文件,为什么你现在没有颜色。
可能的解决方案
第一种方法是确保正确呈现所需的颜色。如果是,也许 export / reader 会起作用。
另一种可能性是使用编写器而不是导出器。没有
vtkVRMLWriter
(至少从我的快速搜索来看),但您可以使用任何支持多边形网格的格式(如 vtkXMLPolyDataWriter )最后一个选项,在我看来更清晰,是保留单独的对象:您可以去掉
vtkPolyDataAppend
并将其替换为 vtkGroupDataSetsFilter 并编写它(例如)与vtkXMLMultiBlockDataWriter
)