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