1#!/usr/bin/env python 2 3## 4# This is an example of how to use the vtkVolumePicker. 5## 6 7import math 8import vtk 9from vtk.util.misc import vtkGetDataRoot 10VTK_DATA_ROOT = vtkGetDataRoot() 11 12#--------------------------------------------------------- 13# renderer and interactor 14ren = vtk.vtkRenderer() 15renWin = vtk.vtkRenderWindow() 16renWin.AddRenderer(ren) 17iren = vtk.vtkRenderWindowInteractor() 18iren.SetRenderWindow(renWin) 19 20#--------------------------------------------------------- 21# read the volume 22reader = vtk.vtkImageReader2() 23reader.SetDataExtent(0,63,0,63,0,92) 24reader.SetFileNameSliceOffset(1) 25reader.SetDataScalarTypeToUnsignedShort() 26reader.SetDataByteOrderToLittleEndian() 27reader.SetFilePrefix(str(VTK_DATA_ROOT) + "/Data/headsq/quarter") 28reader.SetDataSpacing(3.2,3.2,1.5) 29 30#--------------------------------------------------------- 31# set up the volume rendering 32volumeMapper = vtk.vtkGPUVolumeRayCastMapper() 33volumeMapper.SetInputConnection(reader.GetOutputPort()) 34volumeMapper.CroppingOn() 35volumeMapper.SetCroppingRegionPlanes((0.0, 141.6, 0.0, 201.6, 0.0, 138.0)) 36 37volumeColor = vtk.vtkColorTransferFunction() 38volumeColor.AddRGBPoint(0,0.0,0.0,0.0) 39volumeColor.AddRGBPoint(180,0.3,0.1,0.2) 40volumeColor.AddRGBPoint(1000,1.0,0.7,0.6) 41volumeColor.AddRGBPoint(2000,1.0,1.0,0.9) 42 43volumeScalarOpacity = vtk.vtkPiecewiseFunction() 44volumeScalarOpacity.AddPoint(0,0.0) 45volumeScalarOpacity.AddPoint(180,0.0) 46volumeScalarOpacity.AddPoint(1000,0.2) 47volumeScalarOpacity.AddPoint(2000,0.8) 48 49volumeGradientOpacity = vtk.vtkPiecewiseFunction() 50volumeGradientOpacity.AddPoint(0,0.0) 51volumeGradientOpacity.AddPoint(90,0.5) 52volumeGradientOpacity.AddPoint(100,1.0) 53 54volumeProperty = vtk.vtkVolumeProperty() 55volumeProperty.SetColor(volumeColor) 56volumeProperty.SetScalarOpacity(volumeScalarOpacity) 57volumeProperty.SetGradientOpacity(volumeGradientOpacity) 58volumeProperty.SetInterpolationTypeToLinear() 59volumeProperty.ShadeOff() 60volumeProperty.SetAmbient(0.6) 61volumeProperty.SetDiffuse(0.6) 62volumeProperty.SetSpecular(0.1) 63 64volume = vtk.vtkVolume() 65volume.SetMapper(volumeMapper) 66volume.SetProperty(volumeProperty) 67 68#--------------------------------------------------------- 69# Do the surface rendering 70boneExtractor = vtk.vtkMarchingCubes() 71boneExtractor.SetInputConnection(reader.GetOutputPort()) 72boneExtractor.SetValue(0,1150) 73 74boneNormals = vtk.vtkPolyDataNormals() 75boneNormals.SetInputConnection(boneExtractor.GetOutputPort()) 76boneNormals.SetFeatureAngle(60.0) 77 78boneStripper = vtk.vtkStripper() 79boneStripper.SetInputConnection(boneNormals.GetOutputPort()) 80 81boneLocator = vtk.vtkCellLocator() 82boneLocator.SetDataSet(boneExtractor.GetOutput()) 83boneLocator.LazyEvaluationOn() 84 85boneMapper = vtk.vtkPolyDataMapper() 86boneMapper.SetInputConnection(boneStripper.GetOutputPort()) 87boneMapper.ScalarVisibilityOff() 88 89boneProperty = vtk.vtkProperty() 90boneProperty.SetColor(1.0,1.0,0.9) 91 92bone = vtk.vtkActor() 93bone.SetMapper(boneMapper) 94bone.SetProperty(boneProperty) 95 96#--------------------------------------------------------- 97# Create an image actor 98table = vtk.vtkLookupTable() 99table.SetRange(0,2000) 100table.SetRampToLinear() 101table.SetValueRange(0,1) 102table.SetHueRange(0,0) 103table.SetSaturationRange(0,0) 104 105mapToColors = vtk.vtkImageMapToColors() 106mapToColors.SetInputConnection(reader.GetOutputPort()) 107mapToColors.SetLookupTable(table) 108mapToColors.Update() 109 110imageActor = vtk.vtkImageActor() 111imageActor.GetMapper().SetInputConnection(mapToColors.GetOutputPort()) 112imageActor.SetDisplayExtent(32,32,0,63,0,92) 113 114#--------------------------------------------------------- 115# make a transform and some clipping planes 116transform = vtk.vtkTransform() 117transform.RotateWXYZ(-20,0.0,-0.7,0.7) 118 119volume.SetUserTransform(transform) 120bone.SetUserTransform(transform) 121imageActor.SetUserTransform(transform) 122 123c = volume.GetCenter() 124 125volumeClip = vtk.vtkPlane() 126volumeClip.SetNormal(0,1,0) 127volumeClip.SetOrigin(c[0],c[1],c[2]) 128 129boneClip = vtk.vtkPlane() 130boneClip.SetNormal(1,0,0) 131boneClip.SetOrigin(c[0],c[1],c[2]) 132 133volumeMapper.AddClippingPlane(volumeClip) 134boneMapper.AddClippingPlane(boneClip) 135 136#--------------------------------------------------------- 137ren.AddViewProp(volume) 138ren.AddViewProp(bone) 139ren.AddViewProp(imageActor) 140 141camera = ren.GetActiveCamera() 142camera.SetFocalPoint(c[0],c[1],c[2]) 143camera.SetPosition(c[0] + 500,c[1] - 100,c[2] - 100) 144camera.SetViewUp(0,0,-1) 145 146renWin.Render() 147 148#--------------------------------------------------------- 149# the cone points along the -x axis 150coneSource = vtk.vtkConeSource() 151coneSource.CappingOn() 152coneSource.SetHeight(12) 153coneSource.SetRadius(5) 154coneSource.SetResolution(31) 155coneSource.SetCenter(6,0,0) 156coneSource.SetDirection(-1,0,0) 157 158coneMapper = vtk.vtkDataSetMapper() 159coneMapper.SetInputConnection(coneSource.GetOutputPort()) 160 161redCone = vtk.vtkActor() 162redCone.PickableOff() 163redCone.SetMapper(coneMapper) 164redCone.GetProperty().SetColor(1,0,0) 165 166greenCone = vtk.vtkActor() 167greenCone.PickableOff() 168greenCone.SetMapper(coneMapper) 169greenCone.GetProperty().SetColor(0,1,0) 170 171# Add the two cones (or just one, if you want) 172ren.AddViewProp(redCone) 173ren.AddViewProp(greenCone) 174 175#--------------------------------------------------------- 176# the picker 177picker = vtk.vtkVolumePicker() 178picker.SetTolerance(1e-6) 179picker.SetVolumeOpacityIsovalue(0.1) 180# locator is optional, but improves performance for large polydata 181picker.AddLocator(boneLocator) 182 183# A function to point an actor along a vector 184def PointCone(actor,nx,ny,nz): 185 actor.SetOrientation(0.0, 0.0, 0.0) 186 n = math.sqrt(nx**2 + ny**2 + nz**2) 187 if (nx < 0.0): 188 actor.RotateWXYZ(180, 0, 1, 0) 189 n = -n 190 actor.RotateWXYZ(180, (nx+n)*0.5, ny*0.5, nz*0.5) 191 192# A function to move the cursor with the mouse 193def MoveCursor(iren,event=""): 194 renWin.HideCursor() 195 x,y = iren.GetEventPosition() 196 picker.Pick(x, y, 0, ren) 197 p = picker.GetPickPosition() 198 n = picker.GetPickNormal() 199 redCone.SetPosition(p[0],p[1],p[2]) 200 PointCone(redCone,n[0],n[1],n[2]) 201 greenCone.SetPosition(p[0],p[1],p[2]) 202 PointCone(greenCone,-n[0],-n[1],-n[2]) 203 iren.Render() 204 205#--------------------------------------------------------- 206# custom interaction 207iren.AddObserver("MouseMoveEvent", MoveCursor) 208 209iren.Start() 210