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

代码效果

在这里插入图片描述

本代码编译运行均在如下链接文章生成的库执行成功,若无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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信必诺

嗨,支持下哥们呗。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值