news 2026/6/15 13:26:31

CellPicking 网格面的选择与变色(vtkCellPicker)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CellPicking 网格面的选择与变色(vtkCellPicker)

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①vtkCellPicker在3D场景中选取几何对象,②vtkExtractSelection与vtkSelection实现的选择与提取


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkPlaneSource from vtkmodules.vtkFiltersCore import vtkTriangleFilter from vtkmodules.vtkRenderingCore import vtkActor, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, \ vtkPolyDataMapper, vtkDataSetMapper, vtkCellPicker from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera from vtkmodules.vtkCommonCore import vtkIdTypeArray from vtkmodules.vtkCommonDataModel import vtkSelection, vtkSelectionNode, vtkUnstructuredGrid from vtkmodules.vtkFiltersExtraction import vtkExtractSelection class MouseInteractorStyle(vtkInteractorStyleTrackballCamera): def __init__(self, data): self.AddObserver('LeftButtonPressEvent', self.left_button_press_event) self.data = data self.selected_mapper = vtkDataSetMapper() self.selected_actor = vtkActor() def left_button_press_event(self, obj, event): colors = vtkNamedColors() pos = self.GetInteractor().GetEventPosition() """ vtkCellPicker 用于在3D 场景中通过鼠标点击选取几何对象(cells) 工作原理: 将屏幕坐标 (x, y) 转换为 3D 世界坐标射线(ray),用这条射线与场景中的几何体逐个求交,找到射线距离相机最近的相交点。 """ picker = vtkCellPicker() picker.SetTolerance(0.00005) # 设置拾取容差(默认 1e-6) picker.Pick(pos[0], pos[1], 0, self.GetDefaultRenderer()) # 执行拾取操作,参数为窗口坐标 world_position = picker.GetPickPosition() print(f'Cell id is: {picker.GetCellId()}') if picker.GetCellId() != -1: # 表示点击到了某个网格面 print(f'Pick position is: ({world_position[0]:.6g}, {world_position[1]:.6g}, {world_position[2]:.6g})') """ 在vtk中,不能直接讲一个索引id扔给过滤器进行提取,需要一个包含ID、类型和域的完整的选择指令 """ # 作用存放所有被选中的元素的 ID 列表 ids = vtkIdTypeArray() ids.SetNumberOfComponents(1) ids.InsertNextValue(picker.GetCellId()) # 作用:定义这次选择的"规则"和"内容",这是对ID列表赋予意义的关键 selection_node = vtkSelectionNode() selection_node.SetFieldType(vtkSelectionNode.CELL) # 告诉VTK,选择的是几何单元(CELL) selection_node.SetContentType(vtkSelectionNode.INDICES) # 告诉VTK,选择方法是基于索引,而不是位置或者是范围 selection_node.SetSelectionList(ids) # 将前面准备好的 ID 数组 ids 放入这个节点 # 作用:定义选择的对象,顶级容器,用来存储一个或多个选择节点 # 可能希望同时选择“单元 54”和“点 10”,这时候就需要多个选择节点 selection = vtkSelection() """ vtkSelection 它代表着 “被选中的一组元素(点、单元、块、节点等)”,是执行选中、高亮、提取等操作的基础数据结构 """ selection.AddNode(selection_node) """ vtkExtractSelection vtkSelection 和 vtkExtractSelection 这两个类经常是配合使用的, 它们一起构成了 VTK 中实现“选择与提取(Selection & Extraction)”的核心机制 根据 selection 中定义的 ID,从 self.data 中剪切出对应的几何体,并生成一个新的、更小的数据集 """ extract_selection = vtkExtractSelection() """ 端口0,输入原始数据 端口1,vtkSelection对象 """ extract_selection.SetInputData(0, self.data) extract_selection.SetInputData(1, selection) extract_selection.Update() """ 将过滤器产生的临时输出数据,复制到一个持久的、可供渲染器使用的对象中 """ selected = vtkUnstructuredGrid() selected.ShallowCopy(extract_selection.GetOutput()) print(f'Number of points in the selection: {selected.GetNumberOfPoints()}') print(f'Number of cells in the selection : {selected.GetNumberOfCells()}') self.selected_mapper.SetInputData(selected) self.selected_actor.SetMapper(self.selected_mapper) self.selected_actor.GetProperty().EdgeVisibilityOn() self.selected_actor.GetProperty().SetColor(colors.GetColor3d('Tomato')) self.selected_actor.GetProperty().SetLineWidth(3) self.GetInteractor().GetRenderWindow().GetRenderers().GetFirstRenderer().AddActor(self.selected_actor) """ 作用是恢复基类的默认交互行为 背景:MouseInteractorStyle 继承自 vtkInteractorStyleTrackballCamera 鼠标左键在基类中负责旋转相机,在子类中负责单元格的选取 当点集鼠标左键时,会有限执行自定义的逻辑,再执行self.OnLeftButtonDown(),这里是调用了父类的OnLeftButtonDown()方法 保证了执行完自定义的拾取操作之后,程序仍然能够执行基类的默认操作——即启动3D场景的旋转 """ self.OnLeftButtonDown() def main(): colors = vtkNamedColors() plane_source = vtkPlaneSource() plane_source.SetResolution(10, 10) plane_source.Update() triangle_filter = vtkTriangleFilter() triangle_filter.SetInputConnection(plane_source.GetOutputPort()) triangle_filter.Update() mapper = vtkPolyDataMapper() mapper.SetInputConnection(triangle_filter.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d("SeaGreen")) actor.GetProperty().EdgeVisibilityOn() renderer = vtkRenderer() ren_win = vtkRenderWindow() ren_win.AddRenderer(renderer) ren_win.SetWindowName('CellPicking') iren = vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) renderer.AddActor(actor) renderer.SetBackground(colors.GetColor3d('PaleTurquoise')) style = MouseInteractorStyle(triangle_filter.GetOutput()) style.SetDefaultRenderer(renderer) iren.SetInteractorStyle(style) ren_win.Render() iren.Initialize() iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:22:24

