当前位置: 首页 > 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. 演示效果

在这里插入图片描述



http://www.xdnf.cn/news/99469.html

相关文章:

  • 科学养生,拥抱健康生活
  • 电脑如何监控?六个电脑监控方法分享,请查收
  • 基于大模型的胃食管反流病全周期预测与诊疗方案研究
  • 【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题
  • 服务器上部署Nginx的几种方式
  • vant Dialog组件调用的坑
  • Linux : 理解文件系统
  • CentOS 系统 DeepSeek 部署
  • [java八股文][Java基础面试篇]设计模式
  • VR 全景看车的独特优势​
  • 封装 element-ui 二次弹框
  • 详解:中兴新支点操作系统智慧政务信创解决方案
  • Prometheus定义主机监控告警实例
  • 【Amazing晶焱科技高速 CAN Bus 传输与 TVS/ESD/EOS 保护,将是车用电子的生死关键无标题】
  • 【Java设计模式及实践学习-第4章节-结构型模式】
  • HCIA-Access V2.5_18_网络管理基础_2_SNMP协议简介
  • GeoJsonLayer|BusineDataLayer|graphicLayer数据修改点位层级
  • JVM考古现场(二十五):逆熵者·时间晶体的永恒之战(进阶篇)
  • 生物计算安全攻防战:从DNA存储破译到碳基芯片防御体系重构
  • 【工程开发】LLMC准确高效的LLM压缩工具(三)——AWQ算法量化
  • 机器人雅克比Jacobian矩阵程序
  • 【go】go run-gcflags常用参数归纳,go逃逸分析执行语句,go返回局部变量指针是安全的
  • 深度学习--卷积神经网络调整学习率
  • MVCWebAPI使用FromBody接受对象的方法
  • 【速写】hook与fx
  • UML设计系列(9):开发过程中如何应用UML
  • uniapp跳转和获取参数方式
  • 【学习准备】算法和开发知识大纲
  • Kubelet 可观测性最佳实践
  • Ubuntu 20.04 安装Docker 全过程