news 2026/5/30 13:28:36

CallBack 两种回调方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CallBack 两种回调方式

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtk的两种回调方式函数回调和类方法回调


二:代码及注释

import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, \ vtkRenderer, vtkCamera from vtkmodules.vtkFiltersSources import vtkConeSource from vtkmodules.vtkFiltersModeling import vtkOutlineFilter from vtkmodules.vtkRenderingAnnotation import vtkAxesActor from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget def main(): use_function_callback = True colors = vtkNamedColors() ren = vtkRenderer() renWin = vtkRenderWindow() renWin.AddRenderer(ren) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) source = vtkConeSource() source.SetCenter(0, 0, 0) source.SetRadius(1) source.SetHeight(1.61) source.SetResolution(128) source.Update() mapper = vtkPolyDataMapper() mapper.SetInputConnection(source.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d("peacock")) actor.GetProperty().SetAmbient(0.3) actor.GetProperty().SetDiffuse(0.0) actor.GetProperty().SetSpecular(1.0) actor.GetProperty().SetSpecularPower(20.0) outline = vtkOutlineFilter() outline.SetInputConnection(source.GetOutputPort()) outlineMapper = vtkPolyDataMapper() outlineMapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtkActor() outlineActor.GetProperty().SetColor(colors.GetColor3d('Black')) outlineActor.SetMapper(outlineMapper) ren.AddActor(actor) ren.AddActor(outlineActor) ren.SetBackground(colors.GetColor3d('AliceBlue')) renWin.SetSize(512, 512) camera = vtkCamera() camera.SetPosition(4.6, -2.0, 3.8) camera.SetFocalPoint(0, 0, 0) camera.SetClippingRange(3.2, 10.2) # 摄像机的近平面(Near Clipping Plane)和远平面(Far Clipping Plane)之间的可见空间范围 camera.SetViewUp(0.3, 1.0, 0.13) ren.SetActiveCamera(camera) renWin.Render() renWin.SetWindowName('CallBack') axes1 = MakeAxesActor() om1 = vtkOrientationMarkerWidget() om1.SetOrientationMarker(axes1) om1.SetViewport(0, 0, 0.2, 0.2) om1.SetInteractor(iren) om1.EnabledOn() om1.InteractiveOn() """ 这里是两种回调方法,一种是函数回调,即GetOrientation,另外一种是类方法回调,即OrientationObserver, """ if use_function_callback: """ 在这段代码之前,要先解释一件事情,在 Python 中,函数不仅仅是一段可执行的代码块,它本身也是一个对象(就像数字、字符串、列表一样)。 那么,函数对象也可以拥有属性 下面这段代码 def my_function(a, b): return a + b # my_function 是一个对象。现在我们给它添加一个属性叫做 'data' my_function.data = "这是函数my_function存储的数据" # 我们可以随时访问这个属性 print(my_function.data) # 输出: 这是函数my_function存储的数据 """ GetOrientation.cam = ren.GetActiveCamera() iren.AddObserver('EndInteractionEvent', GetOrientation) """ 为什么要这样写??? VTK 的 iren.AddObserver 要求回调函数必须只接受两个参数:caller(事件发起者)和 ev(事件类型) 想在GetOrientation里面操作相机,又不能参数传入,就只能通过这种方式 在回调之前,把相机对象存进GetOrientation函数里面 """ else: iren.AddObserver('EndInteractionEvent', OrientationObserver(ren.GetActiveCamera())) def GetOrientation(caller, ev): print(caller.GetClassName(), 'Event Id:', ev) # 输出:vtkWin32RenderWindowInteractor Event Id: EndInteractionEvent CameraOrientation(GetOrientation.cam) def CameraOrientation(cam): fmt1 = '{:>15s}' fmt2 = '{:9.6g}' print(fmt1.format('Position:'), ', '.join(map(fmt2.format, cam.GetPosition()))) print(fmt1.format('Focal point:'), ', '.join(map(fmt2.format, cam.GetFocalPoint()))) print(fmt1.format('Clipping range:'), ', '.join(map(fmt2.format, cam.GetClippingRange()))) print(fmt1.format('View up:'), ', '.join(map(fmt2.format, cam.GetViewUp()))) print(fmt1.format('Distance:'), fmt2.format(cam.GetDistance())) class OrientationObserver(object): def __init__(self, cam): self.cam = cam def __call__(self, caller, ev): print(caller.GetClassName(), 'Event Id:', ev) CameraOrientation(self.cam) def MakeAxesActor(): axes = vtkAxesActor() axes.SetShaftTypeToCylinder() axes.SetXAxisLabelText('X') axes.SetYAxisLabelText('Y') axes.SetZAxisLabelText('Z') axes.SetTotalLength(1.0, 1.0, 1.0) axes.SetCylinderRadius(0.5 * axes.GetCylinderRadius()) axes.SetConeRadius(1.025 * axes.GetConeRadius()) axes.SetSphereRadius(1.5 * axes.GetSphereRadius()) return axes if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 15:58:41

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

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

作者头像 李华
网站建设 2026/5/28 15:50:27

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

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

作者头像 李华
网站建设 2026/5/21 1:21:35

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

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

作者头像 李华
网站建设 2026/5/28 16:26:00

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

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

作者头像 李华
网站建设 2026/5/27 22:45:29

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

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

作者头像 李华
网站建设 2026/5/28 6:16:34

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…

作者头像 李华