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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1153507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI数智政工软件系统:把思想政治工作装上“智慧大脑”

如果你以为“数智政工”就是把纸质学习材料变成PDF,那就太小看这个系统了。想象一下:一个能理解两万份思想汇报的核心观点、能预判员工思想动态趋势、能个性化匹配教育内容的“AI政委助手”——这才是真正的数智政工系统。 技术内核:三个“智…

AI如何用sprintf简化你的字符串格式化代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python程序,使用sprintf风格的字符串格式化功能。要求实现以下功能:1) 支持整数、浮点数、字符串等多种数据类型格式化 2) 自动检测变量类型并应用…

CPU亲和性绑定你真的懂吗:99%的工程师忽略的关键细节

第一章:CPU亲和性绑定你真的懂吗:99%的工程师忽略的关键细节在高性能计算与低延迟系统中,CPU亲和性(CPU Affinity)是优化线程调度、减少上下文切换和缓存失效的重要手段。然而,大多数工程师仅停留在使用工具…

AI人脸隐私卫士如何应对戴墨镜人脸?眼部遮挡检测实测

AI人脸隐私卫士如何应对戴墨镜人脸?眼部遮挡检测实测 1. 背景与挑战:当“神秘感”遇上隐私保护 在数字时代,照片和视频中的人脸信息已成为敏感数据的焦点。无论是社交媒体分享、监控录像归档,还是企业内部资料管理,人…

Windows 11安装全攻略:轻松解决硬件限制与驱动兼容性问题

Windows 11安装全攻略:轻松解决硬件限制与驱动兼容性问题 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 还…

树莓派也能跑大模型!通义千问2.5-0.5B轻量部署实测

树莓派也能跑大模型!通义千问2.5-0.5B轻量部署实测 在边缘计算与AI融合的浪潮中,能否让一台树莓派运行真正意义上的“大模型”?过去这或许是天方夜谭,但随着模型压缩、量化和推理引擎的飞速发展,答案已经变为“可以”…

手势交互系统设计:MediaPipe Hands最佳实践

手势交互系统设计:MediaPipe Hands最佳实践 1. 引言:AI 手势识别与追踪的工程价值 随着人机交互技术的演进,非接触式手势控制正逐步从科幻走向现实。在智能设备、虚拟现实(VR)、增强现实(AR)以…

1分钟创建测试用MSI文件的秘密技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个MSI原型生成器,功能:1.通过表单定义基础信息 2.选择预设组件模板 3.自定义安装流程 4.实时生成测试用MSI 5.下载分享功能。技术方案:Py…

Blender VRM插件终极指南:从安装到精通的完整攻略

Blender VRM插件终极指南:从安装到精通的完整攻略 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 想要在Blender中轻松创建专…

GLM-4.6V-Flash-WEB部署教程:单卡A10G高效运行实测

GLM-4.6V-Flash-WEB部署教程:单卡A10G高效运行实测 智谱最新开源,视觉大模型。 1. 引言 1.1 学习目标 本文将带你从零开始完成 GLM-4.6V-Flash-WEB 的本地化部署,涵盖环境配置、一键启动脚本使用、网页与API双模式推理调用。通过本教程&…

通义千问2.5-0.5B避坑指南:从部署到应用的全流程解析

通义千问2.5-0.5B避坑指南:从部署到应用的全流程解析 1. 引言:为什么选择 Qwen2.5-0.5B-Instruct? 在边缘计算和端侧AI快速发展的今天,如何在资源受限设备上运行高效、功能完整的语言模型,成为开发者关注的核心问题。…

开源多模态模型推荐:GLM-4.6V-Flash-WEB镜像开箱即用

开源多模态模型推荐:GLM-4.6V-Flash-WEB镜像开箱即用 智谱最新开源,视觉大模型。 1. 背景与技术趋势 1.1 多模态大模型的演进路径 近年来,多模态大模型在AI领域持续升温。从早期的图文匹配、图像描述生成,到如今支持复杂推理、跨…

GEOSERVER性能优化:从30秒到3秒的飞跃

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 编写一个GEOSERVER性能优化工具,自动执行以下操作:1) 分析当前服务响应时间;2) 生成缓存配置建议;3) 优化SQL视图查询语句&#xff…

VibeVoice-TTS对话一致性优化:多说话人身份保持技巧

VibeVoice-TTS对话一致性优化:多说话人身份保持技巧 1. 引言:从播客生成到多说话人TTS的工程挑战 随着AI语音技术的发展,传统文本转语音(TTS)系统已难以满足日益增长的长篇、多角色对话内容需求,如播客、有…

AWK vs Python:文本处理效率终极对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个性能对比工具,自动测试AWK和Python在以下场景的处理速度:1. 大文件行数统计;2. 字段提取和重组;3. 正则匹配;4.…

手势识别在安防中的应用:MediaPipe Hands实践分享

手势识别在安防中的应用:MediaPipe Hands实践分享 1. 引言:AI手势识别如何赋能智能安防 1.1 安防场景下的交互新范式 传统安防系统多依赖摄像头监控、门禁刷卡和人工巡检,缺乏对人员行为意图的主动感知能力。随着人工智能技术的发展&#…

虚拟线程在函数式API中的应用(你不可不知的10个优化技巧)

第一章:虚拟线程与函数式API的融合背景随着现代应用对高并发处理能力的需求日益增长,传统基于操作系统的线程模型逐渐暴露出资源消耗大、上下文切换开销高等问题。为应对这一挑战,虚拟线程(Virtual Threads)应运而生—…

是否支持多语言?GLM-4.6V-Flash-WEB功能实测指南

是否支持多语言?GLM-4.6V-Flash-WEB功能实测指南 智谱最新开源,视觉大模型。 1. 引言:为何关注GLM-4.6V-Flash-WEB的多语言能力? 随着多模态大模型在图像理解、图文生成等场景中的广泛应用,跨语言理解能力已成为衡量模…

MyBatis核心配置文件之mappers

resources目录下创建包,由于没有new Package 只能通过new Directory创建要用/分隔 将映射文件放入该目录下在核心配置文件中引入注意: 以包为单位引入映射文件 要求: mapper接口所在包要和映射文件所在包一致mapper接口要和映射文件的名字一致…

MelonLoader终极指南:Unity游戏模组加载器完全掌握

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