二、vtkCommand的使用

server/2025/3/18 16:04:51/

一、概述

        vtkCommand是VTK中的一个重要的类,用于处理事件和回调机制。它允许用户在特定事件发生时执行自定义的操作,例如在交互操作、数据更新或渲染过程中触发某些功能。

二、主要功能

1、事件处理:vtkCommand用于监听和处理VTK管线中的各种事件

2、回调机制:通过回调函数,用户可以在事件发生时执行自定义代码

3、事件类型:VTK定义了多种事件类型,如StartEvent、EndEvent、ProgressEvent等。

三、常用事件类型

StartEvent某个过程开始时触发
EndEvent某个过程结束时触发
ProgressEvent过程进行中触发,常用于更新进度条
ModifiedEvent对象被修改时触发
PickEvent用户进行拾起操作时触发
InteractionEvent用户进行交互操作时触发

四、使用步骤 

1、创建一个类继承于vtkCommand,并重写Execute方法

class vtkMyCallback : public vtkCommand
{
public:static vtkMyCallback* New(){return new vtkMyCallback;}void Execute(vtkObject* caller, unsigned long, void*) override{auto renderer = reinterpret_cast<vtkRenderer*>(caller);std::cout << renderer->GetActiveCamera()->GetPosition()[0] << " "<< renderer->GetActiveCamera()->GetPosition()[1] << " "<< renderer->GetActiveCamera()->GetPosition()[2] << std::endl;}vtkMyCallback() = default;
};

2、创建vtkCommand对象 ,经对象添加到需要监听的对象中

//渲染器对象
vtkNew<vtkRenderer> ren1;vtkNew<vtkMyCallback> mo1;
ren1->AddObserver(vtkCommand::StartEvent, mo1);

五、完整示例

namespace {
class vtkMyCallback : public vtkCommand
{
public:static vtkMyCallback* New(){return new vtkMyCallback;}void Execute(vtkObject* caller, unsigned long, void*) override{auto renderer = reinterpret_cast<vtkRenderer*>(caller);std::cout << renderer->GetActiveCamera()->GetPosition()[0] << " "<< renderer->GetActiveCamera()->GetPosition()[1] << " "<< renderer->GetActiveCamera()->GetPosition()[2] << std::endl;}vtkMyCallback() = default;
};
}int main(int, char*[])
{//创建VTK命名颜色vtkNew<vtkNamedColors> colors;//创建多边形圆锥体vtkNew<vtkConeSource> cone;cone->SetHeight(3.0);cone->SetRadius(1.0);cone->SetResolution(10);//将多边形数据映射到圆形基于映射器vtkNew<vtkPolyDataMapper> coneMapper;coneMapper->SetInputConnection(cone->GetOutputPort());//创建渲染创建中的实体(几何体和属性)vtkNew<vtkActor> coneActor;coneActor->SetMapper(coneMapper);coneActor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());//创建渲染器vtkNew<vtkRenderer> ren1;ren1->AddActor(coneActor);ren1->SetBackground(colors->GetColor3d("MidnightBlue").GetData());ren1->ResetCamera();//为渲染器创建绘制窗口vtkNew<vtkRenderWindow> renWin;renWin->AddRenderer(ren1);renWin->SetSize(300, 300);renWin->SetWindowName("Tutorial_Step2");//注册监听的事件及回调vtkNew<vtkMyCallback> mo1;ren1->AddObserver(vtkCommand::StartEvent, mo1);for (int i = 0; i < 360; ++i){renWin->Render();ren1->GetActiveCamera()->Azimuth(1);}return EXIT_SUCCESS;
}

运行结果,物体旋转的同时,打印数据:

15.2107 1 0
15.2084 1 -0.265464
15.2014 1 -0.530846
15.1899 1 -0.796067
15.1737 1 -1.06105
15.1528 1 -1.3257
15.1274 1 -1.58995
15.0973 1 -1.85372
15.0627 1 -2.11692
15.0234 1 -2.37948
14.9796 1 -2.64131
14.9312 1 -2.90234
14.8783 1 -3.16248
14.8209 1 -3.42167
14.7589 1 -3.6798
14.6924 1 -3.93682
14.6215 1 -4.19264
14.5461 1 -4.44718
14.4662 1 -4.70037
14.382 1 -4.95212
14.2934 1 -5.20237
14.2004 1 -5.45103


http://www.ppmy.cn/server/175998.html

相关文章

Python学习第十八天

Django模型 定义&#xff1a;模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表&#xff0c;类的属性对应表的字段。 作用&#xff1a;通过模型&#xff0c;Django 可以将 Python 代码与数据库表结构关联起来&#xff0c;开发者无需直接编写 S…

网页制作代码html制作一个网页模板

制作一个简单而实用的网页模板&#xff1a;HTML基础入门 在数字时代&#xff0c;网页已成为信息展示和交流的重要平台。HTML&#xff08;HyperText Markup Language&#xff09;作为网页制作的基础语言&#xff0c;为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…

【Spring】第二弹:通过反射机制初步理解 IoC

一、Java 反射机制 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机…

Ubuntu 常用指令手册

&#x1f4c1; 文件/目录操作 1. 基础操作 # 递归复制目录&#xff08;含子目录&#xff09; cp -r source_dir/ target_dir/# 递归删除目录&#xff08;强制删除不提示&#xff09; rm -rf dir_name/# 查看当前路径 pwd# 创建多级目录 mkdir -p parent_dir/child_dir2. 权限…

正则表达式小结

正则表达式是一种用于描述文本模式的特殊字符串&#xff0c;它由一系列字符和特殊字符组成&#xff0c;用于匹配和操作文本数据。下面是正则表达式的一些常见规则&#xff1a; 字符匹配&#xff1a; 普通字符&#xff1a;正则表达式中的普通字符&#xff08;字母、数字、符号&a…

vue-router实现

实现一个简化版的 vue-router 可以帮助我们更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于浏览器的 URL 来管理组件的显示&#xff0c;能够根据 URL 变化切换不同的视图。下面是一个简化版的实现&#xff0c;用于帮助你理解基本的路由机制。 创建一个简单的 V…

【Python · Pytorch】Conda介绍 DGL-cuda安装

本文仅涉及DGL库介绍与cuda配置&#xff0c;不包含神经网络及其训练测试。 起因&#xff1a;博主电脑安装了 CUDA 12.4 版本&#xff0c;但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda&#xff1…

基于ssm的电子病历系统(全套)

一、系统架构 前端&#xff1a;jsp | bootstrap | jquery 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…