VTK —— 二、教程二 - 利用vtk观察者检测多边形圆锥水平旋转360°过程(附完整源码)

news2024/11/28 22:33:04
代码效果

在这里插入图片描述

本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码:

     VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码)

教程描述

     本示例演示如何向VTK程序添加观察程序。

     VTK使用命令/观察器设计模式。也就是说观察者监视任何vtkObject(或子类)可能在自身上调用的特定事件。例如,vtkRenderer在开始呈现时调用“StartEvent”。在这里我们添加一个观察器,当观察到此事件时,该观察器会调用命令。

完整源码
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCommand.h>
#include <vtkConeSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>

#include <iostream>
#include <thread>

namespace 
{
	// 回调/观察者方法
	class vtkMyCallback : public vtkCommand
	{
	public:
		static vtkMyCallback* New()
		{
			return new vtkMyCallback;
		}

		/*
			vtkCommand所有派生类都必须实现此方法,这是实际执行回调工作的方法。
			caller参数是调用事件的对象,eventId参数是事件的ID,callData参数是可以传递到execute方法数据。
		*/
		// 执行观察
		void Execute(vtkObject* caller, unsigned long eventId, void *callData) override
		{
			auto renderer = reinterpret_cast<vtkRenderer*>(caller);

			// 获取相机在世界坐标中的位置
			std::cout << "渲染器摄像机世界坐标发生变化:"
					  << "\t x : " << renderer->GetActiveCamera()->GetPosition()[0]
					  << "\t y : " << renderer->GetActiveCamera()->GetPosition()[1]
					  << "\t z : " << renderer->GetActiveCamera()->GetPosition()[2] << std::endl << 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);						// 渲染器添加观察者并启动事件

	// 360度上循环,每次都渲染圆锥体
	for (int i = 0; i < 360; ++i)
	{
		// 要求此渲染窗口所有渲染器渲染其图像并同步此过程
		renWin->Render();
		
		// 获取当前相机后将围绕以焦点为中心的向上视图矢量旋转相机,结果是相机的水平旋转。
		ren1->GetActiveCamera()->Azimuth(1);

		// 每10ms执行一次
		std::this_thread::sleep_for(std::chrono::milliseconds(10));
	}

