当前位置: 首页 > news >正文

(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
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.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;
}

4. 演示效果

在这里插入图片描述



相关文章:

  • 通过Quartus II实现Nios II编程
  • 影刀RPA怎么制作文生图,把网站上图片获取到本地文件夹工作流
  • 【已解决】Chrome开发工具栏无法看到React Developer Tools
  • 伺服器用什么语言开发呢?做什么用什么?
  • 网页布局新视角:全局居中的魅力与应用
  • Mapreduce中maven打包
  • 基于ARM+FPGA+DSP的储能协调控制器解决方案,支持国产化
  • 游戏开发核心技术解析——从引擎架构到攻防体系的完整技能树
  • Leetcode98、230:二叉搜索树
  • 【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题
  • STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。
  • 一种免费的离线ocr-汉字识别率100%
  • 1656打印路径-Floyd/图论-链表/数据结构
  • 如何使用 uv 构建 Python 包并本地安装
  • 【算法笔记】动态规划基础(一):dp思想、基础线性dp
  • 数据结构与算法学习笔记(Acwing提高课)----动态规划·数字三角形
  • Kubernetes (k8s) 日常运维命令总结
  • 12-DevOps-Gitlab托管Jenkinsfile
  • TDengine 数据订阅设计
  • Linux驱动开发2 - 内核定时器驱动
  • 法治日报:强制统一店铺广告牌匾事件何以频发?
  • 聚焦“共赢蓝色未来”,首届 “海洋命运共同体”上海论坛举行
  • 主动权益基金一季度重仓股出炉:腾讯跃升至第一,阿里、比亚迪、中芯国际新进前十
  • 郑庆华任同济大学党委书记
  • 十三届全国政协经济委员会副主任张效廉严重违纪违法被开除党籍
  • 研究显示:日行9000步最高可将癌症风险降低26%