VTK 学习笔记一

news2024/11/25 6:29:19

https://www.cnblogs.com/yangai/p/5955614.html

VTK笔记-了解VTK_黑山老妖的笔记本的博客-CSDN博客

一、VTK一般流程

 1、source 数据源

VTK基础教程(1)- vtkPolyData 介绍_TGTSTTG的博客-CSDN博客

vtkSource 数据源,个人理解的就是故事灵感,来自于古希腊、古罗马、生活中的琐事,常见的有vtkPointSource  vtkCylinderSource

2、mapper 映射器

vtkMapper 就是将将上面的故事灵感 现演绎,变成故事完整话之后重新演绎。

vtkPolyDataMapper

3、actor 演员

vtkActor 就是一个演员,我说的是有演技的老艺术家,不是流量白马会里面的那些人。故事需要人来演绎呈现给观众

4、vtkRenderer 渲染

vtkRenderer 就是当有演员之后你要给演员化妆,营造舞台的氛围,就像一个古装戏,你穿着西装,37分发胶铮亮,纹丝不乱,总感觉让人很出戏。

该类继承于vtkViewport,有2个子类:vtkMesaRender,vtkOpenGLRender.

5、window 窗口

vtkRenderWindow 就是一个舞台,话剧来说就是剧场。
该类继承于vtkWindow,有2个子类:vtkMesaWindow,vtkOpenGLWindow.

6、vtkRenderWindowInteractor(窗口交互器)

我觉得这个应该是导演,用于指挥调度演员和场景的切换,比如控制镜头的推出和拉近,那些地方要给个特写,是一个操控舞台的上帝之手

7、vtkInteractorObserver(观察者) :

我觉得这里应该是观众席上的观众们,每个不同的观众关注的细节,关注的场景都不一样,有的观众或会镜头旋转时做一些记录,有的观众可能在看表演时带上偏光镜。

二、第一个vtk 程序


int vtk_Creater_Sphere_Show()
{
	vtkNew<vtkNamedColors> colors;
	// 设置背景颜色
	std::array<unsigned char, 4> bkg{ { 26, 51, 102, 255 } };
	colors->SetColor("BkgColor", bkg.data());


     // 1、创建一个
	vtkNew<vtkSphereSource> sphereSource;
	sphereSource->SetThetaResolution(30);
	sphereSource->SetPhiResolution(15);
	sphereSource->Update();

	vtkSmartPointer<vtkPolyData> sphereData;
	sphereData = sphereSource->GetOutput();

	// 2 、做映射, 将灵感生成剧本
	vtkNew<vtkPolyDataMapper> shpereMapper;
	shpereMapper->SetInputData(sphereData);

	// 这种方法也是可以的
	vtkNew<vtkPolyDataMapper> shpereMapper2;
	shpereMapper2->SetInputConnection(sphereSource->GetOutputPort());


	// 3、演员
	vtkNew<vtkActor> shpereActor;
	shpereActor->SetMapper(shpereMapper.GetPointer());  // 指针
	// 设置球的颜色
	shpereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
	shpereActor->RotateX(30.0);
	shpereActor->RotateY(-40.0);

	// 4 render  渲染氛围
	vtkNew<vtkRenderer> shpereRender;
	shpereRender->AddActor(shpereActor.GetPointer());
	// 设置背景色 
	shpereRender->SetBackground(colors->GetColor3d("BkgColor").GetData());

	shpereRender->ResetCamera();
	shpereRender->GetActiveCamera()->Zoom(1.5);

	 //  5、窗口
	vtkNew<vtkRenderWindow> window;
	window->SetSize(500,500);
	window->AddRenderer(shpereRender.GetPointer());
	window->SetWindowName("MyFirstVtk");

	// 6 、定义一个鼠标拖动的事件 
	vtkNew<vtkRenderWindowInteractor> mouseInteractor;
	mouseInteractor->SetRenderWindow(window.GetPointer());


    // 启动
	window->Render();
	mouseInteractor->Start();

	return 0;
}

vtk 显示点云


