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