Python 使用VTK数据时,如何更改VTK中对象的颜色?

Python 使用VTK数据时,如何更改VTK中对象的颜色?,python,colors,vtk,Python,Colors,Vtk,我试图修改放置在vtkAppendPolyData中的每个对象的颜色,但我得到了奇怪的颜色。我的意思是物体不是一种颜色,但它的每一面都有不同的颜色 我想要一种颜色的物体。 以下是最简单的示例: import vtk sphereSource = vtk.vtkSphereSource() sphereSource.SetCenter(5,0,0) sphereSource.Update() Colors = vtk.vtkUnsignedCharArray() Colors.SetNumber

我试图修改放置在
vtkAppendPolyData
中的每个对象的颜色,但我得到了奇怪的颜色。我的意思是物体不是一种颜色,但它的每一面都有不同的颜色

我想要一种颜色的物体。 以下是最简单的示例:

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()

设置元组数时,应使用
InsertTuple3
而不是
InsertNextTuple3
,如下所示:

Colors.SetNumberOfTuples(光线)
对于范围内的c(射线):
颜色.插入图3(c,255,0,0)

请注意,
Insert
在这里是一个容易混淆的名称,因为它不会更改全局大小,并且会覆盖给定的索引。更像是一种
Set
方法。

设置元组数时,应使用
InsertTuple3
而不是
InsertNextTuple3
,如下所示:

Colors.SetNumberOfTuples(光线)
对于范围内的c(射线):
颜色.插入图3(c,255,0,0)

请注意,
Insert
在这里是一个容易混淆的名称,因为它不会更改全局大小,并且会覆盖给定的索引。更像是一种
Set
方法。

您使用哪个版本的VTK?您使用哪个版本的VTK?好的。我明白了。我以为SetNumberOfTuples分配了我想要的元组数,但我错了。非常感谢你
SetNumberOfTuples
执行内存分配,但
InsertNext
追加值,增加数组大小。好的。我明白了。我以为SetNumberOfTuples分配了我想要的元组数,但我错了。非常感谢你
SetNumberOfTuples
执行内存分配,但
InsertNext
追加值,增加数组大小。