int  Test_vtk_PointCloud()
{

	// 1 设置点云数据
	vtkNew<vtkNamedColors> colors;

	vtkNew<vtkPointSource> pointSource;
	pointSource->SetNumberOfPoints(50000);
	pointSource->SetRadius(10.0);
	pointSource->Update();
	 // 点云的点数
	auto pts = pointSource->GetNumberOfPoints();

	// 设置第二个窗口的数据
	vtkNew<vtkCleanPolyData> cleanPolyData;
	cleanPolyData->SetInputConnection(pointSource->GetOutputPort());

	cleanPolyData->SetTolerance(0.2);
	cleanPolyData->Update();
	// 第二个窗口 点云的点数
	auto cleanPts = cleanPolyData->GetOutput()->GetNumberOfPoints();

	std::cout << "Original points" << pts << std::endl;
	std::cout << "Cleaned points " << cleanPts << std::endl;
	std::cout << "Reduction      "	<< (1.0 - static_cast<double>(cleanPts) / pts) * 100.0 << "%"<< std::endl;


	// 原始点云  ------------------------------------------------------------
	vtkNew<vtkPolyDataMapper> inputMapper;
	inputMapper->SetInputConnection(pointSource->GetOutputPort());
	 //  原始点云的actor -----
	vtkNew<vtkActor> inputActor;
	inputActor->SetMapper(inputMapper.GetPointer());
	inputActor->GetProperty()->SetColor(colors->GetColor3d("Lime").GetData());
	inputActor->GetProperty()->SetPointSize(3);
	//==========================================================


	// 第二个窗口的点云  ------------------------------------------------------------
	vtkNew<vtkPolyDataMapper> cleanedMapper;
	cleanedMapper->SetInputConnection(cleanPolyData->GetOutputPort());

	vtkNew<vtkActor> cleanedActor;
	cleanedActor->SetMapper(cleanedMapper.GetPointer());
	cleanedActor->GetProperty()->SetColor(colors->GetColor3d("Lime").GetData());
	cleanedActor->GetProperty()->SetPointSize(3);
	 //============================================================



	//   定义一个窗口
	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow->SetSize(800, 400);
	renderWindow->SetWindowName("Down sample_PointCloud");

	//  一个导演  2个演员
	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(renderWindow.GetPointer());

	//  定义原始点云和 下采样点云的窗口位置
	double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };
	double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };

	//  原始电源的渲染
	vtkNew<vtkRenderer> leftRenderer;
	renderWindow->AddRenderer(leftRenderer.GetPointer());
	leftRenderer->SetViewport(leftViewport);
	leftRenderer->SetBackground(colors->GetColor3d("van_dyke_brown").GetData());

	// 下采样点云的渲染
	vtkNew<vtkRenderer> rightRenderer;
	renderWindow->AddRenderer(rightRenderer.GetPointer());
	rightRenderer->SetViewport(rightViewport);
	rightRenderer->SetBackground(colors->GetColor3d("ultramarine").GetData());

	leftRenderer->AddActor(inputActor.GetPointer());   // 原始点云
	rightRenderer->AddActor(cleanedActor.GetPointer());  // 下采样点云



	leftRenderer->ResetCamera();
	rightRenderer->ResetCamera();


	  // 一个窗口  启动
	renderWindow->Render();
	interactor->Start();

	return 0;
}

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

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

相关文章

从交易成本模型的角度解析高频交易策略的优劣

高频交易作为一种快速的股市交易方式&#xff0c;越来越受到了投资者的关注。但是&#xff0c;高频交易捕捉到的价格差很小&#xff0c;因此需要使用的交易成本模型与传统的投资方式有所不同。本文将从交易成本模型的角度出发&#xff0c;探讨高频交易策略的优劣。 一、交易成…

jar-protect Jar 包加壳工具

jar-protect 是 java 的 jar 加密加壳工具&#xff0c;对 class 文件进行加密防护&#xff0c;避免反编译破解。 java 本身是开放性极强的语言&#xff0c;代码也容易被反编译&#xff0c;没有语言层面的一些常规保护机制&#xff0c;jar 包很容易被反编译和破解。 受 classfi…

【资料分享】RK3568核心板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)

1 核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板&#xff0c;每核主频高达1.8GHz/2.0GHz。核心板CPU、ROM、RAM、电源、晶振、连接器等所有器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过…

Android中的SDK以及利用Android Studio生成aar

1、什么是SDK&#xff08;Software Development Kit&#xff09; 广义上的SDK&#xff1a; 指的是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合。比如你在编辑器里敲代码的时候它会自动补全代码&#xff0c;自动错误检查&#xff0c…

Linux开发工具Make/Makefile篇

文章目录 &#x1f348;0. 前言&#x1f349;1. 见见猪跑&#x1f34a;2. 依赖关系和依赖方法&#x1f34b;3. 清理&#x1f34c;4. 不可多次编译的原理&#x1f34d;4.1 原因&#x1f34d;4.2 stat命令&#x1f34d;4.3 验证 &#x1f96d;5. 伪目标&#x1f34e;6. 取消回显 …

【如何用大语言模型快速深度学习系列】从word2vec、SVD到GloVe

三天热度果然名不虚传&#xff0c;写作的效率有所下降&#xff0c;但是只要坚持二十一天就能养成习惯啦&#xff01;冲冲冲&#xff01; 上一节回顾 文章链接 在上一章我们将词的概念&#xff0c;通过n-gram组合成了n个词的切片&#xff0c;终于将前后词之间建立了一个联系&a…

MySQL授权操作

