Как отобразить только границы треугольников на текстурированной поверхности в vtk? - PullRequest
3 голосов
/ 26 сентября 2011

Я хочу отобразить поверхность с текстурой.Я хочу, чтобы границы треугольников были видны на поверхности другим цветом (скажем, красным).Я нашел следующий код из примеров кода vtk, но он отображает не границы треугольника, а заполненные треугольники.

   import vtk

   # create a rendering window and renderer
   ren = vtk.vtkRenderer()
   renWin = vtk.vtkRenderWindow()
   renWin.AddRenderer(ren)

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

   # create points
   points = vtk.vtkPoints()
   points.InsertNextPoint(1.0,0.0,0.0)
   points.InsertNextPoint(0.0,0.0,0.0)
   points.InsertNextPoint(0.0,1.0,0.0)

   triangle = vtk.vtkTriangle()
   triangle.GetPointIds().SetId(0,0)
   triangle.GetPointIds().SetId(1,1)
   triangle.GetPointIds().SetId(2,2)

   triangles = vtk.vtkCellArray()
   triangles.InsertNextCell(triangle)

   # polydata object
   trianglePolyData = vtk.vtkPolyData()
   trianglePolyData.SetPoints( points )
   trianglePolyData.SetPolys( triangles )

   # mapper
   mapper = vtk.vtkPolyDataMapper()
   mapper.SetInput(trianglePolyData)

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

   # assign actor to the renderer
   ren.AddActor(actor)

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

Может кто-нибудь, пожалуйста, дайте мне знать, как отображать треугольник только с границами сконкретный цвет.

В идеале я хочу отображать треугольники на текстурированной поверхности.Мои данные состоят из треугольников.Также возможно, что вершины треугольников, которые даны vtk, можно сделать видимыми.

Я кодирую на python.

Большое спасибо

1 Ответ

4 голосов
/ 20 октября 2011

Вам нужно извлечь края из вашего vtkPolyData объекта:

edges = vtk.vtkExtractEdges()
edges.SetInput(trianglePolyData)
edge_mapper = vtk.vtkPolyDataMapper()
edge_mapper.SetInput(edges.GetOutput())

edge_actor = vtk.vtkActor()
edge_actor.SetMapper(edge_mapper)
edge_actor.GetProperty().SetColor(1,0,0)

ren.AddActor(edge_actor)

vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset()

Сначала вы должны извлечь края с помощью фильтра vtkExtractEdges.Вы отображаете результаты этого фильтра на объект vtkPolyData и создаете актора для этих данных.Затем мы устанавливаем цвет сетки на красный, изменяя актера напрямую.

Вызов vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset() предотвращает столкновение краев с поверхностями (два геометрических объекта совпадают и tear через друг друга из-за проблем точности z-буфера).

Для полноты, вот весь код:

import vtk

# create a rendering window and renderer
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)

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

# create points
points = vtk.vtkPoints()
points.InsertNextPoint(1.0,0.0,0.0)
points.InsertNextPoint(0.0,0.0,0.0)
points.InsertNextPoint(0.0,1.0,0.0)

triangle = vtk.vtkTriangle()
triangle.GetPointIds().SetId(0,0)
triangle.GetPointIds().SetId(1,1)
triangle.GetPointIds().SetId(2,2)

triangles = vtk.vtkCellArray()
triangles.InsertNextCell(triangle)

# polydata object
trianglePolyData = vtk.vtkPolyData()
trianglePolyData.SetPoints( points )
trianglePolyData.SetPolys( triangles )

# mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(trianglePolyData)

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

# assign actor to the renderer
ren.AddActor(actor)

#++++++++++++++++++++++++++++++++++++++++++++++++
# Get the edges from the mesh
edges = vtk.vtkExtractEdges()
edges.SetInput(trianglePolyData)
edge_mapper = vtk.vtkPolyDataMapper()
edge_mapper.SetInput(edges.GetOutput())

# Make an actor for those edges    
edge_actor = vtk.vtkActor()
edge_actor.SetMapper(edge_mapper)

# Make the actor red (there are other ways of doing this also)
edge_actor.GetProperty().SetColor(1,0,0)

ren.AddActor(edge_actor)

# Avoid z-buffer fighting
vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset()
#------------------------------------------------

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