使用VTK从numpy阵列渲染曲面(或平滑体)

使用VTK从numpy阵列渲染曲面(或平滑体),numpy,vtk,surface,smoothing,volume-rendering,Numpy,Vtk,Surface,Smoothing,Volume Rendering,我正在发现VTK,并想用它来绘制一个3D numpy阵列。到目前为止,我已经成功地将一个numpy数组转换为vtk.Volume并显示出来,但是从那里我很难得到一些漂亮的东西。 我得到了如下非常块状的渲染: 我想要一个平滑的渲染,所以我想要么这个体积是平滑的,要么从这个体积中提取的曲面是平滑的。 我已经为这个卷测试了很多vtk映射器,比如SmartVolumeMapper,并使用了着色器和插值,但没有得到很好的结果 以下是我的代码(Python): 我觉得一个Volume演员不是获得漂亮东西的

我正在发现VTK,并想用它来绘制一个3D numpy阵列。到目前为止,我已经成功地将一个numpy数组转换为
vtk.Volume
并显示出来,但是从那里我很难得到一些漂亮的东西。
我得到了如下非常块状的渲染:

我想要一个平滑的渲染,所以我想要么这个体积是平滑的,要么从这个体积中提取的曲面是平滑的。
我已经为这个卷测试了很多vtk映射器,比如
SmartVolumeMapper
,并使用了着色器和插值,但没有得到很好的结果

以下是我的代码(Python):

我觉得一个
Volume
演员不是获得漂亮东西的好方法,也许我应该选择一个
PolyData
什么的?我通过了(在C++中)程序,它似乎取了一个卷并从中提取了一个曲面,但我暂时无法让它工作(没有错误,但输出是一个完全白色的错误窗口,无法关闭)。
我可以更深入地研究它,尝试让它工作,但首先我想从你们那里得到一些意见,因为我是VTK的初学者,也许我在处理这一切时都错了


我在Ubuntu 14上使用Python 2.7.12和vtk 5.10.1。

那么您的数据是一组3d点,没有任何数据附加到各个点上?这些点代表一个曲面吗?也许你可以对点云进行三角剖分,只包括符合一定尺寸标准的四面体。是的,确切地说,它只是3D中的一组点,没有别的。这些点并不表示曲面,而是表示体积。感谢三角测量的想法,它可能需要很多计算能力,虽然。。。
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()