2016-07-08 7 views
2

Я хочу: указать набор точек, указать соединение, используя vtkCellArray так, что он становится замкнутым кругом, создать vtkPolyData от него и применить vtkTubeFilter, чтобы придать ей объем.Создание замкнутого контура с vtkTubeFilter

Что я получаю: Петля, которая не соединяет первый и последний элементы правильно, несмотря на явное определение этого. Другая запутанная вещь заключается в том, что трубки, похоже, расширяются, приближаясь к неправильному началу/концу.

this

Что я сделал: Я начал с this example из вики ВТК о том, как создать полилинию. Вот код (Python 3.4, ВТК 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) 

Я надеюсь, что кто-то имеет какие-либо предложения о том, как исправить это поведение. Я думаю о параметре в polydata или tubes, что мне не хватает.

ответ

1

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

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) 

вы могли бы сделать это:

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,]) 

Вы, вероятно, хотите, чтобы включить CappingOff(), так как шов будет появляться в середине сегмента.

«Bump» также перемещается к шву и, кажется, является ошибкой в ​​VTK. Вы должны найти отслеживатель ошибок VTK и отправить отчет, если в списке нет проблемы.

+0

Это лучшее обходное решение, предлагаемое до сих пор, но [проблема связана с проблемой] (https://i.imgur.com/qlOOZxQ.png). В то время VTK работает над своей системой отслеживания ошибок, поэтому я не могу ее отправить. – Ian

+0

Я думаю, что этот ответ так же хорош, как и он, вы также можете получить щедрость за это! – Ian