VTK —— 三、标准格式 - 示例1 - 读取建模不同格式模型(支持.ply、.vtp、.obj、.stl、.vtk、.g等模型格式)(附完整源码)

news2024/11/24 10:35:13
代码效果

在这里插入图片描述

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

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

教程描述

     本示例演示检查文件的扩展名来选择 vtkPolyData 读取器。该示例处理作为参数传递的每个文件。这假定所有文件都在同一坐标系中建模。

完整源码
#include <vtkBYUReader.h>
#include <vtkOBJReader.h>
#include <vtkPLYReader.h>
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include <vtkXMLPolyDataReader.h>

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkNamedColors.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtksys/SystemTools.hxx>
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <algorithm>
#include <array>
#include <random>
#include <string>

namespace 
{
	vtkSmartPointer<vtkPolyData> ReadPolyData(const char* fileName);
}

int main(int argc, char* argv[])
{
	// 创建VTK命名颜色
	vtkNew<vtkNamedColors> colors;

	// 创建渲染器
	vtkNew<vtkRenderer> renderer;
	renderer->SetBackground(colors->GetColor3d("Wheat").GetData());	// 设置渲染屏幕背景色
	renderer->UseHiddenLineRemovalOn();								// 如果此标志为true,并且渲染引擎支持它,则将使用隐藏线删除绘制线框几何体

	// 为渲染器创建绘制窗口
	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow->SetSize(640, 480);				// 设置渲染窗口的大小
	renderWindow->AddRenderer(renderer);			// 添加渲染器

	// 创建交互器:与平台无关的渲染窗互,包括拾取和帧速率控制
	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(renderWindow);		// 设置由此对象控制的渲染窗口。

	// 随机数种子
	std::mt19937 mt(4355412);
	std::uniform_real_distribution<double> distribution(0.6, 1.0);	// 产生随机浮点值i,在区间上均匀分布

	// 遍历输入文件
	for (int i = 1; i < argc; ++i)
	{
		std::cout << "Loading: " << argv[i] << std::endl;

		// 根据输入文件路径读取模型文件
		auto polyData = ReadPolyData(argv[i]);

		// 可视化,将vtkPolyData映射到图形基元
		vtkNew<vtkPolyDataMapper> mapper;
		mapper->SetInputData(polyData);			// 指定要映射的输入数据

		// 定义大小为3的double数组
		std::array<double, 3> randomColor;
		randomColor[0] = distribution(mt);		// 为数组填充随机数
		randomColor[1] = distribution(mt);		// 为数组填充随机数
		randomColor[2] = distribution(mt);		// 为数组填充随机数

		// 创建几何对象的曲面属性
		vtkNew<vtkProperty> backProp;
		backProp->SetDiffuseColor(colors->GetColor3d("Banana").GetData());	// 设置漫反射曲面颜色
		backProp->SetSpecular(0.6);											// 设置镜面颜色
		backProp->SetSpecularPower(30);										// 设置镜面反射功率

		// 创建渲染场景中的实体1(几何体和属性)
		vtkNew<vtkActor> actor;
		actor->SetMapper(mapper);											// 设置映射器: 将参与者连接到可视化管道末尾
		actor->SetBackfaceProperty(backProp);								// 设置控制此角色背景表面属性的属性对象
		actor->GetProperty()->SetDiffuseColor(randomColor.data());			// 设置漫反射曲面颜色
		actor->GetProperty()->SetSpecular(0.3);								// 设置镜面光照系数
		actor->GetProperty()->SetSpecularPower(30);							// 设置镜面反射功率

		// 添加渲染器
		renderer->AddActor(actor);
	}

	renderWindow->SetWindowName("ReadAllPolyDataTypes");	// 设置渲染窗口名称
	renderWindow->Render();									// 要求此 RenderWindow 拥有的每个渲染器渲染其图像并同步此过程
	interactor->Start();									// 启动事件循环

	return EXIT_SUCCESS;
}

namespace 
{
	// 根据输入文件路径读取模型文件
	vtkSmartPointer<vtkPolyData> ReadPolyData(const char* fileName)
	{
		// 返回完整文件名的扩展名
		std::string extension = vtksys::SystemTools::GetFilenameLastExtension(std::string(fileName));

		// 将扩展名修改为小写
		std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);

		// 数据对象:数据集表示顶点、直线、多边形和三角形等
		vtkSmartPointer<vtkPolyData> polyData;

