前言
最近在做项目,学长推荐使用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站已经有几个视频了,我还没来得及看,现在配置好了,终于可以开始起步了。