Home

cdeveloper

读书,写作

QT - OSG 开发环境配置

毕设项目要开发一个无人机 3D 飞行姿态控制系统,要使用 OSG 3D 库渲染一个 3D 的无人机模型,并加以控制,如果直接使用底层的 OpenGL API 要麻烦很多。整个项目打算用 QT 开发,抛弃 MFC 了。这里顺便记录下 QT 配置 OSG 的过程,方便以后配置。

项目使用的 OSG 开发环境是:QT 5.9.4(MSVC2013_32) + OSG - 3.4.0

Qt 下载

项目使用 QT 5.9.4 版本的 QT,因为 5.9.4 是 LTS 版本,修复了很多 Bug,但是 5.9.4 没有 msvc2013_32 bit 的编译套件,而我的项目是 32 bit 的,因此我又下载了 QT 5.8.0,并将这两个版本的 QT 都安装了,然后配置 Qt5.9.4 的编译套件为 Qt 5.8.0 版本的即可。

如果你直接使用 QT 5.8.0,那么就可以直接使用 MSVC2013_32 的编译套件了,不用进行下面的编译套件的配置,我使用 5.9.4 的原因是编译器 Bug 较少。两个版本的 Qt 我已经为你下载好了,密码:「9vby」,话说 Qt 官网的下载速度还挺快的呢。

1. 配置 MSVC2013_32 bit 的编译套件

我这里直接将 5.8.0 安装路径中的 Qt5.8.0\5.8\msvc_2013 32 bit 编译套件拷贝到 5.9.4 对应的 Qt5.9.4\5.9.4 位置:

msvc2013

然后启动 Qt5.9.4 配置 msvc_2013 为默认的编译套件即可,配置步骤如下:

  • 手动配置 qt 的版本

set_qt_version

  • 拷贝一个已有的 MSVC2013 64bit 编译套件,重新命名为对应的 32 bit,并设置 VC++ 编译器及 CDB 调试器(如果没有设置调试器,会出现感叹号)

code_kit

这样就可以使用 MSVC 2013 编译器来编译 32 位应用程序了,但是前提是你需要先安装 VS 2013,因为我们要使用 VS 2013 的编译器,如果你使用的是 MingW 版本的 QT 则不需要安装 VS 2013。

VS2013 安装包:vs2013密码:「38t8」

2. 配置 CDB 调试器

前面配置编译套件时,如果没有安装 CDB 调试器就会出现感叹号,我们需要安装 CDB 调试器,然后配置到套件上就行了。这是 CDB 的官方下载地址,我选择的是第二种安装方式:

code_kit

下载:

code_kit

默认路径安装,方便 Qt 来自动检测,注意只勾选 Debugging Tools for Windows 模块:

code_kit

配置 Qt,安装成功,启动 Qt,可以看到 Qt 会自动检测 CDB 调试器,如果没有检测到,那你就应该自己选择对应的路径了:

code_kit

大家机器配置都不同,如果遇到问题,还请大家多多 Google 吧,毕竟谷歌就是未来。

下载 OSG

我使用的是 3.4.0 稳定版本,大家去 OSG 的官网下载下面 3 个文件。网速不好的同学,可以从我的网盘下载 OSG-3.4.0,密码:g0f2,都已经为你准备好了。

  1. OSG-3.4.0 源码
  2. OSG-3.4.0 数据
  3. OSG 第三方库(基于 VS2013)

安装 CMake

cmake 官网下载安装 cmake,网速不好的同学,到我网盘下载 cmake密码:「jzu8」。

编译 OSG

网上教程很多,但是写的都有点乱,但是都是对的,编译其实比较简单,主要注意下面 3 点:

  • 尽量编译 32 位的 OSG 库,64 位编译可能会有问题,我一开始编译 64 位总是出错
  • 编译完后别忘记配置 OSG 环境变量
  • 使用 OSG 时提示缺少的库可以到对应平台的第三方库中拷贝
  • 第三方库路径要选择到 include, bin, lib 那一级

下面是我的编译过程,供大家参考参考。

1. 准备工作

  1. 建议将下载的 3 个文件夹都放在同一个文件夹下,例如我都放在 E:\OSG Compiler 文件夹下,并建立一个 osg_bin 目录来存放编译生成的库文件
  2. 在 OSG 的源码目录下建立一个 build 文件夹作为我们生成 vs 工程的目录。
  3. 启动 CMake,并将 osg 源码目录下的 CMakeLists.txt 拖到 CMake 中,然后将 Where to build the binaries 路径选择刚刚新建的 build 目录,如下图:

code_kit

2. 开始配置

