admin管理员组

文章数量:1546228

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

OSG 3.7.0 + osgEarth 3.6.0安装全流程

  • 一、前言
  • 二、安装OSG
    • 1. 什么是OSG
    • 2.安装环境
    • 3.直接安装(不推荐)
    • 4.源码编译
  • 三、安装osgEarth
    • 1.什么是osgEarth
    • 2.安装环境
    • 3.源码安装
  • 四.配置资源文件
    • 1.下载OSG模型
    • 2.配置环境变量
  • 五.安装过程中可能出现的问题及对应解决方案
    • 1.在运行osg相关程序,比如osgversion时,会出现找不到动态库的问题
    • 2.osgEarth在cmake过程中显示报错
    • 3.使用osgviewer显示cow.osg模型,发现牛身一片漆黑,终端还会报以下错误

一、前言

笔者曾经在Ubuntu16.04系统中尝试安装OpenSceneGraph(OSG)和osgEarth,但是该系统版本过低,难以支持高版本的OSG和osgEarth,但又因为当时该系统有着比较重要的东西,所以笔者不能重装系统,只能含泪尝试在Ubuntu16.04系统下安装这两个库。在经历了一系列的升级、重装、删除工作之后,中间趟过了无数的坑,终于在Ubuntu16.04系统下成功安装了这两个库,关于安装过程中遇到的一系列问题和对应的解决方法我都记录在了另外一篇文章中Ubuntu16.04系统下安装osg3.7+osgearth3.3。
今年因为工作上的原因,不得不舍弃Ubuntu16.04系统,当笔者尝试在Ubuntu 20.04系统中恢复系统环境时,笔者感受到了前所未有的畅快,在高版本的Ubuntu下安装这两个库可比在之前那个系统安装要轻松多了。笔者总结了此次安装的经历,将遇到的问题以及解决方法记录下来,写出了这篇文章。各位读者可以结合这篇文章和上一篇文章安装OSG和osgEarth,如果这两篇文章对各位有所帮助的话,麻烦各位记得点赞、收藏加关注哦。

二、安装OSG

1. 什么是OSG

OSG是一个完全开源的三维实时场景图开发引擎,被广泛应用在可视化(飞行、船舶、车辆、工艺等仿真)、增强现实以及医药、教育、游戏等领域。
OSG可以支持几乎所有的操作系统平台,它使用OpenGL ES使得可以支持手持台、平板以及其它嵌入式设备,使用OpenGL使得其可以在所有的家用电脑以及中型大型机和集群上进行工作,无论是Windows系统,还是Linux系统,甚至是Mac系统都能够在本地部署OSG环境。
OSG是由C++语言编写而成,在github中有着许多前辈们分享的开源代码,使用者可以直接从github上下载对应版本的OpenSceneGraph源码,然后在本地环境下通过源码编译的方式配置OSG相关库。
OSG官方论坛对OSG的相关功能、技术路线有着详细的介绍,此外,它还提供了OSG的相关使用教程以及一些基于OSG的相关素材,用户可根据自身需要在该论坛中下载相关资源,学习教程,反馈意见,与大佬交流等等。
此外,中国本地也有一个OSG官方论坛,在这个论坛中,除了OSG教程和相关资源外,用户还可以在论坛上与其他使用OSG的前辈交流,向那些专业人士请教,王锐大佬也会在这个网站中不定时发布某些技术分享交流活动,恒歌科技公司也会在其中发布某些基于OSG开发的新产品。

2.安装环境

Ubuntu 20.04.6 Desktop
OpenSceneGraph 3.7.0
cmake 3.16

3.直接安装(不推荐)

在终端输入

sudo apt-get install openscenegraph

一般这种方法可以直接成功安装OpenSceneGraph3.7,但是考虑到接下来的osgearth的安装需要更改OpenScenegGraph安装包内cmake文件中opengl的模式,以及在反复的安装过程中可能需要多次安装或者卸载OpenSceneGraph,所以在此建议各位想要安装osgearth3.x版本的同胞,绝对不要为了图省事直接安装OpenSceneGraph,最好采用源码编译的方式进行安装。

4.源码编译

从github上下载Osg源码

