zoukankan      html  css  js  c++  java
  • OpenSceneGraph环境搭建

    因为3D游戏开发课程需要,最近在看OSG(OpenSceneGraph),根据我个人的理解,它类似于GLUT,是在GL库函数层面之上的开发接口。通过对GL库函数的整合和优化,它提供了比GL库函数更方便使用的功能。尽管它在很多领域都被广泛应用,但是搭建环境的过程却很少能在网上找到合适的教程。在经历了1天的摸索之后,我终于大概通过一篇教程掌握了大致的方法,大致如下:

    1.先到http://www.openscenegraph.org/index.php/download-section/stable-releases(如果失效了自己从首页http://www.openscenegraph.org/里找)下载最新的OSG代码文件

    由于openscenegraph的开源性,任何人都可以参与到它的开发中来,为它添砖加瓦。所以它的源代码都是开放的,下载下来的文件都是未编译过的代码文件。大家都知道,要在自己的程序中应用别人写好的代码要#include,但是我们下载到的是OSG源码(为了方便开源开发,因为不同的IDE会生成不同的工程,比如Visual Studio的.sln,都用源码是最具兼容性的方法),必须先进行编译之后得到相应的.lib,.dll和头文件并在IDE中(我用的VS2013)设置好相应的路径才行。而这个编译过程由于源文件众多,不熟悉源码的人也不知道该编译哪些,而且通过手动添加的方式过于繁琐,所以要用到下面介绍的工具。

    2.再到https://cmake.org/download/(如果失效了自己从首页https://cmake.org/里找)下载最新的CMake(要二进制版本,能直接安装的),这个软件的作用就是按照指定的配置编译指定的源文件。大家下载好的OSG代码文件夹中会发现一个叫CMakeList的.txt文件,这里面就是按照CMake的语言写好的配置文件。在安装完CMake后打开它的图形界面(我下载的版本直接点击图标就好)会看到如下图界面:

    现在,将上面提到的下载好的OSG的文件夹中的CMakeFile.txt拖到这个窗口中,这样的话所有的配置都会按这个txt文件中指定的进行设置,此处唯一需要注意的是目标工程的位置,就是上图“目标地址”的地方,默认会把它设置成与源地址相同的地方,建议改成一个独立的文件夹。

    然后点击“Configure”按照自己的情况设置,不懂得地方基本上默认就行。然后程序就会自己为你配置生成工程所需的信息。

    配置完成后,会在中间有Name和Value的窗口中看到好多的选项,红色的地方代表新添加的需要确认的选项,这些选项对于当前的任务(能运行一个例子)来说都可以不用更改,但是推荐更改CMAKE_INSTALL_PREFIX这项。另外,如果你有添加第三方库的需要,还需要更改ACTUAL_3RDPARTY_DIR这项。(若想添加其他功能如可执行的例子、关联MFC、关联Qt等请参见其他人写的博客)

    CMAKE_INSTALL_PREFIX这项说的是一会编译出的文件放在哪里,默认是c盘,你可以在你喜欢的地方选择一个空的文件夹,这样稍后会省事一些。

     

    ACTUAL_3RDPARTY_DIR这项说的是第三方库的源文件在哪里,注意如果你下载的源文件夹是分为x86和x64两个子文件夹的话,你只需要将此项指定到父文件夹即可。

    然后继续点击“Configure”,直到所有红色都消失(即确认了所有新添加的选项)后,点击“Generate”。

    点击生成。生成之后,CMake会在第一个图里目标地址的位置建立好你之前选择的类型的工程,我的就是.sln,双击用Visual Studio打开工程,如下图所示:

          

    选择Debug模式,先对ALL_BUILD进行编译(Build),然后再对INSTALL进行编译(Build)。然后选择Release模式,重复同样的工作(一定记住Debug和Release都要进行编译,因为Debug和Release生成的文件名称不一样,两个都生成一下保险一点,如果只想要一个那就优先生成Release版本的)。这样就大功告成获得了include文件夹,完整的lib文件夹,完整的bin文件夹。将这三个文件夹拷贝到一个独立的位置保存好,但是这里的include还不完整,你需要把下载的OSG源文件夹中的include文件夹与当前得到的include文件夹合并,这样就获得了完整的OSG套装!(但是如果你之前指定了CMAKE_INSTALL_PREFIX这项的话,在你指定的路径里生成的include,lib,bin好像是完整的)

    这三个文件夹才是OSG的完全体,之前所做的都是为了获得这三个东西。

    3.现在就可以进行编程了。新建一个c++工程,将下面的代码进行编译,观察结果:

    //==========================================================================
    //--------------------------------------------------------------------------
    // Copyright (c) 2012 大气象 All Rights Reserved.
    //
    // File : Main.cpp
    // Author : greatverve@gmain.com
    // Date : 2012-9-19 20:11
    // Version : 1.0v
    //
    // Description : osg hello world.
    //
    //==========================================================================
    #include <osgViewer/Viewer>
    
    #include <osg/Node>
    #include <osg/Geode>
    #include <osg/Group>
    
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
    
    #include <osgUtil/Optimizer>
    
    int main()
    {
        //创建Viewer对象,场景浏览器
        osgViewer::Viewer* viewer = new osgViewer::Viewer();
    
        //创建场景组节点
        osg::Group* root = new osg::Group();
    
        //创建一个节点
        osg::Node* node = new osg::Node();
    
        //读取一个模型
        node = osgDB::readNodeFile("cessna.osg");
    
        //添加到场景
        root->addChild(node);
    
        //优化场景数据
        osgUtil::Optimizer optimizer;
        optimizer.optimize(root);
    
        //设置场景数据
        viewer->setSceneData(root);
    
        //初始化并创建窗口
        viewer->realize();
    
        //开始渲染
        viewer->run();
    
        return 0;
    }

    你会发现编译无法通过,那是因为我们没将上面的三个文件添加到这个工程的包含目录中。而默认的目录中只有stdio.h,iostream等等常用的这些,所以自然无法通过。我们有两种方法解决这个问题,一是将这三个文件夹拷贝到默认目录下,二是将这三个文件夹所在的父文件夹的路径添加到Visual Studio的包含目录中。第一个不推荐,因为默认目录下的东西太多,不方便管理。这里只对第二种方法进行演示:

    右键这个工程,选择属性:

    在弹出的页面中设置include和lib文件夹的位置(bin文件夹只需要和lib文件夹在同一父目录下即可):

    然后还要添加如下附加依赖项(想详细了解请查阅静态链接库的相关资料)

    OpenThreadsd.lib
    osgd.lib
    osgDbd.lib
    osgUtild.lib
    osgGAd.lib
    osgViewerd.lib
    osgTextd.lib

    ---------------------------------------------------------------------------------------

    重大发现和更新!!!

    上面这些.lib的名字一定要敲对,在debug模式下必须用带d的。比如osgd.lib不能写成osg.lib,不然会出现各种错误。不知道在release模式下是不是必须用不带d的。。。

    ---------------------------------------------------------------------------------------

    点击确定完成,再进行编译,就可以运行了。但是场景中什么都没有,但是代码上说应该有一个模型,这是因为这个模型是从一个指定的位置读取来的,但是在这个位置没有这个文件。如果想正确的显示这个场景,需要到官网的Data Resources页面下http://www.openscenegraph.org/index.php/download-section/data下载相对应的模型文件夹。

    下载完成后将其解压拷贝到include、lib、bin文件夹所在的父文件夹下面(即与include、lib、bin并列)然后重命名为data,记住文件夹的名字一定要改成“data”!!!然后大功告成(可以在代码中把模型的名字换成文件夹里有的其他模型看看效果)!

    ---------------------------------------------------------------------------------------

    重大发现和更新!!!

    上面这样的做法是不对的,虽然编译成功后运行时是可以显示出模型的,但是如果直接点击工程目录下Debug文件夹下的.exe文件的话会提示找不到xxxxx.dll,这时需要添加第4步下面的第一个环境变量Path。成功后再点击工程目录下Debug文件夹下的.exe文件能够运行,但是还是不会看到任何模型的。这时候需要在系统或用户的环境变量里指定模型的目录,即第4步下面的第二个环境变量OSG_FILE_PATH,貌似如果设置了环境变量OSG_FILE_PATH的话,模型的目录文件夹名字叫不叫data都无所谓了,而且位置可以随便设置在哪都行。然后再点击工程目录下Debug文件夹下的.exe文件能够运行且模型正确显示。

    但是问题是为什么Debug下编译之后运行可以看到效果,但是直接点击exe却看不到呢?具体的原因我目前也不清楚。

    ---------------------------------------------------------------------------------------

    4.最后,对于那些想用cmd命令行调用osgviewer等程序的同学,你需要在windows环境变量中添加如下项:

    第一个是osgviewer的位置,即在用户变量(系统变量貌似也可以)Path项(如果没有就找找PATH或path)中添加你的bin文件夹的路径,例如D:\OSG\bin;(分号也要带着)

    第二个是模型数据data的位置,即在用户变量(系统变量貌似也可以)中添加一项OSG_FILE_PATH并添加你的data文件夹的路径,例如D:\OSG\data;(分号也要带着)

    这样就完成了。试一试在命令行中敲osgviewer空格cow.osg然后回车,osgviewer会自动加载cow.osg这个模型,和上面的那个程序调试运行是一个效果。

    !如果提示没有osgviewer这个指令,试试换成osgviewerd cow.osg,如果能用就说明你只生成了debug版的文件而没有生成release版的!

  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/ACskyline/p/5244340.html
Copyright © 2011-2022 走看看