上述工作完成后,执行下面的步骤:

  1. 点击 Configure 进行第一次配置,选择 VS2013 的编译器平台,这里选择默认的 x86 平台
  1. 配置编译选项和第三方库的路径,网上很多文章说要修改 CMakeLists.txt,然后这一步勾选 QT 的相关配置,我这样编译过一次,出现很多错误。因此我就没有看网上的博客,而是通过看 OSG 官网的教程来编译的,最后也是可以在 QT 中使用的,所以完全可以按照我的步骤来:

code_kit

  1. 配置安装路径为刚才新建的 osg_bin 目录,使用的默认路径可能会安装失败,因为没有 C 盘的访问权限,所以这一步还是有必要的

code_kit

  1. 点击 Configure 配置项目直到没有红色警告,然后点击 Generate 生成

code_kit

3. 开始编译

使用 VS2013 打开 build 文件夹下的工程,点击:生成 -> 批生成 -> 生成 Debug 和 Release 版本的 All_BUILD 即可,如下图: code_kit

4. 开始安装

右击解决方案的 Install 项目,点击生成,然后 Debug 平台的库文件就开始安装了,同理选择 Release 平台再重复安装。之后就可以在安装路径中看到编译的库文件了,你可以把所有的库文件放到你指定的路径,我放在 E:\OSG\osg_32 下。

5. 配置环境变量

官方建议我们配置下面这 5 个系统环境变量

  1. OSGDIR = E:\OSG\osg_32 路径要改为你的 osg 根目录
  2. OPENSCENEGRAPH_VERSION = 3.4.0 我编译的是 3.4.0 版本
  3. OSG_FILE_PATH = %OSGDIR%\data OSG 数据路径
  4. OSG_NOTIFY_LEVEL = WARN OSG 信息提示级别
  5. PATH 添加:%OSGDIR%\bin;%OSGDIR%\bin\osgPlugins-%OPENSCENEGRAPH_VERSION%; 这两个是配置 bin 和插件的路径。

看着很复杂,但配置其实很简单的,关键是要细心。官网也建议我们这样配置,方便我们切换不同平台的库,后期会有很大方便的。

命令行测试

打开 cmd 命令行,键入:osgversiond,输出当前 osg 版本说明环境变量配置成功了,再来看看能不能导入模型文件,接着键入:

osgviewerd cow.osg

这里可能会提示系统缺少 zlibd.dll,解决方法很简单:

  1. 拷贝第三方库的 dll 目录下的 zlib.dllzlibd.dll 到 OSG 安装目录的 bin 目录中。
  2. 拷贝第三方库的 lib 目录下的 zlib.dllzlibd.dll 到 OSG 安装目录的 lib 目录中。

如果你编译的是 32 位,那么拷贝对应的 x86 目录中的 zlib,如果你编译 64 位,则拷贝 x64 目录下的 zlib,别搞错啦。

这时重新键入上面的命令,就可以看到一头经典的 3D 牛了,恭喜你 OSG 安装成功了,下面在 QT 中调用试试吧。

QT 配置 OSG 库路径

新建一个 QT 的控制台项目,编辑 .pro 文件,加入 OSG 库的绝对路径:

INCLUDEPATH += E:/OSG/osg_32/include

LIBS += -LE:/OSG/osg_32/lib -lOpenThreadsd -losgd -losgDBd -losgUtild -losgGAd -losgViewerd -losgTextd

我把 OSG 库放在 E:OSG/osg_32 文件夹中,你需要改变这个库路径到你的 OSG 位置。

main.cpp 如下:

#include<osgViewer/Viewer>
#include<osgDB/ReadFile>

int main(int argc, char **argv) {
  	osgViewer::Viewer viewer;
  	viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
  	return viewer.run();
}

运行,出来一头 3D 牛,配置成功啦!可以开始你的 OSG 旅途了!

注意

我使用 VS2013 编译器编译出来的 32 bit 的库是可以用在基于 MSVC2013_32 bit 的 QT 中的,你使用 OSG 库的编译器要和你编译 OSG 库的编译器相同,否则可能会出现无法解析函数的问题。

最后

如果你编译安装成功了,那这里可以祝贺你可以开始用 OSG 开发 3D 程序了,没有成功也不要灰心,博主也编译了好多次才成功,最后总结失败的原因写出了这篇文章。因此一定别放弃,遇到问题多多 Google,baidu,问题总会解决的。

当你最后编译成功的时候,你会发现其实也不过如此,挺简单的。但是虽然只是编译一个 OSG 库,却难住了不少人,这个过程也可以锻炼自己的动手能力,所以亲自动手编译一次还是很有必要的。Ok,就写到这里,下次再做分享,拜拜。

欢迎关注我的公众号:「cdeveloper」

cdeveloper at 04/08/18