VTK рендеринг 2D сетки в питоне

1

поэтому я пытаюсь сделать 2D-сетку с помощью vtk (в python). У меня есть список кортежей, содержащих все точки, а также список кортежей, содержащих точки каждой ячейки. Чтобы экспериментировать, я попытался создать объект polydata квадрата с 4 элементами и визуализировать его, но я закончил с этим:

Изображение 174551

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

def main2():

    #Array of vectors containing the coordinates of each point
    nodes = np.array([[0, 0, 0], [1, 0, 0], [2, 0, 0], [2, 1, 0], [2, 2, 0], 
                      [1, 2, 0], [0, 2, 0], [0, 1, 0], [1, 1, 0]])

    #Array of tuples containing the nodes correspondent of each element
    elements = np.array([(0, 1, 8, 7), (7, 8, 5, 6), (1, 2, 3, 8), (8, 3, 4, 
                        5)])

    #Make the building blocks of polyData attributes
    Mesh = vtk.vtkPolyData()
    Points = vtk.vtkPoints()
    Cells = vtk.vtkCellArray()  

    #Load the point and cell attributes
    for i in range(len(nodes)):
        Points.InsertPoint(i, nodes[i])

    for i in range(len(elements)):
        Cells.InsertNextCell(mkVtkIdList(elements[i]))

    #Assign pieces to vtkPolyData
    Mesh.SetPoints(Points)
    Mesh.SetPolys(Cells)

    #Mapping the whole thing
    MeshMapper = vtk.vtkPolyDataMapper()
    if vtk.VTK_MAJOR_VERSION <= 5:
        MeshMapper.SetInput(Mesh)
    else:
        MeshMapper.SetInputData(Mesh)

    #Create an actor
    MeshActor = vtk.vtkActor()
    MeshActor.SetMapper(MeshMapper)

    #Rendering Stuff
    camera = vtk.vtkCamera()
    camera.SetPosition(1,1,1)
    camera.SetFocalPoint(0,0,0)

    renderer = vtk.vtkRenderer()
    renWin   = vtk.vtkRenderWindow()
    renWin.AddRenderer(renderer)

    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    renderer.AddActor(MeshActor)
    renderer.SetActiveCamera(camera)
    renderer.ResetCamera()
    renderer.SetBackground(1,1,1)

    renWin.SetSize(300,300)

    #Interact with data
    renWin.Render()
    iren.Start()


main2()

Я также хотел бы знать, возможно ли иметь линию сетки в качестве фона окна рендеринга вместо черного цвета, например:

Изображение 174551

Заранее спасибо!

Теги:
vtk
mesh

1 ответ

1
Лучший ответ

Вы можете использовать MeshActor.GetProperty(). SetRepresentationToWireframe() (https://www.vtk.org/doc/nightly/html/classvtkProperty.html#a2a4bdf2f46dc499ead4011024eddde5c), чтобы сделать актера в виде каркаса или MeshActor.GetProperty(). SetEdgeVisibility (True), чтобы сделать его сплошным с ребрами, отображаемыми как линии.

Что касается фона окна рендера, я не знаю.

  • 0
    Мне удалось заставить его работать, добавив следующие строки: self.MeshActor.GetProperty().EdgeVisibilityOn() self.MeshActor.GetProperty().SetColor(colors.GetColor3d("Red")) self.MeshActor.GetProperty().SetEdgeColor(colors.GetColor3d("Black")) Но все равно спасибо! Кстати, вы знаете, как я могу отключить вращение актера? Потому что, поскольку я рендеринг 2D-изображения, я бы хотел, чтобы он оставался 2D. ура
  • 1
    Поведение камеры управляется «стилем интерактора» vtkRenderWindowInteractor (в вашем коде он называется «iren»), вы можете получить его / установить через iren.GetInteractorStyle. По умолчанию я считаю vtkInteractorStyleTrackballCamera ( vtk.org/doc/nightly/html/… ). Вы можете попробовать посмотреть на все производные классы из vtkInteractorStyle ( vtk.org/doc/nightly/html/classvtkInteractorStyle.html ), если найдете тот, который вам больше нравится, или создайте свой собственный, который ведет себя так, как вам нужно, и затем установите его, iren.SetInteractorStyle.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню