VTK系列6 - 将VTK嵌入到pyqt5中进行交互

效果如下图

1. 准备工作

首先,确保你已经安装了 vtkmodules 和 PyQt5vtkmodules 是一个包含 VTK 库的 Python 封装,允许你在 Python 程序中使用 VTK 的强大功能。

2. 创建主窗口

创建一个 PyQt5 的主窗口类 MainWindow,继承自 QtWidgets.QMainWindow。在这个类中,你将设置 VTK 渲染窗口和其他用户界面元素。

class MainWindow(QtWidgets.QMainWindow):  
    def __init__(self, parent=None):  
        super(MainWindow, self).__init__(parent)  
        # 创建VTK渲染窗口和相关组件  
        self.ren = vtk.vtkRenderer()  
        self.vtkWidget = QVTKRenderWindowInteractor(self)  
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)  
        self.setCentralWidget(self.vtkWidget)


3. 添加 3D 图形

在 MainWindow 的构造函数中,创建一个 3D 图形(例如球体),并设置其属性和映射器。然后将这个球体添加到 VTK 渲染器中。

# 创建一个球体  
sphere_source = vtk.vtkSphereSource()  
sphere_source.SetRadius(5.0)  
sphere_source.SetCenter(0.0, 0.0, 0.0)  
sphere_source.Update()  
  
# 创建映射器和演员  
sphere_mapper = vtk.vtkPolyDataMapper()  
sphere_mapper.SetInputConnection(sphere_source.GetOutputPort())  
self.sphere_actor = vtk.vtkActor()  
self.sphere_actor.SetMapper(sphere_mapper)  
self.sphere_actor.GetProperty().SetColor(1.0, 0.0, 0.0)  
  
# 将球体演员添加到渲染器中  
self.ren.AddActor(self.sphere_actor)


4. 设置相机

设置 VTK 渲染器的相机位置,以便更好地查看 3D 图形。

# 设置相机位置以更好地查看球体  
camera = self.ren.GetActiveCamera()  
camera.SetPosition(0, 0, 20)  
camera.SetFocalPoint(0, 0, 0)  
camera.SetViewUp(0, 1, 0)
# 创建控件来控制颜色和相机  
self.createControlWidgets()


5. 添加用户界面控件

添加用户界面控件,如颜色选择器和相机控制滑块,以便用户可以交互地更改 3D 图形的属性和相机位置。

6. 完整代码

import sys
import vtkmodules.all as vtk
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5 import QtWidgets, QtCore


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        # 创建VTK渲染窗口和相关组件
        self.ren = vtk.vtkRenderer()
        self.vtkWidget = QVTKRenderWindowInteractor(self)
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.setCentralWidget(self.vtkWidget)

        # 创建一个球体
        sphere_source = vtk.vtkSphereSource()
        sphere_source.SetRadius(5.0)  # 设置球体半径
        sphere_source.SetCenter(0.0, 0.0, 0.0)  # 设置球体中心
        sphere_source.Update()  # 更新球体源以生成几何数据

        # 创建映射器和演员
        sphere_mapper = vtk.vtkPolyDataMapper()
        sphere_mapper.SetInputConnection(sphere_source.GetOutputPort())
        self.sphere_actor = vtk.vtkActor()
        self.sphere_actor.SetMapper(sphere_mapper)
        self.sphere_actor.GetProperty().SetColor(1.0, 0.0, 0.0)  # 设置球体颜色为红色

        # 将球体演员添加到渲染器中
        self.ren.AddActor(self.sphere_actor)

        # 设置相机位置以更好地查看球体
        camera = self.ren.GetActiveCamera()
        camera.SetPosition(0, 0, 20)  # 设置相机位置
        camera.SetFocalPoint(0, 0, 0)  # 设置相机焦点(观察点)
        camera.SetViewUp(0, 1, 0)  # 设置相机的上方向

        # 设置定时器以更新VTK渲染窗口
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.vtkWidget.GetRenderWindow().Render)
        self.timer.start(100)  # 更新频率,例如每100毫秒更新一次
        '''============================='''
        # 创建控件来控制颜色和相机
        self.createControlWidgets()

        # 布局设置
        self.mainLayout = QtWidgets.QVBoxLayout()
        self.mainLayout.addWidget(self.vtkWidget)
        self.mainLayout.addWidget(self.controlFrame)

        centralWidget = QtWidgets.QWidget()
        centralWidget.setLayout(self.mainLayout)
        self.setCentralWidget(centralWidget)

    def createControlWidgets(self):
        # 创建一个框架来放置所有控件
        self.controlFrame = QtWidgets.QFrame()
        self.controlLayout = QtWidgets.QHBoxLayout(self.controlFrame)

        # 添加颜色选择控件
        self.colorPicker = QtWidgets.QColorDialog()
        self.colorPicker.setOption(QtWidgets.QColorDialog.ShowAlphaChannel, False)
        self.colorPickerButton = QtWidgets.QPushButton("Change Color")
        self.colorPickerButton.clicked.connect(self.changeColor)
        self.controlLayout.addWidget(self.colorPickerButton)

        # 添加相机控制控件
        self.moveCameraXLabel = QtWidgets.QLabel("Move Camera X:")
        self.moveCameraXSpinBox = QtWidgets.QDoubleSpinBox()
        self.moveCameraXSpinBox.setRange(-100, 100)
        self.moveCameraXSpinBox.setSingleStep(1)
        self.moveCameraXSpinBox.valueChanged.connect(self.moveCamera)
        self.controlLayout.addWidget(self.moveCameraXLabel)
        self.controlLayout.addWidget(self.moveCameraXSpinBox)

        # 可以继续添加 Y 和 Z 方向的相机移动控件...

    def changeColor(self):
        color = self.colorPicker.getColor()
        if color.isValid():
            self.sphere_actor.GetProperty().SetColor(color.redF(), color.greenF(), color.blueF())
            self.vtkWidget.GetRenderWindow().Render()

    def moveCamera(self):
        camera = self.ren.GetActiveCamera()
        position = camera.GetPosition()
        camera.SetPosition(self.moveCameraXSpinBox.value(), position[1], position[2])
        self.vtkWidget.GetRenderWindow().Render()