	system("pause");
	return EXIT_SUCCESS;
}

笔者

笔者 - jxd

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

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

相关文章

使用clickhouse-backup迁移数据

作者&#xff1a;俊达 1 说明 上一篇文章中&#xff0c;我们介绍了clickhouse-backup工具。除了备份恢复&#xff0c;我们也可以使用该工具来迁移数据。 这篇文章中&#xff0c;我们提供一个使用clickhouse-backup做集群迁移的方案。 2 前置条件 1、源端和目标端网络联通&a…

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包&#xff0c;可以使用其中函数等func main() {fmt.Println("Hello…

微信小程序的常用API ①

前言&#xff1a;什么是微信小程序的API&#xff1f; &#xff08;1&#xff09;微信小程序的API是由宿主环境提供的。通俗来说API是一种接口函数&#xff0c;把函数封装起来给开发者使用&#xff0c;这样好多功能都无需开发者去实现&#xff0c;直接调用即可。 &#xff08;…

真有立即做出40+BI零售数据分析报表的方案?

有&#xff0c;奥威BI零售数据分析方案是一套标准化的BI方案&#xff0c;预设零售数据分析模型和BI报表&#xff0c;点击应用后&#xff0c;将自动从系统中取数&#xff0c;并根据方案的预设计算分析指标、分析数据&#xff0c;并生成让人快速理解数据情况的BI数据可视化报表。…

javaweb http

1、http简介 HTTP 超文本传输协议&#xff08;HTTP-Hyper Text transfer protocol&#xff09;&#xff0c;是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过十几年的使用与发展&…

npm ERR! code CERT_HAS_EXPIRED (创建vue过程)

npm ERR! code CERT_HAS_EXPIRED &#xff08;创建vue过程&#xff09; 起因&#xff1a;卸载 npm uninstall -g vue-cli时候发现报这个错误。 当我们创建vue之前&#xff0c;使用npm更新或者安装啥的时&#xff0c;出现此类提示&#xff0c;则表明&#xff0c;用来验证和网络加…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

使用嘉立创EDA打开JSON格式的PCB及原理图

一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 文件 -> 导入 -> 嘉立创EDA标准版/专业版 三、选择.zip文件并选择 “导入文件并提取库” 四、自定义工程路径 完成导入并转换为.eprj文件 五、视频教学 bilibili_使用立创EDA打开JSO…

Ansible 提示 sshpass 错误

错误的信息为&#xff1a; AILED! > {"msg": "to use the ssh connection type with passwords or pkcs11_provider, you must install the sshpass program"}问题和原因 这是在运行 ansible 的服务器需要安装 sshpass 组件。 可以直接运行&#xff1…

Xamarin.Android中“ADB0020: Android ABI 不匹配。你正将应用支持的“armeabi-v7a;arm64-v8a”异常处理

这里写自定义目录标题 1、问题2、解决 1、问题 在Xamarin.Android中出现ADB0020: Android ABI 不匹配。你正将应用支持的“armeabi-v7a;arm64-v8a”ABI 部署到 ABI“x86_64;x86”的不兼容设备。应创建匹配其中一个应用 ABI 的仿真程序&#xff0c;或将“x86_64”添加到应用生成…

web自动化系列-selenium 的鼠标操作(十)

对于鼠标操作 &#xff0c;我们可以通过click()方法进行点击操作 &#xff0c;但是有些特殊场景下的操作 &#xff0c;click()是无法完成的 &#xff0c;比如 &#xff1a;我想进行鼠标悬停 、想进行鼠标拖拽 &#xff0c;怎么办 &#xff1f; 这个时候你用click()是无法完成的…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式&#xff0c;例如“金鱼”或“卫生纸”&#xff0c;但它们将被转换为离散标签&#xff0c;只是为了简化交叉熵损失的计算&#xff0c;从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

【C++题解】1565. 成绩(score)

问题&#xff1a;1565. 成绩&#xff08;score&#xff09; 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 牛牛最近学习了 C 入门课程&#xff0c;这门课程的总成绩计算方法是&#xff1a; 总成绩作业成绩 20% 小测成绩 30% 期末考试成绩 50%。 牛牛想知道&am…

CSS简介与CSS选择器

目录 CSS简介 CSS语法规范 HTML引入CSS的方式 行内样式表 内部样式表 外部样式表 CSS选择器 CSS基础选择器 标签选择器 类选择器 单类名选择器 多类名选择器 id选择器 id选择器的使用 id选择器和类选择器的区别 通配符选择器 基础选择器总结 CSS简介 CSS 是层…

无风扇嵌入式车载电脑在矿山车辆行业应用

矿山车辆行业应用 背景介绍 现代的采矿业面临许多的挑战&#xff0c;其中最重要的就是安全性的问题&#xff0c;无论在矿井下或地面上的工作&#xff0c;都必须确保员工的安全保障。因此&#xff0c;先进的矿车必须整合专用的车载电脑&#xff0c;在极其恶劣的采矿环境中稳定运…

Python 数据结构和算法实用指南(三)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;哈希和符号表 我们之前已经看过数组和列表&#xff0c;其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效…

SQLite作为应用程序文件格式(二十八)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite数据库中JSON 函数和运算符(二十七) 下一篇&#xff1a;SQLite—系列文章目录 摘要 具有定义架构的 SQLite 数据库文件 通常是一种出色的应用程序文件格式。 以下是十几个原因&#xff1a; 简化的应用程序开发单文…

Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger

大家都知道&#xff0c;在前后端分离开发的时代&#xff0c;前后端接口对接是一项必不可少的工作。 可是&#xff0c;作为后端开发&#xff0c;怎么和前端更好的配合&#xff0c;才能让自己不心累、脑累&#xff0c;直接扔给前端一个后端开放api接口文档或者页面&#xff0c;让…

Spark/SparkSQL读取Hadoop LZO文件概述

一、前置配置 IDEA Maven安装配置 Scala&#xff08;可选&#xff09; Java Hadoop.dll&#xff08;可能需要&#xff0c;具体看有无相关错误信息&#xff09; hadoop-lzo-0.xx.xx.jar&#xff08;如果你的版本过高&#xff0c;需要到官网下载高版本&#xff0c;mvnrepository仓…