		if (extension == ".ply")
		{
			// ply的源对象读取者
			vtkNew<vtkPLYReader> reader;
			reader->SetFileName(fileName);		// 设置文件名称
			reader->Update();					// 使算法的信息保持最新状态
			polyData = reader->GetOutput();		// 获取此算法上端口的输出数据对象
		}
		else if (extension == ".vtp")
		{
			vtkNew<vtkXMLPolyDataReader> reader;// 读取VTK XML PolyData文件读取者
			reader->SetFileName(fileName);		// 设置文件名称
			reader->Update();					// 使算法的信息保持最新状态
			polyData = reader->GetOutput();		// 获取此算法上端口的输出数据对象
		}
		else if (extension == ".obj")
		{
			vtkNew<vtkOBJReader> reader;		// 读取Wavefront.obj文件读取者
			reader->SetFileName(fileName);		// 设置文件名称
			reader->Update();					// 使算法的信息保持最新状态
			polyData = reader->GetOutput();		// 获取此算法上端口的输出数据对象
		}
		else if (extension == ".stl")
		{
			vtkNew<vtkSTLReader> reader;		// 读取ASCII或二进制立体光刻文件(.stl文件)的源对象
			reader->SetFileName(fileName);		// 设置文件名称
			reader->Update();					// 使算法的信息保持最新状态
			polyData = reader->GetOutput();		// 获取此算法上端口的输出数据对象
		}
		else if (extension == ".vtk")
		{
			vtkNew<vtkPolyDataReader> reader;	// 读取VTK多边形数据文件
			reader->SetFileName(fileName);		// 设置文件名称
			reader->Update();					// 使算法的信息保持最新状态
			polyData = reader->GetOutput();		// 获取此算法上端口的输出数据对象
		}
		else if (extension == ".g")
		{
			vtkNew<vtkBYUReader> reader;			// 读取BYU多边形文件
			reader->SetGeometryFileName(fileName);	// 设置文件名称
			reader->Update();						// 使算法的信息保持最新状态
			polyData = reader->GetOutput();			// 获取此算法上端口的输出数据对象
		}
		else
		{
			vtkNew<vtkSphereSource> source;		// 创建一个以原点为中心的多边形球体
			source->Update();					// 使算法的信息保持最新状态
			polyData = source->GetOutput();		// 获取此算法上端口的输出数据对象
		}

		return polyData;
	}
} // namespace

笔者

笔者 - jxd

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

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

相关文章

宝塔面板各种疑难杂症处理命令教程

下载地址&#xff1a;宝塔面板各种疑难杂症处理命令教程 这份宝塔面板各种疑难杂症处理命令教程&#xff0c;可以解决市面上遇到的各种难题&#xff0c;建议有技术能行的下载使用&#xff0c;小白也可以下载来学习可以帮助你解决宝塔面板遇到的各种难题

Java面试八股之什么是Java反射

什么是Java反射 基本概念 反射是Java语言的一个重要特性&#xff0c;它允许我们在运行时分析类、接口、字段、方法等组件的信息&#xff0c;并能够动态地操作这些组件&#xff0c;包括创建对象、调用方法、访问和修改字段值等。简单来说&#xff0c;反射提供了在程序运行时对…

镊子蜡烛如何抓住反转进行交易?昂首资本2步抓住反转

很多投资者通过之前的文章知道镊子烛台图&#xff0c;甚至可以通过镊子烛台图有多倍收益&#xff0c;但是很多投资者又迷惑了&#xff0c;为什么我没有通过镊子烛台图获得收益&#xff0c;甚至有时还会亏损收手。其实事情很容易理解&#xff0c;Anzo Capital昂首资本认为那是因…

MES管理系统在柔性制造中有何重要作用

在当今这个瞬息万变的商业环境中&#xff0c;制造业正经历着一场前所未有的转型。消费者需求的多样化和市场动态的快速变化要求企业必须具备高度的灵活性和适应性。为了应对这些挑战&#xff0c;柔性制造策略应运而生&#xff0c;它以其快速响应和灵活调整的能力&#xff0c;成…

WWW服务器搭建(2)——Apache服务器配置与管理

一、Apache简介 1.1 关于Apache Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的Web服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。…

2024 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第六届CCPC河南省大学生程序 设计竞赛Problem L. Toxel 与 PCPC II

//sort bug下标 遍历dp. //没修负的bug肯定连续 #include<bits/stdc.h> using namespace std; #define int long long const int n1e611; int a,b,c[n],dp[n]; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a>>b;for(int i1;…

彻底搞定找不到msvcp100.dll,无法继续执行代码的问题

