Визуализация поверхности (или сглаженного объема) из массива с помощью VTK

Я открываю VTK и хочу использовать его для построения трехмерного массива. До сих пор мне удалось преобразовать массив NumPy в vtk.Volume и показывать это, но оттуда мне трудно получить что-то красивое.
Я получаю очень блочный рендеринг, как это:
должен был играть больше Minecraft

и я хотел бы плавного рендеринга, так что я думаю, что или этот объем, но сглаженный, или поверхность, извлеченная из этого объема, сглажен
Я протестировал кучу картографов vtk для этого тома, например SmartVolumeMapperи поиграл с шейдером и интерполяцией, но не получил отличных результатов.

Вот мой код (на Python):

import vtk
import numpy as np

npa= #some 3D numpy array
[h,w,z]=npa.shape

#importing the numpy array (comes from http://www.vtk.org/Wiki/VTK/Examples/Python/vtkWithNumpy) 
dataImporter = vtk.vtkImageImport()
data_string = npa.tostring()
dataImporter.CopyImportVoidPointer(data_string, len(data_string))
dataImporter.SetDataScalarTypeToUnsignedChar()
dataImporter.SetNumberOfScalarComponents(1)
dataImporter.SetDataExtent(0,z-1, 0, w-1, 0,h-1)
dataImporter.SetWholeExtent(0,z-1, 0,w-1, 0,h-1)

#Defining a transparency function
alphaChannelFunc = vtk.vtkPiecewiseFunction()
alphaChannelFunc.AddPoint(0, 0.0)
alphaChannelFunc.AddPoint(255, 1)

# Defining a color function
colorFunc = vtk.vtkColorTransferFunction()
colorFunc.AddRGBPoint(255, 1.0, 1.0, 1.0)
colorFunc.AddRGBPoint(128, 0.0, 0, 1.0)

#Creating the volume
volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(colorFunc)
volumeProperty.SetScalarOpacity(alphaChannelFunc)
volumeProperty.ShadeOn()
volumeProperty.SetInterpolationTypeToLinear()

#Creating the mapper
compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
volumeMapper = vtk.vtkVolumeRayCastMapper()
volumeMapper.SetVolumeRayCastFunction(compositeFunction)
volumeMapper.SetInputConnection(dataImporter.GetOutputPort())

#Creating the volume actor
volume = vtk.vtkVolume()
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)

#Creating the renderer
renderer = vtk.vtkRenderer()
renderWin = vtk.vtkRenderWindow()
renderWin.AddRenderer(renderer)
renderInteractor = vtk.vtkRenderWindowInteractor()
renderInteractor.SetRenderWindow(renderWin)

#Adding the actor
renderer.AddVolume(volume)
renderer.SetBackground(0, 0, 0)
renderWin.SetSize(400, 400)

#Launching the renderer
renderInteractor.Initialize()
renderWin.Render()
renderInteractor.Start()

У меня сложилось впечатление, что Volume актер не способ пойти, чтобы получить что-то красивое, может быть, я должен пойти на PolyData или что-то? Я просмотрел пример Marching Cubes (в C++), который, кажется, берет объем и извлекает из него поверхность, но пока не могу заставить его работать (без ошибок, но вывод - полностью белое окно с ошибками, которое выиграло не близко).
Я мог бы углубиться в это, чтобы попытаться заставить его работать, но сначала я хотел бы получить мнение от вас, ребята, так как я новичок в ВТК и, возможно, я все это неправильно делаю.

Я использую Python 2.7.12 и vtk 5.10.1 на Ubuntu 14.

0 ответов

Другие вопросы по тегам