(20)VTK C++开发示例 --- 读取 DEM(高程地图)文件
文章目录
- 1. 概述
- 2. CMake链接VTK
- 3. main.cpp文件
- 4. 演示效果
更多精彩内容 |
---|
👉内容导航 👈 |
👉VTK开发 👈 |
1. 概述
这个例子展示了如何使用
vtkVRMLImporter
获得wrl文件中的VRML对象。
定义:VRML 是一种用于在互联网上创建和展示 交互式3D场景 的标准化编程语言。它通过文本文件描述三维对象的几何形状、材质、光照、动画及交互行为。
发展背景:诞生于1994年,旨在为早期Web提供3D图形支持,是 Web 3D图形 的早期标准。后续被更先进的 X3D(Extensible 3D) 标准取代。
交互与动画:通过 传感器(Sensors) 和 插值器(Interpolators) 实现用户交互(如点击触发动作)和动态效果(如物体旋转)。
网络集成:支持超链接到其他VRML文件或网页,实现跨场景跳转。
关键特性
- 跨平台性:独立于操作系统和硬件,依赖浏览器插件运行。
- 文本格式:文件轻量(
.wrl
扩展名),易于网络传输和编辑。- 交互性:支持用户与3D对象的实时互动(如拖拽、点击)。
- 可扩展性:可通过原型(Prototype)定义自定义节点。
演示文件下载地址:teapot.wrl
环境 | 说明 |
---|---|
系统 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
编译器 | g++11.4、msvc2017 |
VTK | 9.4.1 |
2. CMake链接VTK
cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS
CommonColor
CommonCore
CommonTransforms
IOImport
InteractionStyle
RenderingAnnotation
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()add_executable(vtk2 main.cpp) # 添加可执行文件target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块
3. main.cpp文件
/********************************************************************************
* 文件名: main.cpp
* 创建时间: 2025-03-15 22:31:23
* 开发者: MHF
* 邮箱: 1603291350@qq.com
* 功能:
*********************************************************************************/
#include <vtkAxesActor.h>
#include <vtkCamera.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTransform.h>
#include <vtkVRMLImporter.h>
#include <vtkVersion.h>using namespace std;int main()
{vtkNew<vtkNamedColors> colors;string filename = "E:/Code/C++/vtk1/bin/teapot.wrl";string actorName = "teapot"; // 茶壶名称, teapot.wrl 文件中【DEF teapot】的名称,大小写敏感vtkNew<vtkRenderer> renderer; // 创建渲染器vtkNew<vtkRenderWindow> renderWindow; // 创建渲染窗口renderWindow->AddRenderer(renderer); // 将渲染器添加到渲染窗口renderWindow->SetSize(640, 480); // 设置渲染窗口大小renderWindow->SetWindowName("VRMLImporter"); // 设置渲染窗口名称vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; // 创建渲染窗口交互器renderWindowInteractor->SetRenderWindow(renderWindow); // 将渲染窗口添加到渲染窗口交互器vtkNew<vtkVRMLImporter> importer; // 创建VRML导入器importer->SetFileName(filename.c_str()); // 设置导入文件名importer->Update(); // 更新导入器importer->SetRenderWindow(renderWindow); // 设置渲染窗口importer->Update();// 该函数用于从导入的 VRML(Virtual Reality Modeling Language)文件中获取具有指定名称的 VRML DEF 对象。vtkObject* defActor = importer->GetVRMLDEFObject(actorName.c_str()); // 获取VRML对象if(!defActor){importer->Print(cout); // 打印导入器信息return EXIT_FAILURE;}vtkActor* actor = static_cast<vtkActor*>(defActor); // 获取VRML对象actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData()); // 设置颜色actor->GetProperty()->SetRepresentationToWireframe(); // 设置表示为线框vtkNew<vtkTransform> transform; // 创建变换transform->Translate(actor->GetCenter()[0], actor->GetCenter()[1], actor->GetCenter()[2]); // 设置平移vtkNew<vtkAxesActor> axes; // 创建坐标轴double len[3];len[0] = (actor->GetBounds()[1] - actor->GetBounds()[0]) * 1.5; len[1] = (actor->GetBounds()[3] - actor->GetBounds()[2]) * 1.5; len[2] = (actor->GetBounds()[5] - actor->GetBounds()[4]) * 1.5;axes->SetTotalLength(len); // 设置坐标轴长度axes->SetUserTransform(transform); // 设置用户变换renderer->AddActor(axes); // 将坐标轴添加到渲染器renderer->SetBackground(colors->GetColor3d("SlateGray").GetData()); // 设置背景颜色renderWindow->Render(); // 渲染窗口renderer->GetActiveCamera()->SetPosition(-14.8296, 18.1304, 12.3352); // 设置相机位置renderer->GetActiveCamera()->SetFocalPoint(2.09905, 0.0832915, 2.47961); // 设置焦点renderer->GetActiveCamera()->SetViewUp(0.262918, -0.260671, 0.928937); // 设置视图向上renderer->GetActiveCamera()->SetDistance(26.6348); // 设置距离renderer->ResetCameraClippingRange(); // 重置相机裁剪范围renderWindow->Render(); // 渲染窗口renderWindowInteractor->Start(); // 开始渲染窗口交互return 0;
}