目录 授权和撤销授权 创建用户 授权 撤销授权 授权其他用户与撤销权限 授权和撤销授权 创建用户 create user 用户名% identified by 密码; 示例&#xff1a;create user tom% identified by 123456; 授权 GRANT ALL ON 库名.表名 TO 用户名’客户端主机 ; 示例&a…

【动手学习深度学习--逐行代码解析合集】08模型选择、欠拟合和过拟合

【动手学习深度学习】逐行代码解析合集 08模型选择、欠拟合和过拟合 视频链接&#xff1a;动手学习深度学习–模型选择、欠拟合和过拟合 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、生成数据集 import math import numpy a…

ROS:参数名称设置

目录 一、前言二、rosrun设置参数三、launch文件设置参数四、编码设置参数4.1C实现4.1.1ros::param设置参数4.1.2ros::NodeHandle设置参数 4.2python实现 一、前言 在ROS中节点名称话题名称可能出现重名的情况&#xff0c;参数名称也可能重名。 关于参数重名的处理&#xff0c…

Css:浮动相关

1.为什么需要浮动&#xff1f; 多个块级元素纵向排列找 标准流&#xff0c;多个块级元素横线排列找 浮动 2.浮动的特性 浮动会脱离标准流&#xff08;脱标&#xff09; 浮动的盒子不再保留原来的位置 3.清除浮动

BM68-矩阵的最小路径和

题目 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

T100新程序的开发【完整步骤】

简易程序的开发 记录T100中一个简易程序的开发完整步骤。 一、程序基本数据设置作业 打开作业 azzi900,弹出作业详情。 新增一个程序编号。 一些属性概念 程序编号:手动输入你建立的新程序。程序名称:手动输入你建立的名称。归属模块:取决于你程序编号的第一个字母。归属…

C语言判断当前目录下是否存在某一个文件

要判断当前目录下是否存在文件A&#xff0c;可以使用C语言中的标准库函数access来实现。access函数用于检查指定文件是否存在及是否具有指定的访问权限。 #include <stdio.h> #include <unistd.h>int main() {const char* filename "fileName";// 检查…

MongoDB【Springboot访问MongoDB、MongoDB安全认证、MongoDB内置角色 】(五)-全面详解(学习总结---从入门到深化)

目录 Springboot访问MongoDB MongoDB安全认证 MongoDB内置角色 Springboot访问MongoDB MongoTemplate方式 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>…

【裸机开发】SPI 通信接口(一)—— SPI 通信流程及四种工作模式

目录 一、SPI 简介 二、SPI 的基本通信流程 三、SPI 的四种工作模式 1、极性和相位 2、四种工作模式 一、SPI 简介 SPI 采用主从的方式工作&#xff0c;可以一个主设备对应一个从设备&#xff0c;也可以一个主设备对应多个从设备。虽然是一个主设备对多个从设备的关系&am…

如何建立一套完整的人事管理制度?

一、什么是人事管理制度 人事管理制度是企业为有效管理和运营人力资源而建立的一系列规章制度、流程和政策。它是人力资源管理的基础&#xff0c;旨在确保企业拥有合适的员工队伍&#xff0c;并通过有效的管理和激励机制&#xff0c;使员工能够充分发挥自己的潜力&#xff0c;…

计算机网络 day2 物理层-数据链路层-帧-MAC地址 交换机的工作原理

目录 物理层&#xff08;physical layer&#xff09; 数据链路层&#xff08;Data link layer&#xff09; MAC地址&#xff1a; 网络地址&#xff1a; 帧的格式&#xff1a; MTU&#xff1a;最大传输单元 max transfer unit 1500 &#xff08;ip add可以查看&#xf…

【动态规划算法练习】day16

文章目录 一、完全背包1.题目简介2.解题思路3.代码4.运行结果 二、322. 零钱兑换1.题目简介2.解题思路3.代码4.运行结果 三、518. 零钱兑换 II1.题目简介2.解题思路3.代码4.运行结果 四、279. 完全平方数1.题目简介2.解题思路3.代码4.运行结果 总结 一、完全背包 1.题目简介 …

【百日冲大厂】第二十篇,牛客网选择题+编程题 字符串反转+公共子串计算(dp问题)

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;第二十篇,牛客网选择题编程题 字符串反转公共子串计算(dp问题).&#x1f49e;&#x1f49e;&#x1f49e;生活就像一只盲盒&#xff0c;藏着意想不到的辛苦&#xff0c;当然也有万般惊喜的可能。不管是次次都如愿以偿…

初学者一步步学习python 学习提纲

当学习Python时&#xff0c;可以按照以下提纲逐步学习&#xff1a; 入门基础 了解Python的历史和应用领域安装Python解释器和开发环境&#xff08;如Anaconda、IDLE等&#xff09;学习使用Python的交互式解释器或集成开发环境&#xff08;IDE&#xff09;进行简单的代码编写和…