cd
mkdir packages && cd packages
mkdir Osg && cd Osg
git clone https://github/openscenegraph/OpenSceneGraph.git //在github中下载openscenegraph安装包
cd OpenSceneGraph

在OpenSceneGraph文件夹下我们打开CMakeLists.txt文件,搜索关键词OPENGL_PROFILE,寻找到 SET(OPENGL_PROFILE “GL3” CACHE STRING “OpenGL Profile to use, choose from GL1, GL2, GL3, GLES1, GLES2, GLES3”) 这一行代码,标记内容原本为GL2或其他的选项,但是在这里一律将标记内容修改为GL3,运行以下命令进行安装。

mkdir build && cd build 
cmake ../
make -j8
sudo make install

编译时间可能会比较长,需要耐心等待。确认一切安装成功后,尝试在终端输入以下命令

osgversion

如果安装成功的话,会出现以下内容

OpenSceneGraph Library 3.7.0

如果安装失败,出现了类似于以下的问题

osgversion: error while loading shared libraries: libosg.so.202: cannot open shared object file: No such file or directory

可以跳转到本篇文章末尾,那里记录了如何解决这个问题。

三、安装osgEarth

1.什么是osgEarth

osgEarth可以理解为是基于OpenSceneGraph开发的一套结合了地理信息系统的工具插件, 我们可以将它与OSG相结合,创建出一个类似于Google Earth的虚拟三维地球。

2.安装环境

Ubuntu 20.04.6 Desktop
osgEarth 3.6.0
cmake 3.23.5

3.源码安装

从github上下载osgEarth源码,具体指令如下

cd ~/packages/Osg
git clone https://github/gwaldron/osgearth.git //在github中下载osgearth安装包

Ubuntu 20.04 系统初始cmake版本为3.16,为了编译osgEarth,需要将cmake版本提升到3.20以上,为此,笔者参考了Ubuntu 20.04 上安装 CMake 3.20 的详细步骤这篇博客的内容,将cmake版本提升到了3.23.5。具体命令如下所示

//下载cmake软件包
cd ~/packages
mkdir CMAKE && cd CMAKE
wget https://cmake/files/v3.23/cmake-3.23.5.tar.gz //下载cmake软件包
tar -zxvf cmake-3.23.5.tar.gz //解压缩
//编译cmake
cd cmake-3.23.5
./configure
make -j8 //可根据电脑cpu核数自行分配编译时的算力
sudo make install
//测试
cmake --version

如果最终显示cmake版本与下载的cmake源码相吻合,证明此时cmake已经安装成功,可着手进行osgEarth编译任务。

cd ~/packages/Osg/osgearth
mkdir build && cd build 
cmake ../
make -j8
sudo make install

如果安装成功的话,终端输入以下指令

osgearth_version

此时终端应该会显现出osgEarth当前安装版本:osgEarth 3.6.0 build 159

四.配置资源文件

1.下载OSG模型

如果想要一部分OpenSceneGraph模型资源的话可以去OpenSceneGraph官网,去那里下载资源包OpenSceneGraph-Data-3.4.0.zip,这里面包含了许多模型文件(cow.osg)。
将下载好的资源包存储到 ~/packages/Osg/resources文件夹,
解压缩并提取到当前文件夹下。

2.配置环境变量

输入以下指令,

# 导入OSG环境变量
echo "OSG_FILE_PATH=~/packages/Osg/resources/OpenSceneGraph-Data:~/packages/Osg/osgearth/data:~/packages/Osg/osgearth/tests" >> ~/.bashrc
# 立即刷新终端当前的环境
source ~/.bashrc

此时运行命令测试环境变量是否配置成功

# 测试OSG资源包
osgviewer cow.osg
# 测试osgEarth
osgearth_viewer simple.earth

如果测试成功的话,你就能够依次看到一个牛的模型和一个简单的三维地球模型。

五.安装过程中可能出现的问题及对应解决方案

1.在运行osg相关程序,比如osgversion时,会出现找不到动态库的问题

osgversion: error while loading shared libraries: libosg.so.202: cannot open shared object file: No such file or directory

