2016-07-08 17 views
2

Was ich will: eine Reihe von Punkten angeben, geben Sie die Konnektivität mit vtkCellArray, so dass es einem geschlossenen Kreis wird eine vtkPolyData daraus erstellen und anwenden, die vtkTubeFilter ihm etwas Volumen zu geben.Erstellen eine geschlossene Schleife mit vtkTubeFilter

Was ich bekomme: Eine Schleife, die das erste und letzte Element nicht korrekt verbindet, obwohl dies explizit definiert ist. Die andere verwirrende Sache ist, dass die Röhren breiter zu werden scheinen, wenn sie sich dem falsch angeschlossenen Start/Ende nähern.

this

Was ich tat: begann ich mit this example vom VTK Wiki auf, wie eine Polylinie zu erstellen. Hier ist der Code (Python 3.4, VTK 7.0):

import vtk 


def rendering(mapper): 
    """Takes mapper and handles the rendering.""" 
    actor = vtk.vtkActor() 
    actor.SetMapper(mapper) 

    # Create a renderer, render window, and interactor 
    renderer = vtk.vtkRenderer() 
    renderWindow = vtk.vtkRenderWindow() 
    renderWindow.AddRenderer(renderer) 
    renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
    renderWindowInteractor.SetRenderWindow(renderWindow) 
    # Add the actors to the scene 
    renderer.AddActor(actor) 
    # Render and interact 
    renderWindow.Render() 
    renderWindowInteractor.Start() 
    return 

pts = vtk.vtkPoints() 
pts.SetNumberOfPoints(4) 
pts.SetPoint(0, 0.5, 0, 0) 
pts.SetPoint(1, 1, 0.5, 0) 
pts.SetPoint(2, 0.5, 1, 0) 
pts.SetPoint(3, 0, 0.5, 0) 

lines = vtk.vtkCellArray() 
lines.InsertNextCell(5) 
lines.InsertCellPoint(0) 
lines.InsertCellPoint(1) 
lines.InsertCellPoint(2) 
lines.InsertCellPoint(3) 
lines.InsertCellPoint(0) 

poly = vtk.vtkPolyData() 
poly.SetPoints(pts) 
poly.SetLines(lines) 

tubes = vtk.vtkTubeFilter() 
tubes.SetInputData(poly) 
tubes.CappingOn() 
tubes.SidesShareVerticesOff() 
tubes.SetNumberOfSides(4) 
tubes.SetRadius(0.1) 
tubes.Update() 

mapper = vtk.vtkPolyDataMapper() 
mapper.SetInputData(tubes.GetOutput()) 
rendering(mapper) 

Ich hoffe, dass jemand irgendwelche Vorschläge auf, wie dieses Verhalten zu beheben. Ich denke an einen Parameter in polydata oder tubes, die ich vermisse.

Antwort

1

Der Röhrenfilter unterstützt keine periodischen Röhren. Sie sollten in der Lage sein, den Effekt zu approximieren, indem Sie die Naht (wo sich die Rohre treffen) kollinear machen. Also statt

pts = vtk.vtkPoints() 
pts.SetNumberOfPoints(4) 
pts.SetPoint(0, 0.5, 0, 0) 
pts.SetPoint(1, 1, 0.5, 0) 
pts.SetPoint(2, 0.5, 1, 0) 
pts.SetPoint(3, 0, 0.5, 0) 

lines = vtk.vtkCellArray() 
lines.InsertNextCell(5) 
lines.InsertCellPoint(0) 
lines.InsertCellPoint(1) 
lines.InsertCellPoint(2) 
lines.InsertCellPoint(3) 
lines.InsertCellPoint(0) 

Sie dies tun könnte:

pts = vtk.vtkPoints() 
pts.SetNumberOfPoints(5) 
pts.SetPoint(0, 0.25, 0.25, 0) 
pts.SetPoint(1, 0.5, 0, 0) 
pts.SetPoint(2, 1, 0.5, 0) 
pts.SetPoint(3, 0.5, 1, 0) 
pts.SetPoint(4, 0, 0.5, 0) 

lines = vtk.vtkCellArray() 
lines.InsertNextCell(6, range(5) + [0,]) 

Sie würden wahrscheinlich drehen CappingOff wollen(), da die Naht in der Mitte eines Segments angezeigt.

Der "Bump" bewegt sich ebenfalls zur Naht und scheint ein Fehler in VTK zu sein. Sie sollten VTK Bug Tracker suchen und einen Bericht einreichen, wenn nicht bereits ein Problem aufgeführt ist.

+0

Dies ist der bisher beste Workaround, aber [der Bump ist ein Problem] (https://i.imgur.com/qlOOZxQ.png). VTK arbeitet gerade an ihrem Bug-Tracking-System, so dass ich es nicht einreichen kann. – Ian

+0

Ich denke, diese Antwort ist so gut wie es geht, du könntest das Kopfgeld dafür bekommen! – Ian