news 2026/5/19 13:23: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/5/15 21:53:32

多视角骨骼融合方案:4路视频同步处理技巧

多视角骨骼融合方案:4路视频同步处理技巧 引言 在三维重建和人机交互领域,多视角人体骨骼关键点检测是一个基础但极具挑战性的任务。想象一下,当我们需要分析舞蹈演员的动作或运动员的训练姿势时,单摄像头视角会存在遮挡和视角局…

作者头像 李华
网站建设 2026/5/12 21:26:47

服装尺寸推荐AI:3D骨骼点+身材预测镜像,电商整合方案

服装尺寸推荐AI:3D骨骼点身材预测镜像,电商整合方案 引言:为什么电商需要智能尺码推荐? 网购服装最大的痛点是什么?相信很多人都有过这样的经历:明明按照尺码表选择了合适的号码,收到货却发现…

作者头像 李华
网站建设 2026/5/13 13:19:15

用通义千问2.5-0.5B打造智能客服:轻量级AI实战应用

用通义千问2.5-0.5B打造智能客服:轻量级AI实战应用 随着大模型技术的普及,越来越多企业希望将AI能力集成到客户服务系统中。然而,传统大模型往往依赖高性能GPU和大量算力资源,难以在边缘设备或低配服务器上稳定运行。本文聚焦阿里…

作者头像 李华
网站建设 2026/5/15 18:15:46

JSON处理神器:用通义千问2.5-0.5B打造轻量级Agent后端

JSON处理神器:用通义千问2.5-0.5B打造轻量级Agent后端 在边缘计算与本地化AI部署日益普及的今天,如何在资源受限设备上实现高效、结构化的自然语言处理成为开发者关注的核心问题。本文将深入探讨如何利用 Qwen2.5-0.5B-Instruct 这一超轻量级大模型&…

作者头像 李华
网站建设 2026/5/19 8:00:31

AI手势识别与追踪快速上手:10分钟完成环境部署

AI手势识别与追踪快速上手:10分钟完成环境部署 1. 引言:AI 手势识别与追踪的现实价值 随着人机交互技术的不断演进,非接触式控制正逐步成为智能设备的重要输入方式。从智能家居到虚拟现实,从远程会议到无障碍交互,手…

作者头像 李华
网站建设 2026/5/11 23:52:19

MelonLoader终极指南:5步掌握Unity游戏模组加载技巧

MelonLoader终极指南:5步掌握Unity游戏模组加载技巧 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 想要为你的Unit…

作者头像 李华