# 创建PyQt5应用程序和主窗口
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
 

                
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《VTK用户手册--文翻译版.pdf》是一本关于VTK(Visualization Toolkit)的用户手册的文翻译版。VTK是一个强大的开源图像处理和可视化库,被广泛应用于科学可视化、医学图像处理、计算机辅助设计等领域。 这本手册提供了关于VTK的详细说明和使用指南,旨在帮助读者了解VTK的各种功能和特性,并学会如何使用它进行图像处理和可视化。手册内容包括VTK的基本概念、常用类和方法的介绍,以及一些实例和示例代码,以加深读者对VTK的理解和掌握。 这本手册的文翻译版对于广大国用户来说是非常有价值的。通过文版,读者可以更加便捷地学习和使用VTK,避免了阅读英文文档时的语言障碍问题。无论是初学者还是有一定经验的用户,都可以通过这本手册扩展他们的VTK知识和技能。 读者可以通过这本手册学会如何利用VTK进行图像数据的加载、处理和可视化,以及如何创建各种类型的图形和视觉效果。手册还可能涉及一些高级特性和应用,比如体数据可视化、三维重建等,对于有进一步需求的用户也提供了参考和指导。 总之,《VTK用户手册--文翻译版.pdf》是一本重要的参考资料,对于想要学习和应用VTK的用户来说无疑是一本宝贵的学习资料。无论是在学术研究、工业应用还是个人兴趣方面,通过这本手册的学习,读者可以更好地掌握和应用VTK这一强大的图像处理和可视化工具。 ### 回答2: vtk用户手册--文翻译版.pdf是VTK(Visualization Toolkit)的用户手册的文翻译版本。VTK是一个用于实现可视化和图形处理的开源软件系统。该手册提供了详细的使用指南和教程,以帮助用户了解和使用VTK的各种功能和特性。 该手册首先介绍了VTK的基本概念和工作原理,包括数据结构、渲染管线和可视化过程。然后,它详细描述了VTK的各个模块和类,如滤波器、渲染器、交互器等,以及它们的使用方法和参数设置。此外,手册还提供了一些实例和示例代码,以帮助用户更好地理解和应用VTK。 通过阅读该手册,用户可以学习到如何使用VTK创建和操作各种数据类型,如点云、网格和体数据。用户还可以了解到如何应用不同的渲染技术和效果,如光照、纹理映射和体积渲染。另外,用户还可以学习到如何与VTK交互进行交互,以实现用户交互操作和动态效果。 总之,vtk用户手册--文翻译版.pdf是一本指导用户学习和使用VTK的重要参考资料。它详细介绍了VTK的功能和特性,并提供了丰富的示例和实例,帮助用户快速上手和实现自己的可视化需求。无论是初学者还是有经验的用户,都可以从该手册获得有用的信息和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值