Как изменить цвета объектов в VTK при использовании vtkAppendPolyData? - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь изменить цвет каждого объекта, который я поместил в vtkAppendPolyData, но я получаю странные цвета. Я имею в виду, что объект не одного цвета, но у каждого его лица свой цвет.

enter image description here

Я хотел бы иметь один цвет для объекта. Вот минимальный пример:

import vtk
sphereSource = vtk.vtkSphereSource()
sphereSource.SetCenter(5,0,0)
sphereSource.Update()
Colors = vtk.vtkUnsignedCharArray()
Colors.SetNumberOfComponents(3)
Cellarray = sphereSource.GetOutput().GetPolys().GetNumberOfCells()
Colors.SetNumberOfTuples(Cellarray)
for c in range(Cellarray):
    Colors.InsertNextTuple3(255, 0, 0)

sphereSource.GetOutput().GetCellData().SetScalars(Colors)
sphereSource.Update()


coneSource =vtk.vtkConeSource()
coneSource.Update()
Colors = vtk.vtkUnsignedCharArray()
Colors.SetNumberOfComponents(3)
Cellarray = coneSource.GetOutput().GetPolys().GetNumberOfCells()
Colors.SetNumberOfTuples(Cellarray)
for c in range(Cellarray):
    Colors.InsertNextTuple3(0, 255, 0)
coneSource.GetOutput().GetCellData().SetScalars(Colors)
coneSource.Update()

# Append the two meshes
appendFilter = vtk.vtkAppendPolyData()
appendFilter.AddInputData(sphereSource.GetOutput())
appendFilter.AddInputData(coneSource.GetOutput())

appendFilter.Update()

#  Remove any duplicate points.
cleanFilter = vtk.vtkCleanPolyData()
cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
cleanFilter.Update()

# Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
# mapper.ScalarVisibilityOn()
mapper.SetInputConnection(cleanFilter.GetOutputPort())
mapper.SetColorModeToDirectScalars()

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)
renderer.SetBackground(.3, .2, .1) #  Background color dark red

# Render and interact
renderWindow.Render()
renderWindowInteractor.Start()

1 Ответ

2 голосов
/ 16 января 2020

Когда вы устанавливаете количество кортежей, вы должны использовать InsertTuple3, а не InsertNextTuple3, как указано ниже:

Colors.SetNumberOfTuples(Cellarray)
for c in range(Cellarray):
    Colors.InsertTuple3(c, 255, 0, 0)

Обратите внимание, что Insert здесь вводит в заблуждение имя, поскольку оно не изменяется глобальный размер и перезапишет данный индекс. Больше похоже на Set метод.

...