(2021)Ubuntu环境下OSG的编译、安装与使用(vs code/QT)

本文详细记录了在Ubuntu系统中安装和配置OpenSceneGraph(OGS)的过程,包括从源码编译、数据文件配置、环境变量设置,并在Visual Studio Code(VSCODE)和Qt环境中使用OGS进行三维可视化开发的步骤。在VSCODE中,通过修改tasks.json解决了编译错误,而在Qt中,成功将OGS集成到Qt项目并运行展示了3D模型。
摘要由CSDN通过智能技术生成

前言

最近在做项目,学长推荐使用OSG来做三维可视化开发,我也是第一次接触这个东西,写个博客记录下过程,以免过几天又忘记了。

一、OSG的安装过程

OSG的安装过程主要依据这篇文章,OSG、osgQT编译及配置
其中osgQt的链接我这打不开,暂时也还没用到就没管了。

系统环境:ubuntu

1.1 OSG编译及配置

源代码下载、编译:
源代码:https://github.com/openscenegraph/OpenSceneGraph,如果哪天github上不了了,就去gitee搜索openscenegraph找找看吧。
然后编译,安装。
先进入到OpenSceneGraph-OpenSceneGraph-3.6.5文件夹,新建一个build文件夹,然后在build文件夹下进行编译和安装。
在这里插入图片描述

mkdir build
cd build
cmake -D BUILD_OSG_EXAMPLES=ON ..
make -j8
make install

1.2 数据文件配置

数据文件下载:https://github.com/openscenegraph/OpenSceneGraph-Data
解压存放,例如/home/<用户名>/Documents/OpenSceneGraph-Data

1.3 OSG环境变量配置

sudo gedit /etc/profile

在打开的文件中的最末尾加入以下语句:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
export PATH=$PATH:/usr/local/share/OpenSceneGraph/bin
export OSG_FILE_PATH=/home/<用户名>/Documents/OpenSceneGraph-Data
export OSG_DIR=/usr/local/lib64

其中,具体的路径名称最好,看你make install 之后终端的输出,看看你的这些库是被保存到那个文件夹下了,我的就不一样,我的OSG库就是被保存到了/usr/local/lib
这几条语句的意义分别为:

  • 添加OSG库路径到系统共享库路径
  • OSG的一些可执行文件路径
  • OSG的数据文件路径(根据实际存放位置修改)
  • OSG动态链接库路径

执行source /etc/profile或重启以更新系统环境变量。
至此OSG配置完成。
为了保险一点,我把这几条也写到了home目录下的.bashrc文件中。和上面一样要执行source .bashrc或者重启以更新系统环境变量。

测试

运行如下命令:osgviewer cow.osgt
如果显示下图就成功了:
在这里插入图片描述还可以使用osgversion来查看当前安装的osg版本。
在这里插入图片描述

二、OSG的尝试使用

2.1.在VS CODE中

代码如下(示例):

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main( )
{
    osgViewer::Viewer viewer;
    viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
    return viewer.run();
}

注意:我之前使用sudo apt install openscenegraph尝试装过OSG,所以相当于现在系统里有两份OSG,所以最好先把它remove了,在终端中使用sudo apt remove openscenegraph来把我之前在终端中安装的OSG卸载了。然后编译运行又出现了下面的错误:

X555LB:~/Documents/Code_WorkSpace/Test$ cd "/home/liukai/Documents/Code_WorkSpace/Test/" && g++ my.cpp -o my && "/home/liukai/Documents/Code_WorkSpace/Test/"my
/usr/bin/ld: /tmp/ccZeY6TF.o: in function `main':
my.cpp:(.text+0x2a): undefined reference to `osgViewer::Viewer::Viewer()'
/usr/bin/ld: my.cpp:(.text+0x7a): undefined reference to `osgViewer::Viewer::setSceneData(osg::Node*)'
/usr/bin/ld: my.cpp:(.text+0xa7): undefined reference to `osgViewer::Viewer::run()'
/usr/bin/ld: my.cpp:(.text+0xb9): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: my.cpp:(.text+0x112): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: /tmp/ccZeY6TF.o: in function `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x16): undefined reference to `osgDB::Registry::instance(bool)'
/usr/bin/ld: my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x30): undefined reference to `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, osgDB::Options const*)'
collect2: error: ld returned 1 exit status

在百度上找了几天也没找到个能用的解决方法,最后问了学长怎么办。直接使用-l链接库名 (即**把usr/local/lib下的库文件去掉lib 和.so后加上-l)**把程序中需要用到的链接库放在编译指令的后面。
在终端里执行:可以正确编译生成可执行文件。

g++ my.cpp -I /usr/local/include/ -o my -L /usr/local/lib/ -lOpenThreads -losgDB -losgText -losgUtil -losg -losgViewer -losgGA -losgManipulator -losgVolume -losgSim
./my

输出的结果还是上面那头牛。

然后就可以了,我之前也百度过类似的方案,但是由于我是在VS CODE里修改tasks.json文件实现的,结果没有生效,于是便错过了这个正确答案。
tasks.json:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-I/usr/local/include/",
                “-L/usr/local/lib/”,
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-lOpenThreads",
                "-losgDB",
                "-losgText",
                "-losgUtil",
                "-losg", 
                "-losgViewer",
                "-losgGA",
                "-losgManipulator", 
                "-losgVolume",
                "-losgSim",
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

至于为什么在tasks.json里修改后没有生效,我还在查。


好吧查到了,感觉可能是vs code那个code runner的问题,我之前一直都是点击右上角的code runner三角形来运行代码,结果不知道为啥,我修改了tasks.json对code runner好像不起作用,所以不管我怎么改,点击code runner都是按照下面这样子来编译的,所以当然没用。

/Documents/Code_WorkSpace/Test$ cd "/home/liukai/Documents/Code_WorkSpace/Test/" && g++ my.cpp -o my && "/home/liukai/Documents/Code_WorkSpace/Test/"my

而使用ctrl+F5来运行程序的话,就没问题了,靠,折腾了我几天,我傻啦。但是为什么code runner没对tasks.json的修改没生效,这又是另一个问题了。看了这篇文章后,我直接把code runner卸载了,以后还是老老实实的用ctrl+F5,随便好好学一下json好了。vscode中有task了为什么还需要coderunner?

到这一步,OSG的准备应该就可以了,不过我们的项目是在Qt上开发的,所以后面用Qt来试一下。

2.2 在Qt5.15.2中

1.新建一个Qt Widgets Application项目:
在这里插入图片描述在这里插入图片描述2.添加OSG测试代码:修改main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    osgViewer::Viewer viewer;
    viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
    viewer.run();
    w.show();
    return a.exec();
}

3.添加osg依赖库:
左侧点击项目名,右键选择添加库。在这里插入图片描述
库文件在/usr/local/lib目录下,添加项目中需要的那几个动态链接库如libosgViewer.so,libosgDB.so等等。包含路径:我的选择库文件后就自动选择了/usr/local/include,接着点击下一步到完成就行。它会在.pro中配置相关路径和依赖项。
4.点击运行,这头牛就可以成功出来了!!

在这里插入图片描述

三、总结

到这一步整个OSG的配置就弄好了,下一步就可以参考OSG官网,或者OSG中国上的学习教程来做自己的三维可视化了。

对了,微信关注osg中文社区,就可以领取osg的开发大礼包资料,虽然都挺老的,差不多都有10年的历史了,包含osg的视频教程和各种开发教程文档,不过看他们的动态今年已经开始了最新的osg教程推送,B站已经有几个视频了,我还没来得及看,现在配置好了,终于可以开始起步了。

在这里插入图片描述

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值