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.
82 lines
2.8 KiB
82 lines
2.8 KiB
#!/usr/bin/env python
|
|
|
|
# This example demonstrates the use of glyphing. We also use a mask filter
|
|
# to select a subset of points to glyph.
|
|
|
|
import vtk
|
|
from vtk.util.misc import vtkGetDataRoot
|
|
VTK_DATA_ROOT = vtkGetDataRoot()
|
|
|
|
# Read a data file. This originally was a Cyberware laser digitizer scan
|
|
# of Fran J.'s face. Surface normals are generated based on local geometry
|
|
# (i.e., the polygon normals surrounding eash point are averaged). We flip
|
|
# the normals because we want them to point out from Fran's face.
|
|
fran = vtk.vtkPolyDataReader()
|
|
fran.SetFileName(VTK_DATA_ROOT + "/Data/fran_cut.vtk")
|
|
normals = vtk.vtkPolyDataNormals()
|
|
normals.SetInputConnection(fran.GetOutputPort())
|
|
normals.FlipNormalsOn()
|
|
franMapper = vtk.vtkPolyDataMapper()
|
|
franMapper.SetInputConnection(normals.GetOutputPort())
|
|
franActor = vtk.vtkActor()
|
|
franActor.SetMapper(franMapper)
|
|
franActor.GetProperty().SetColor(1.0, 0.49, 0.25)
|
|
|
|
# We subsample the dataset because we want to glyph just a subset of
|
|
# the points. Otherwise the display is cluttered and cannot be easily
|
|
# read. The RandonModeOn and SetOnRatio combine to random select one out
|
|
# of every 10 points in the dataset.
|
|
ptMask = vtk.vtkMaskPoints()
|
|
ptMask.SetInputConnection(normals.GetOutputPort())
|
|
ptMask.SetOnRatio(10)
|
|
ptMask.RandomModeOn()
|
|
|
|
# In this case we are using a cone as a glyph. We transform the cone so
|
|
# its base is at 0,0,0. This is the point where glyph rotation occurs.
|
|
cone = vtk.vtkConeSource()
|
|
cone.SetResolution(6)
|
|
transform = vtk.vtkTransform()
|
|
transform.Translate(0.5, 0.0, 0.0)
|
|
transformF = vtk.vtkTransformPolyDataFilter()
|
|
transformF.SetInputConnection(cone.GetOutputPort())
|
|
transformF.SetTransform(transform)
|
|
|
|
# vtkGlyph3D takes two inputs: the input point set (SetInput) which can be
|
|
# any vtkDataSet; and the glyph (SetSource) which must be a vtkPolyData.
|
|
# We are interested in orienting the glyphs by the surface normals that
|
|
# we previosuly generated.
|
|
glyph = vtk.vtkGlyph3D()
|
|
glyph.SetInputConnection(ptMask.GetOutputPort())
|
|
glyph.SetSource(transformF.GetOutput())
|
|
glyph.SetVectorModeToUseNormal()
|
|
glyph.SetScaleModeToScaleByVector()
|
|
glyph.SetScaleFactor(0.004)
|
|
spikeMapper = vtk.vtkPolyDataMapper()
|
|
spikeMapper.SetInputConnection(glyph.GetOutputPort())
|
|
spikeActor = vtk.vtkActor()
|
|
spikeActor.SetMapper(spikeMapper)
|
|
spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)
|
|
|
|
# Create the RenderWindow, Renderer and both Actors
|
|
ren = vtk.vtkRenderer()
|
|
renWin = vtk.vtkRenderWindow()
|
|
renWin.AddRenderer(ren)
|
|
iren = vtk.vtkRenderWindowInteractor()
|
|
iren.SetRenderWindow(renWin)
|
|
|
|
# Add the actors to the renderer, set the background and size
|
|
ren.AddActor(franActor)
|
|
ren.AddActor(spikeActor)
|
|
|
|
renWin.SetSize(500, 500)
|
|
ren.SetBackground(0.1, 0.2, 0.4)
|
|
|
|
# Set a nice camera position.
|
|
ren.ResetCamera()
|
|
cam1 = ren.GetActiveCamera()
|
|
cam1.Zoom(1.4)
|
|
cam1.Azimuth(110)
|
|
|
|
iren.Initialize()
|
|
renWin.Render()
|
|
iren.Start()
|
|
|