news 2026/5/28 1:03:33

基于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/20 13:57:40

如何在JupyterLab中启动VibeVoice-WEB-UI?1键脚本快速入门

如何在JupyterLab中启动VibeVoice-WEB-UI&#xff1f;1键脚本快速入门 你有没有遇到过这样的场景&#xff1a;手头有一段多人对话文本&#xff0c;想快速生成一段自然流畅的语音音频&#xff0c;用于播客、教学或原型演示&#xff0c;但市面上的TTS工具要么机械感太强&#xff…

作者头像 李华
网站建设 2026/5/26 6:24:45

工业现场抗干扰设计中三极管稳定工作的关键因素

工业现场为何三极管总“抽风”&#xff1f;5大设计陷阱与实战避坑指南在工业自动化系统中&#xff0c;一个看似简单的NPN三极管&#xff0c;常常承担着驱动继电器、控制电磁阀或点亮报警灯的关键任务。它结构简单、成本低廉&#xff0c;但偏偏就是这个“最基础”的器件&#xf…

作者头像 李华
网站建设 2026/5/22 5:41:47

高亮度LED恒流驱动电路深度剖析

高亮度LED恒流驱动&#xff1a;从原理到实战的系统性拆解你有没有遇到过这样的情况&#xff1f;明明选了高品质的LED灯珠&#xff0c;电路也照着典型应用图连好了&#xff0c;结果点亮后光输出忽明忽暗&#xff0c;甚至用不了几天就烧了MOS管。问题出在哪&#xff1f;十有八九&…

作者头像 李华
网站建设 2026/5/21 13:48:24

使用VibeVoice制作儿童故事音频:亲子内容创作新方式

使用VibeVoice制作儿童故事音频&#xff1a;亲子内容创作新方式 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。然而&#xff0c;在另一个看似不相关的领域——亲子内容创作中&#xff0c;技术进步同样正在悄然重塑我们的日常体验。想象一…

作者头像 李华