You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.5 KiB
93 lines
3.5 KiB
#!/usr/bin/env python
|
|
|
|
# This example reads a volume dataset, extracts an isosurface that
|
|
# represents the skin and displays it.
|
|
|
|
import vtk
|
|
from vtk.util.misc import vtkGetDataRoot
|
|
VTK_DATA_ROOT = vtkGetDataRoot()
|
|
|
|
# Create the renderer, the render window, and the interactor. The
|
|
# renderer draws into the render window, the interactor enables mouse-
|
|
# and keyboard-based interaction with the scene.
|
|
aRenderer = vtk.vtkRenderer()
|
|
renWin = vtk.vtkRenderWindow()
|
|
renWin.AddRenderer(aRenderer)
|
|
iren = vtk.vtkRenderWindowInteractor()
|
|
iren.SetRenderWindow(renWin)
|
|
|
|
# The following reader is used to read a series of 2D slices (images)
|
|
# that compose the volume. The slice dimensions are set, and the
|
|
# pixel spacing. The data Endianness must also be specified. The reader
|
|
# usese the FilePrefix in combination with the slice number to construct
|
|
# filenames using the format FilePrefix.%d. (In this case the FilePrefix
|
|
# is the root name of the file: quarter.)
|
|
v16 = vtk.vtkVolume16Reader()
|
|
v16.SetDataDimensions(64, 64)
|
|
v16.SetDataByteOrderToLittleEndian()
|
|
v16.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
|
|
v16.SetImageRange(1, 93)
|
|
v16.SetDataSpacing(3.2, 3.2, 1.5)
|
|
|
|
# An isosurface, or contour value of 500 is known to correspond to the
|
|
# skin of the patient. Once generated, a vtkPolyDataNormals filter is
|
|
# is used to create normals for smooth surface shading during rendering.
|
|
# The triangle stripper is used to create triangle strips from the
|
|
# isosurface these render much faster on may systems.
|
|
skinExtractor = vtk.vtkContourFilter()
|
|
skinExtractor.SetInputConnection(v16.GetOutputPort())
|
|
skinExtractor.SetValue(0, 500)
|
|
skinNormals = vtk.vtkPolyDataNormals()
|
|
skinNormals.SetInputConnection(skinExtractor.GetOutputPort())
|
|
skinNormals.SetFeatureAngle(60.0)
|
|
skinMapper = vtk.vtkPolyDataMapper()
|
|
skinMapper.SetInputConnection(skinNormals.GetOutputPort())
|
|
skinMapper.ScalarVisibilityOff()
|
|
skin = vtk.vtkActor()
|
|
skin.SetMapper(skinMapper)
|
|
|
|
# An outline provides context around the data.
|
|
outlineData = vtk.vtkOutlineFilter()
|
|
outlineData.SetInputConnection(v16.GetOutputPort())
|
|
mapOutline = vtk.vtkPolyDataMapper()
|
|
mapOutline.SetInputConnection(outlineData.GetOutputPort())
|
|
outline = vtk.vtkActor()
|
|
outline.SetMapper(mapOutline)
|
|
outline.GetProperty().SetColor(0, 0, 0)
|
|
|
|
# It is convenient to create an initial view of the data. The FocalPoint
|
|
# and Position form a vector direction. Later on (ResetCamera() method)
|
|
# this vector is used to position the camera to look at the data in
|
|
# this direction.
|
|
aCamera = vtk.vtkCamera()
|
|
aCamera.SetViewUp(0, 0, -1)
|
|
aCamera.SetPosition(0, 1, 0)
|
|
aCamera.SetFocalPoint(0, 0, 0)
|
|
aCamera.ComputeViewPlaneNormal()
|
|
|
|
# Actors are added to the renderer. An initial camera view is created.
|
|
# The Dolly() method moves the camera towards the FocalPoint,
|
|
# thereby enlarging the image.
|
|
aRenderer.AddActor(outline)
|
|
aRenderer.AddActor(skin)
|
|
aRenderer.SetActiveCamera(aCamera)
|
|
aRenderer.ResetCamera()
|
|
aCamera.Dolly(1.5)
|
|
|
|
# Set a background color for the renderer and set the size of the
|
|
# render window (expressed in pixels).
|
|
aRenderer.SetBackground(1, 1, 1)
|
|
renWin.SetSize(640, 480)
|
|
|
|
# Note that when camera movement occurs (as it does in the Dolly()
|
|
# method), the clipping planes often need adjusting. Clipping planes
|
|
# consist of two planes: near and far along the view direction. The
|
|
# near plane clips out objects in front of the plane the far plane
|
|
# clips out objects behind the plane. This way only what is drawn
|
|
# between the planes is actually rendered.
|
|
aRenderer.ResetCameraClippingRange()
|
|
|
|
# Interact with the data.
|
|
iren.Initialize()
|
|
renWin.Render()
|
|
iren.Start()
|
|
|