企业级WPS离线部署实战:200台电脑批量安装指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个企业级WPS Office批量部署解决方案,包含:1.制作包含所有组件的完整离线安装包 2.开发静默安装脚本(无界面自动安装) 3.局域网分发工具 4.安装进度监…

作者头像 李华
网站建设 2026/6/15 19:46:22

比CHMOD -R 777更高效:智能批量权限管理工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个智能的Linux文件权限批量管理工具,替代危险的CHMOD -R 777命令。功能包括:1) 递归分析目录结构 2) 智能识别文件类型 3) 自动应用最小必要权限 4) …

作者头像 李华
网站建设 2026/6/15 12:24:17

AI如何自动化生成DHCP检测工具?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个DHCP检测工具,能够自动扫描局域网内的DHCP服务器,检测IP地址分配情况,识别IP冲突,并生成可视化报告。要求:1.支…

作者头像 李华
网站建设 2026/6/15 12:21:13

零基础玩转通义千问2.5-0.5B:树莓派AI助手实战

零基础玩转通义千问2.5-0.5B:树莓派AI助手实战 你是否想过,让一台树莓派也能运行大模型?不是“能跑就行”的玩具级体验,而是真正具备代码生成、数学推理、多语言对话、结构化输出能力的轻量级AI助手? 今天&#xff0…

作者头像 李华
网站建设 2026/6/15 12:20:26

小白必看!通义千问2.5轻量版保姆级安装教程

小白必看!通义千问2.5轻量版保姆级安装教程 你是否也想在自己的手机、树莓派甚至老旧笔记本上运行一个真正“全功能”的大模型?不是只能聊聊天的玩具模型,而是能写代码、做数学、输出 JSON、支持多语言的真实生产力工具? 今天&a…

作者头像 李华