news 2026/5/10 6:02:50

基于OpenGL和Qt的3D地形显示Demo:探索不一样的地形可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于OpenGL和Qt的3D地形显示Demo:探索不一样的地形可视化

基于OpenGL和Qt的3D地形显示demo软件源代码,2019年编写的,当时可分别在ubuntu和Windows系统下编译成功,两个平台下的版本头文件和工程文件略有不一样,均可提供源代码,详见图片。 软件对安装RTK-GPS的往复直线作业的拖拉机采集的地形数据进行插值后构建3D地形,具有颜色区分高度,插值和添加纹理等功能。 地形可用鼠标拖动,旋转和缩放。

最近翻出了一个2019年编写的有意思的玩意儿——基于OpenGL和Qt的3D地形显示Demo软件源代码。这东西当时可是在ubuntu和Windows系统下都能成功编译运行,虽然两个平台下的版本头文件和工程文件有点小差异,但源代码都可以给大家瞅瞅,就像图片里展示的那样。

软件功能大揭秘

地形数据处理

这个软件主要处理的是安装了RTK - GPS的往复直线作业拖拉机采集的地形数据。拿到数据后,可不是直接就显示的,得先插值。为啥要插值呢?简单来说,采集到的数据点可能是离散的,要构建连续的3D地形,就得通过插值算法来填补空缺的数据点,让地形看起来更平滑。

3D地形构建与特色功能

构建好地形后,它有几个很酷炫的功能。比如说,能通过颜色区分高度,这对于直观地了解地形起伏太有用了。想象一下,不同高度用不同颜色表示,一眼望去,哪里高哪里低,清清楚楚。还有插值这个功能,前面提到了它对构建地形的重要性,代码里实现插值可能是这样的:

// 简单的线性插值示例代码 float linearInterpolation(float value1, float value2, float factor) { return value1 + (value2 - value1) * factor; }

在实际的地形数据处理中,可能会用更复杂的插值算法,像样条插值之类的,不过原理都差不多,就是通过已有数据计算出缺失位置的数据值。

另外还有添加纹理功能,给地形加上纹理,能让地形看起来更真实,就好像给地形穿上了一层真实世界的“外衣”。

交互操作

这个软件在交互方面也做得不错,地形可以用鼠标随意拖动、旋转和缩放。这就大大增加了用户对地形的探索性。比如说在Qt中,处理鼠标事件来实现这些交互功能,代码可能像这样:

void MyGLWidget::mousePressEvent(QMouseEvent *event) { lastPos = event->pos(); } void MyGLWidget::mouseMoveEvent(QMouseEvent *event) { int dx = event->x() - lastPos.x(); int dy = event->y() - lastPos.y(); if (event->buttons() & Qt::LeftButton) { // 旋转操作 rotateX += dy * rotationSpeed; rotateY += dx * rotationSpeed; } else if (event->buttons() & Qt::RightButton) { // 平移操作 translateX += dx * translationSpeed; translateY -= dy * translationSpeed; } lastPos = event->pos(); update(); } void MyGLWidget::wheelEvent(QWheelEvent *event) { int numDegrees = event->delta() / 8; int numSteps = numDegrees / 15; // 缩放操作 scaleFactor *= qPow(1.125, numSteps); update(); }

这里通过捕获鼠标的按下、移动和滚轮事件,分别实现了地形的旋转、平移和缩放。通过lastPos记录鼠标上一次的位置,计算当前移动的距离,然后根据不同的鼠标按键执行不同的操作,最后调用update()函数更新显示。

跨平台编译的那些事儿

能在ubuntu和Windows系统下都编译成功,这背后还是有点小门道的。两个平台的头文件和工程文件略有不同,这也是很正常的事儿。在Windows下可能用的是Visual Studio工程文件,而ubuntu下可能就是基于Makefile的工程。比如说在头文件引用上,Windows可能是这样:

#include <windows.h>

而在ubuntu下,一些系统相关的头文件引用可能就是:

#include <X11/Xlib.h>

这些差异在编写代码的时候就得考虑进去,通过条件编译等手段,让代码能在不同平台下都能正确编译。比如说:

#ifdef _WIN32 #include <windows.h> #else #include <X11/Xlib.h> #endif

这样就能根据不同的编译平台,引入相应的头文件了。

总之,这个基于OpenGL和Qt的3D地形显示Demo软件在地形可视化方面还是有不少可圈可点的地方,无论是数据处理、功能实现还是跨平台的支持,都有值得学习和借鉴之处。希望大家也能从这个小项目里挖掘到自己感兴趣的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 16:01:37

Java实现Excel导出列表

1、使用 XSSFWorkbook 进行Excel的渲染、使用 XSSFSheet 创建一个工作簿XSSFWorkbook wb new XSSFWorkbook();// 创建一个Excel文件XSSFSheet sheet wb.createSheet("页签");// 创建一个工作簿// 样式1XSSFCellStyle style wb.createCellStyle();XSSFFont font …

作者头像 李华
网站建设 2026/5/1 16:55:11

CentOS系统调优:让你的服务器性能提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个CentOS智能调优工具&#xff0c;功能包括&#xff1a;1. 自动分析当前系统配置&#xff1b;2. 根据工作负载类型&#xff08;Web服务器、数据库等&#xff09;推荐优化方案…

作者头像 李华
网站建设 2026/5/1 12:23:21

1小时搞定:构建你自己的命令行长度检测工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个轻量级命令行长度检测工具原型。功能包括&#xff1a;实时监测输入命令长度、与系统限制值对比、超过阈值时给出警告和建议。支持Windows和Linux系统&#xff0c;提供简单…

作者头像 李华
网站建设 2026/5/6 9:19:04

对比传统方式:AI生成Docker配置快10倍

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请对比生成两个方案&#xff1a;1. 传统手动编写的Node.js应用Docker配置 2. AI自动生成的优化版本。要求展示&#xff1a;1. 构建时间对比 2. 镜像层优化建议 3. 多阶段构建实现 …

作者头像 李华
网站建设 2026/5/9 7:21:34

print driver host for 32bit applications与用户态交互机制详解

print driver host for 32bit applications&#xff1a;跨架构打印兼容的幕后功臣在一台运行 Windows 10 或 11 的现代电脑上&#xff0c;你可能从未注意过一个名为splwow64.exe的进程。它安静地潜伏在任务管理器中&#xff0c;偶尔被触发&#xff0c;又迅速归于沉寂。但正是这…

作者头像 李华
网站建设 2026/5/9 10:48:43

Qdrant入门指南:5分钟搭建第一个向量搜索应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个最简单的Qdrant入门示例&#xff0c;使用Docker快速部署Qdrant服务。功能要求&#xff1a;1. 用Python脚本插入10条文本嵌入向量&#xff1b;2. 实现一个查询接口找到最相…

作者头像 李华