效果如下图
1. 准备工作
首先,确保你已经安装了 vtkmodules
和 PyQt5
。vtkmodules
是一个包含 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_())