Monday, February 20, 2012

volume render tetrahedral mesh with VTK/python


import vtk
import numpy as np

# create source
points = vtk.vtkPoints()
h = 1.0;
points.InsertNextPoint(0.0, 0.0, 0.0)
points.InsertNextPoint(0.0, h, 0.0)
n = 6;
angle_step = 2.0 * np.pi / n;
r = 0.5 * h;

for i in range(n):
points.InsertNextPoint(r * np.cos(i * angle_step), h * 0.5, r * np.sin(i * angle_step))

scalars = vtk.vtkDoubleArray()
for i in range(n + 2):
scalars.InsertTuple1(i, i * 255.0 / (n + 2))


tetra = vtk.vtkTetra()
cellArray = vtk.vtkCellArray()

trangle = vtk.vtkTriangle()


for i in range(n):
tetra.GetPointIds().SetId(0, 0)
tetra.GetPointIds().SetId(1, 1)
tetra.GetPointIds().SetId(3, i + 2)
tetra.GetPointIds().SetId(2, (i + 1) % n + 2)
cellArray.InsertNextCell(tetra)
#
# trangle.GetPointIds().SetId(0, 0)
# trangle.GetPointIds().SetId(1, 1)
# trangle.GetPointIds().SetId(2, i + 2)
# cellArray.InsertNextCell(trangle)
ug = vtk.vtkUnstructuredGrid()
ug.SetPoints(points)
ug.GetPointData().SetScalars(scalars);

ug.SetCells(vtk.VTK_TETRA, cellArray)

trianglePolyData = vtk.vtkPolyData()
trianglePolyData.SetPoints( points )
trianglePolyData.SetPolys( cellArray )

writer = vtk.vtkUnstructuredGridWriter();
#writer.SetFileName("Triangle.vtp");
writer.SetFileName("test.vtk");
writer.SetInput(ug);
writer.Write();


source = vtk.vtkConeSource()
source.SetCenter(0,0,0)
source.SetResolution(100)

# mapper
mapper = vtk.vtkDataSetMapper()
mapper.SetInput(ug)
#mapper.SetInput(trianglePolyData)

## volume mapper
volumeMapper = vtk.vtkUnstructuredGridVolumeRayCastMapper()
#volumeMapper = vtk.vtkSmartVolumeMapper()
tri = vtk.vtkDataSetTriangleFilter()
tri.SetInput(ug)
volumeMapper.SetInput(tri.GetOutput())

##create the volumeproperty object to define how our volume looks
colorTF = vtk.vtkColorTransferFunction()
colorTF.AddRGBPoint(0.0, 0.0, 0.0, 0.0)
colorTF.AddRGBPoint(64.0, 1.0, 0.0, 0.0)
colorTF.AddRGBPoint(128.0, 0.0, 0.0, 1.0)
colorTF.AddRGBPoint(192.0, 0.0, 0.5, 0.0)
colorTF.AddRGBPoint(255.0, 0.0, 1.0, 0.0)

opacityTF = vtk.vtkPiecewiseFunction()
opacityTF.AddPoint(0.0, 0.8)
opacityTF.AddPoint(255.0, 1.0)

volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(colorTF)
volumeProperty.SetScalarOpacity(opacityTF)
volumeProperty.ShadeOff();
volumeProperty.SetInterpolationTypeToLinear()

##create a volume to render
theVolume = vtk.vtkVolume()
theVolume.SetMapper(volumeMapper)
theVolume.SetProperty(volumeProperty)

# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetRepresentationToWireframe()

#===================================================

# create a rendering window and renderer
ren = vtk.vtkRenderer()
ren.SetBackground(.3, .6, .3); # Background color green
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)

# create a renderwindowinteractor
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

istyle = vtk.vtkInteractorStyleTrackballCamera()
iren.SetInteractorStyle(istyle)

# assign actor to the renderer
ren.AddViewProp(theVolume)
#ren.AddActor(actor)
#ren.AddActor(actor2)

# enable user interface interactor
iren.Initialize()
renWin.Render()
iren.Start()

No comments:

Post a Comment