首先可以先在电脑中搜索对应的文件,例如 libosg.so.202,如果在电脑中没有该文件那就重新安装OpenSceneGraph;
而如果电脑确实成功安装了这个动态库文件,但是OSG在执行应用程序的过程中无法检索到该动态库进行链接,就需要将动态库文件所在路径添加到/etc/ld.so.conf文件中。

include /etc/ld.so.conf.d/*.conf
/usr/local/lib64
/usr/local/lib
/usr/local/lib/x86_64-linux-gnu

以上是我的ld.so.conf文件的内容,除了第一行是系统默认路径之外,剩下的三行都是我们需要手动添加的路径。因为安装过程中会使用OSG默认安装路径,所以一般会新建一个文件夹usr/local来存储编译出来的文件,为了让系统能够成功找到OSG的相关库文件,我们需要将.so文件对应路径添加到ld.so.conf文件中,当然,因为环境不同,你们电脑中对应路径可能与我的有所不同。
如果不想直接在/etc/ld.so.conf文件中加入OSG库安装路径,也可以采取如下指令,在 /etc/ld.so.conf.d文件夹下新建一个OSG环境配置文件。

sudo gedit /etc/ld.so.conf.d/osg.conf

然后再这个空白文本中输入OSG动态库相关路径

/usr/local/lib64
/usr/local/lib
/usr/local/lib/x86_64-linux-gnu

保存并退出之后,在终端输入命令 sudo ldconfig,此时,该问题应当已经解决。
如果在完成上述操作之后,仍旧会出现相同的错误,那么可能是因为以前安装了不同版本的OpenSceneGraph,又没有卸载干净,所以为了解决这个问题,建议各位将电脑中有关OSG的编译文件全部删除,切记要手动删除,不要用类似autoremove之类的命令,仅仅删除那些.so文件就好。
可以参考文章http://blog.chinaunix/uid-22166872-id-4243708.html

2.osgEarth在cmake过程中显示报错

CMake Error at CMakeLists.txt:120 (message):
  git submodule update --init --recursive failed with 1, please checkout
  submodules

这个问题之所以会出现,是因为osgEarth在cmake过程中,需要下载一部分的配置资源,但因为网络问题,部分网站无法访问,资源下载失败。解决这个问题最好的方法就是用梯子,如果没有梯子的话,就只能重复cmake指令或者运行指令git submodule update --init --recursive,祈祷能够通过不稳定的网络下载资源。

3.使用osgviewer显示cow.osg模型,发现牛身一片漆黑,终端还会报以下错误

Warning: Material::apply(State&) - not supported.
Warning: detected OpenGL error 'invalid enumerant' at after RenderBin::draw(..)

就我个人建议,习惯就好,会出现这样问题的原因是因为opengl_profile采用了GL3模式,但是开发人员很明显没有考虑到更换模式之后那些例子(osgviewer)也没法用,所以没有对应的处理代码,不过其中一部分问题还是可以解决的。

在模式切换为GL3之后,就没有办法使用渲染管线的方法处理,就必须使用shader编译着色器,关于glsl(opengl shader language)的具体语法可以去opengl官网进行学习,不过在osg的应用部分可能会在我的后续文章中出现,在这里不过多赘述。总之,在多次的实验中可以确认,这个牛之所以是黑色的,与它的底层代码有关,无论怎么修改shader,只要它有关纹理的底层代码不变,就无法让牛变成彩色。

而关于 Material::apply的警告完全是因为使用了material的类,而在GL3模式下Material类的代码基本上已经退环境了,勉强还可以用,但是还有像上面一样的警告,而cow.osg模型中依旧使用了material类,所以想要解决这个问题,要么重新读取cow,osg数据,再自行编辑shader,重新创造一个模型,要么直接去底层源码material.cpp中注释掉警告代码,再重新编译安装。

而这个警告信息 detected OpenGL error ‘invalid enumerant’ at after RenderBin::draw(…) 是唯一能够完美解决的问题,可以在OpenSceneGraph/examples/osgsimplegl3.cpp中找到解决问题的代码,

const std::string version( "3.0" );\\3.1也可以,其他不行
traits->glContextVersion = version;

本文标签: 系统OSGosgEarth