VTK系列-用python VTK显示三维3D模型(瓦力机器人)

在这个博客中,我们将深入探讨如何使用VTK(Visualization Toolkit)这一强大的开源图像处理库来显示STL(Stereolithography)模型。VTK不仅提供了丰富的可视化功能,还能帮助我们轻松处理复杂的三维数据

----------------需要模型文件的同学请评价留言!免费发送-----------------

本专题持续更新中,喜欢的同学们请添加收藏!

本文实现效果如下图:

一 安装VTK

首先,确保你的开发环境中已经安装了VTK。VTK可以通过Python的pip包管理器进行安装。打开你的命令行工具,运行以下命令:

pip install vtk

二  使用VTK显示STL模型

接下来,我们将通过编写Python代码来展示如何使用VTK加载和显示STL模型。以下是详细的步骤和代码示例:

2.1 导入必要的模块

import os
import vtk
import random

2.2 创建一个VTK渲染窗口和渲染器

    renderer = vtk.vtkRenderer()
    render_window = vtk.vtkRenderWindow()
    render_window.AddRenderer(renderer)
    render_window_interactor = vtk.vtkRenderWindowInteractor()
    render_window_interactor.SetRenderWindow(render_window)

2.3  读取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)

2.4  添加网格

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

本专题持续更新中,喜欢的同学们请添加收藏!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值