2011-09-25 131 views
3

我想顯示有紋理的表面。我希望三角形邊界以不同顏色在表面上可見(可以說是紅色)。我從vtk代碼示例中找到了以下代碼,但它不顯示三角形邊界,而是顯示實心三角形。如何在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中編碼。

非常感謝

回答

4

您需要從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對象,併爲該數據構建一個actor。然後我們通過直接修改actor來將網格的顏色設置爲紅色。

vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset()呼叫防止邊緣從與表面戰鬥(在兩個幾何對象重合並且撕裂通過彼此由於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()