在这个博客中,我们将深入探讨如何使用VTK(Visualization Toolkit)这一强大的开源图像处理库来显示STL(Stereolithography)模型。VTK不仅提供了丰富的可视化功能,还能帮助我们轻松处理复杂的三维数据
----------------需要模型文件的同学请评价留言!免费发送-----------------
本专题持续更新中,喜欢的同学们请添加收藏!
本文实现效果如下图:
首先,确保你的开发环境中已经安装了VTK。VTK可以通过Python的pip包管理器进行安装。打开你的命令行工具,运行以下命令:
pip install vtk
接下来,我们将通过编写Python代码来展示如何使用VTK加载和显示STL模型。以下是详细的步骤和代码示例:
import os
import vtk
import random
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)
stl_files = [os.path.join('robot/files', f) for f in os.listdir('robot/files') if f.endswith('.stl')]
colors = [(random.random(), random.random(), random.random()) for _ in stl_files] # 生成随机颜色
for file, color in zip(stl_files, colors):
stl_reader = vtk.vtkSTLReader()
stl_reader.SetFileName(file)
stl_mapper = vtk.vtkPolyDataMapper()
stl_mapper.SetInputConnection(stl_reader.GetOutputPort())
stl_actor = vtk.vtkActor()
stl_actor.SetMapper(stl_mapper)
stl_actor.GetProperty().SetColor(color) # 设置颜色
renderer.AddActor(stl_actor)
transform = vtk.vtkTransform()
transform.Scale(200.0, 200.0, 1.0) # 在X和Y方向上缩放2倍,Z方向保持不变
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetInputConnection(planeSource.GetOutputPort())
transformFilter.SetTransform(transform)
transformFilter.Update()
planeMapper = vtk.vtkPolyDataMapper()
planeMapper.SetInputConnection(planeSource.GetOutputPort())
planeActor = vtk.vtkActor()
planeActor.SetMapper(planeMapper)
planeActor.GetProperty().SetColor(0.0, 0.0, 0.0) # 设置网格颜色为黑色
renderer.AddActor(planeActor)
三 全部代码
import os
import vtk
import random
def main():
# 创建一个VTK渲染窗口和渲染器
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)
# 读取robot文件夹内所有STL文件
stl_files = [os.path.join('robot/files', f) for f in os.listdir('robot/files') if f.endswith('.stl')]
colors = [(random.random(), random.random(), random.random()) for _ in stl_files] # 生成随机颜色
for file, color in zip(stl_files, colors):
stl_reader = vtk.vtkSTLReader()
stl_reader.SetFileName(file)
stl_mapper = vtk.vtkPolyDataMapper()
stl_mapper.SetInputConnection(stl_reader.GetOutputPort())
stl_actor = vtk.vtkActor()
stl_actor.SetMapper(stl_mapper)
stl_actor.GetProperty().SetColor(color) # 设置颜色
renderer.AddActor(stl_actor)
# 添加网格
planeSource = vtk.vtkPlaneSource()
planeSource.SetCenter(0.0, 0.0, 0.0)
planeSource.SetNormal(0.0, 0.0, 1.0) # 法线方向为Z轴,所以网格在XY平面
planeSource.SetXResolution(50) # 增加X分辨率
planeSource.SetYResolution(50) # 增加Y分辨率
planeSource.Update()
# 改变平面大小
transform = vtk.vtkTransform()
transform.Scale(200.0, 200.0, 1.0) # 在X和Y方向上缩放2倍,Z方向保持不变
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetInputConnection(planeSource.GetOutputPort())
transformFilter.SetTransform(transform)
transformFilter.Update()
planeMapper = vtk.vtkPolyDataMapper()
planeMapper.SetInputConnection(planeSource.GetOutputPort())
planeActor = vtk.vtkActor()
planeActor.SetMapper(planeMapper)
planeActor.GetProperty().SetColor(0.0, 0.0, 0.0) # 设置网格颜色为黑色
renderer.AddActor(planeActor)
# 添加坐标系箭头
axes = vtk.vtkAxesActor()
axes.SetTotalLength(0.1, 0.1, 0.1) # 设置箭头长度
axes.SetShaftTypeToCylinder() # 设置箭头形状
axes.SetOrigin(0, 0, 0) # 设置原点位置
renderer.AddActor(axes)
# 添加一些基本的渲染设置
renderer.SetBackground(0.8, 0.8, 0.8) # 设置背景颜色为浅灰色
render_window.SetSize(800, 600)
# 开始交互
render_window.Render()
render_window_interactor.Start()
if __name__ == "__main__":
main()
本专题持续更新中,喜欢的同学们请添加收藏!
因篇幅问题不能全部显示,请点此查看更多更全内容