欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > VTK笔记- 3D Widget类 vtkSplineWidget 样条部件

VTK笔记- 3D Widget类 vtkSplineWidget 样条部件

2025/3/13 22:51:55 来源:https://blog.csdn.net/q610098308/article/details/146138090  浏览:    关键词:VTK笔记- 3D Widget类 vtkSplineWidget 样条部件

vtk3DWidget

  vtk3DWidget是用于3D交互观察器的基类,也就是各种3D小部件类的基类,主要是在三维渲染场景中生成一个可以用于控制数据的可视化实体,比如点,线段(曲线)、平面、球体、包围盒(线框)等

 这些3D小部件在场景中表示它们自己,并且具有与它们相关联的特殊回调,允许对小部件进行交互式操作。特别是,vtk3DWidget与其抽象超类vtkInteractorObserver之间的区别在于vtk3DWidget被“放置”在3D空间中。vtkInteractorObservers 不知道它们放在哪里,也可能根本不存在于3D空间中。3D小部件还提供辅助功能,如生成转换、创建polydata(用于播种流线、探测等)或创建隐式函数
 

part2: vtkSplineWidget

vtkSplineWidget是拟合样条的显示部件,可以当作曲线长度测量工具。也可以用于标注;

牙弓曲线我们用到了vtkSplineWidget,曲面提取用到了vtkProbeFilter.在这个功能中主要是根据牙弓线的位置,获取线上的点,
然后按照z轴的方向,按照原图像的z轴上的spacing,创建平面,最后用vtkProbeFilter去切源数据。获得的数据是一个曲面,
为了更好的观看,我们还要进行展平。所以我们需要创建一个imagedata.至此,我们就可以获得CPR。
 
  

Part3: code

import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5 import QtWidgetsclass VTKSplineWidgetDemo(QtWidgets.QMainWindow):def __init__(self, parent=None):super(VTKSplineWidgetDemo, self).__init__(parent)# 设置主窗口self.setWindowTitle("PyQt + VTK SplineWidget Example")self.resize(800, 600)# 创建 VTK 渲染窗口self.vtk_widget = QVTKRenderWindowInteractor(self)self.setCentralWidget(self.vtk_widget)# 初始化 VTK 渲染器和窗口self.renderer = vtk.vtkRenderer()self.vtk_widget.GetRenderWindow().AddRenderer(self.renderer)# 创建 vtkSplineWidgetself.spline_widget = vtk.vtkSplineWidget()self.spline_widget.SetInteractor(self.vtk_widget.GetRenderWindow().GetInteractor())self.spline_widget.SetCurrentRenderer(self.renderer)self.spline_widget.On()  # 启用 SplineWidget# 设置回调函数以获取样条曲线self.spline_widget.AddObserver("InteractionEvent", self.on_spline_interaction)# 设置背景颜色并启动self.renderer.SetBackground(0.2, 0.3, 0.4)self.vtk_widget.Initialize()self.vtk_widget.Start()def on_spline_interaction(self, obj, event):"""当用户交互时更新样条曲线"""# 获取样条曲线的点points = obj.GetNumberOfHandles()if points > 0:print("Spline Points:")for i in range(points):handle = obj.GetHandlePosition(i)print(f"Handle {i}: {handle}")# 获取样条曲线的 PolyDataspline_poly_data = obj.GetPolyData()if spline_poly_data:self.visualize_spline(spline_poly_data)def visualize_spline(self, poly_data):"""将样条曲线可视化"""# 清除之前的样条曲线 Actorself.renderer.RemoveAllViewProps()# 创建映射器和 Actormapper = vtk.vtkPolyDataMapper()mapper.SetInputData(poly_data)actor = vtk.vtkActor()actor.SetMapper(mapper)actor.GetProperty().SetColor(1, 0, 0)  # 设置样条曲线颜色为红色actor.GetProperty().SetLineWidth(2)# 将样条曲线 Actor 添加到渲染器self.renderer.AddActor(actor)self.vtk_widget.GetRenderWindow().Render()if __name__ == "__main__":app = QtWidgets.QApplication([])window = VTKSplineWidgetDemo()window.show()app.exec_()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词