当您在使用电脑过程中遇到程序运行异常&#xff0c;提示“缺失msvcp100.dll文件”时&#xff0c;不必过于焦虑&#xff0c;此问题可通过一系列简单步骤得到有效解决。MSVCP100.dll是Microsoft Visual C库的一部分&#xff0c;主要用于支持某些应用程序运行所需的特定功能。如果…

C++ 派生类的引入与特性

一 继承与派生 从上面的例子可以看出&#xff1a; 继承&#xff1a;一旦指定了某种事物父代的本质特征&#xff0c;那么它的子代将会自动具有哪些性质。这就是一种朴素的可重用的概念。 派生&#xff1a;而且子代可以拥有父代没有的特性&#xff0c;这是可扩充的概念。 1 C 的…

论文翻译及部分笔记:LANDMARC: Indoor Location Sensing Using Active RFID

LANDMARC: Indoor Location Sensing Using Active RFID 摘要 移动计算设备和嵌入式技术的日益融合引发了“上下文感知”应用的发展和部署&#xff0c;其中位置是最重要的上下文。在本文中&#xff0c;我们介绍了一种名为LANDMARC的定位感知原型系统&#xff0c;该系统使用射频识…

四川汇昌联信:拼多多网点怎么开?大概需要多少钱?

想要开一家拼多多网点&#xff0c;你肯定很关心需要准备多少资金。下面&#xff0c;我们就来详细解答这个问题&#xff0c;并从多个角度分析开设网点的要点。 一、 开设拼多多网点&#xff0c;首要任务是确定启动资金。根据不同的经营模式和地区差异&#xff0c;成本会有所不同…

2年技术调研发现:做到这2点,升职加薪稳了!

一 背景介绍 近一年经历过2年技术调研&#xff0c;针对专业人才的评定原则及等级划分给与一定的指导&#xff0c;比如软件测试工程师需要具备哪些能力&#xff0c;工作职责及高、中、低级别如何进行区分。 在参与访谈过程中&#xff0c;发现针对测试的部分应该梳理出一份通用…

MP4视频转gif怎么做?看看这篇就会了

喜欢刷短视频的小伙伴经常会看到各种好玩有趣的片段&#xff0c;想要通过自己将这段视频制作成gif动态图片的还不想下载软件的时候要怎么办呢&#xff1f;这个很简单&#xff0c;不需要下载什么软件用专业的Gif动画制作网站&#xff0c;支持超清的画质导出&#xff0c;能够完成…

2024软件测试面试必备面试题大全

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;…

44.WEB渗透测试-信息收集-域名、指纹收集(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a; web指纹&#xff1a; 每一个网站&#xff0c;前端开发语言&#xff0c;后端语言&#…

MT3034 算术招亲

跟MT3033新的表达式类似&#xff0c;只多了一个括号合法性的判断 #include <bits/stdc.h> using namespace std; const int N 40; bool tag[N]; bool is_op(char c) {return c || c - || c * || c / || c ^; } int priority(char op) { // 优先级排序if (op ||…

Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误

去年的还是有用的&#xff0c;大家继续看&#xff0c;今年再补充一些Electron-Vue 异常处理方案 M1 和 Window10_electron异常处理-CSDN博客 代码gitee.com地址 electron-demo: electron 22 初始代码开发和讲解 升级electron为22版本&#xff08;这个版本承上启下&#xff0c…

15集合的应用

集合的概念 集合是一个容器&#xff0c;可以容纳其他类型的数据&#xff0c;前面所讲的数组就是一个集合。 所有的集合相关的类和接口都在java.util包下 特点 集合不能直接存储基本数据类型(但是代码上不需要体现&#xff0c;因为Java中有自动装箱)另外集合不能直接存储Java…

【基于element ui的color选择器】基于element ui的color选择器

技术版本如下&#xff1a; vue 2.6.14 less 3.13.1 element-ui 2.15.6 less-loader 5.0.0需求&#xff1a; 支持RGB、HEX编码、支持吸管吸取颜色、颜色选择器、颜色模板、透明度、色板、线性渐变颜色 效果图&#xff1a; 1.引入选择器的color-all文件 <template><…

代码随想录训练营Day 27|理论基础、力扣 77. 组合

1.理论基础 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 来自代码随想录的网站&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (…

网络基础-SSH协议(思科、华为、华三)

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和安全文件传输的协议。它提供了加密的通信通道&#xff0c;使得用户可以在不安全的网络上安全地远程登录到远程主机&#xff0c;并在远程主机上执行命令、访问文件以及传输文件&#xff0c;本篇主要讲解命令执行…