前面我们实现了使用vtk读取stl文件:
学习笔记1:在python中使用vtk读取并显示单个stl文件-CSDN博客
学习笔记2:在python中使用vtk在一个渲染窗口中读取并显示多个stl文件-CSDN博客
目的
现在我们使用vtk修改stl模型的颜色和透明度
示例代码
import vtk
import os
def create_actor_from_stl(stl_file, color, opacity):
# 创建STL读取器并加载文件
reader = vtk.vtkSTLReader()
reader.SetFileName(stl_file)
# 创建映射器
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(reader.GetOutputPort())
# 创建actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 设置颜色
actor.GetProperty().SetColor(color) # 设置对象的颜色
# 设置透明度
actor.GetProperty().SetOpacity(opacity) # 设置对象的透明度
return actor
def main():
folder_path = 'Stl'
# STL文件列表
stl_files = [] # 示例:添加更多STL文件路径
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
stl_files.append(file_path)
# 创建渲染器
renderer = vtk.vtkRenderer()
# 扩展颜色列表到10种颜色
colors = [
(1.0, 0.0, 0.0), # 红色
(0.0, 1.0, 0.0), # 绿色
(0.0, 0.0, 1.0), # 蓝色
(1.0, 1.0, 0.0), # 黄色
(0.0, 1.0, 1.0), # 青色
(1.0, 0.0, 1.0), # 紫色
(0.5, 0.0, 0.0), # 深红色
(0.0, 0.5, 0.0), # 深绿色
(0.0, 0.0, 0.5), # 深蓝色
(0.5, 0.5, 0.5), # 灰色
]
# 定义透明度列表
opacities = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.2]
# 对于每个STL文件,创建一个actor并添加到渲染器中
for idx, stl_file in enumerate(stl_files):
color = colors[idx % len(colors)] # 循环使用预定义的颜色 %:模运算即取余数
opacity = opacities[idx % len(opacities)] # 循环使用预定义的透明度
actor = create_actor_from_stl(stl_file, color, opacity)
renderer.AddActor(actor)
# 设置背景颜色、渲染窗口和交互器
renderer.SetBackground(0.1, 0.2, 0.4)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
# 开始渲染和交互
renderWindow.Render()
renderWindowInteractor.Start()
if __name__ == "__main__":
main()
代码解释
为了我给对象赋予(改变)颜色和透明度属性,我们在def create_actor_from_stl(stl_file, color, opacity):中加入了两个参数即color, opacity,后面使用actor.GetProperty().SetColor(color)和actor.GetProperty().SetOpacity(opacity)达到改变颜色和透明度的目的。
在mian()中需要注意的是
for idx, stl_file in enumerate(stl_files):
color = colors[idx % len(colors)] # 循环使用预定义的颜色 %:模运算即取余数
opacity = opacities[idx % len(opacities)] # 循环使用预定义的透明度
actor = create_actor_from_stl(stl_file, color, opacity)
renderer.AddActor(actor)
在上面的代码中enumerate()接受一个可迭代对象(如列表)作为参数,并返回一个枚举对象。这个枚举对象生成一对一的索引和值的元组,允许在循环中同时访问它们。简而言之,idx是列表stl_files中每一个stl_file对象的索引值。这样后面的代码就非常容易理解了,每一次渲染器renderer()都会接收到一个编辑过属性的actor。这个属性是由模运算决定的,因为我给每一个文件中的stl都赋予了响应的属性,即我的属性列表中的元素数量和stl文件数量相同。