2011-09-29 10 views

risposta

17

Ecco un esempio che imposta il colore punto in base al valore z.

import vtk 
from numpy import random 

class VtkPointCloud: 

    def __init__(self, zMin=-10.0, zMax=10.0, maxNumPoints=1e6): 
     self.maxNumPoints = maxNumPoints 
     self.vtkPolyData = vtk.vtkPolyData() 
     self.clearPoints() 
     mapper = vtk.vtkPolyDataMapper() 
     mapper.SetInputData(self.vtkPolyData) 
     mapper.SetColorModeToDefault() 
     mapper.SetScalarRange(zMin, zMax) 
     mapper.SetScalarVisibility(1) 
     self.vtkActor = vtk.vtkActor() 
     self.vtkActor.SetMapper(mapper) 

    def addPoint(self, point): 
     if self.vtkPoints.GetNumberOfPoints() < self.maxNumPoints: 
      pointId = self.vtkPoints.InsertNextPoint(point[:]) 
      self.vtkDepth.InsertNextValue(point[2]) 
      self.vtkCells.InsertNextCell(1) 
      self.vtkCells.InsertCellPoint(pointId) 
     else: 
      r = random.randint(0, self.maxNumPoints) 
      self.vtkPoints.SetPoint(r, point[:]) 
     self.vtkCells.Modified() 
     self.vtkPoints.Modified() 
     self.vtkDepth.Modified() 

    def clearPoints(self): 
     self.vtkPoints = vtk.vtkPoints() 
     self.vtkCells = vtk.vtkCellArray() 
     self.vtkDepth = vtk.vtkDoubleArray() 
     self.vtkDepth.SetName('DepthArray') 
     self.vtkPolyData.SetPoints(self.vtkPoints) 
     self.vtkPolyData.SetVerts(self.vtkCells) 
     self.vtkPolyData.GetPointData().SetScalars(self.vtkDepth) 
     self.vtkPolyData.GetPointData().SetActiveScalars('DepthArray') 

pointCloud = VtkPointCloud() 
for k in xrange(1000): 
    point = 20*(random.rand(3)-0.5) 
    pointCloud.addPoint(point) 
pointCloud.addPoint([0,0,0]) 
pointCloud.addPoint([0,0,0]) 
pointCloud.addPoint([0,0,0]) 
pointCloud.addPoint([0,0,0]) 

# Renderer 
renderer = vtk.vtkRenderer() 
renderer.AddActor(pointCloud.vtkActor) 
renderer.SetBackground(.2, .3, .4) 
renderer.ResetCamera() 

# Render Window 
renderWindow = vtk.vtkRenderWindow() 
renderWindow.AddRenderer(renderer) 

# Interactor 
renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
renderWindowInteractor.SetRenderWindow(renderWindow) 

# Begin Interaction 
renderWindow.Render() 
renderWindowInteractor.Start() 
+2

La corrente API stabile (6.2.0) deve: 'mapper.SetInputData (self.vtkPolyData)' – gmas80

+0

idea di come impostare un colore specificato dai tre valori r, g, b? –

+0

@TurboWhale questo esempio http://www.vtk.org/Wiki/VTK/Examples/Python/TriangleColoredPoints dovrebbe aiutare. Dovresti creare 'vtkUnsignedCharArray' con i componenti' 3' e usare 'InsertNextTuple3' per aggiungere i colori di cui hai bisogno. Inoltre basta semplicemente 'SetScalars' come nell'esempio sopra e cambia' SetActiveScalars' in base al nome del tuo array di colori (o rimuovi la chiamata 'SetActiveScalars'). – Charlie

Problemi correlati