OSG编译
准备工作
VS2017(自行下载)
CMAKE(自行下载)
OSG源码(https://github.com/openscenegraph/OpenSceneGraph/tree/OpenSceneGraph-3.6.5)
OSG编译依赖库(https://openscenegraph.github.io/OpenSceneGraphDotComBackup/OpenSceneGraph/www.openscenegraph.com/index.php/download-section/dependencies.html)(选择你VS对应的版本,一般VS高版本会兼容低版本,如果使用VS2022应该可以下载VS2017的)
OSG测试数据(https://openscenegraph.github.io/OpenSceneGraphDotComBackup/OpenSceneGraph/www.openscenegraph.com/index.php/download-section/data.html)
编译的目录

写成类似的目录。3rdParty名称要一直,且OpenSceneGraph-3.6.5下要有最顶层的CMakeLists.txt。
使用CMake构建项目

Where is the source code :这里表示最顶层的CMakeLists.txt的目录。
Where to build the binaries:这里表示项目构建后生成的内容放置的目录。
点击生成“Configure”,CMake会根据编写的CMakeLists.txt来找寻一些头文件静态库(可能初学者不理解,其实就是VS引入头文件和第三方库的流程,只不过VS给你封装了,初学者可能使用VS引入最容易理解,老手使用CMakeLists.txt等来配置第三方库和头文件更方便)。
第一次构建的时候会提示你要你确认创建一个目录,选中你下载的VS,Visual Studio 15 2017,后面的数字才是代表 VS2017,不要选错了,Visual Studio 17 2022表示我VS2022。如果你选择VS2017,默认编译器会选择Win32位数,需要改为x64,现在基本都是x64机构的,你先前下载的依赖也是64位的(这里要统一起来,要使用32就都使用32,要使用64就都使用64)。

构建后大部分的lib会自行找到,如果你的目录和我的第三库保持一致的话。
CMake构建需要注意的地方
部分libCMake不能自己找到
大部分的lib会自己找到,但是有部分lib不会自己找到。比如GDAL_LIBRARY_DEBUG,

选中正确的lib。

需要自己配置的地方

将BUILD_MFC_EXAMPLE勾选,将CMAKE_INSTALL_PREFIX更改为你要生成的项目的目录。
构建项目
点击“Generate”,完成之后,project目录会有很多文件生成,你可以点击“Open Project”或者打开project目录下的“OpenSceneGraph.sln”
生成前需要注意的地方
右键“Example osgviewerMFC”项目,查看C/C++的预处理器,查看预处理器定义。

这里可以看到系统是0x0A00,这是代表win10系统。有一个地方需要修改。
找到该项目下的stdafx.h文件改成下面两行。
17 #define WINVER 0x0A0
22 #define _WIN32_WINNT 0x0A00
复制部分lib
把目录D:\33_VS2017\IDE\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64(这是我的目录,你的目录得自己找)。把mfc140.lib mfc140d.lib mfc140u.lib mfc140ud.lib四个库复制到编译OSG的工程文件lib目录(D:\37_OSG\project\lib)下面。
批生成项目
打开VS2017后,查看一下是否为x64的。

生成项目:使用批生成的方式。


选择完毕后,点击生成。
这里要经过很久很久。
很久之后,编译完了。可能错误,我出现了某些找不到*.lib的错误,查询报错发现是某个使用std::max没有包含对应的头文件。
添加对应的头文件 #include
选择你需要运行的项目,右键设置为启动项目。我选择的是“Examples osgpointsprite”(公司项目这个)

然后运行就可以得到例子的运行结果。

代码层面的就编译完成。
将D:\37_OSG\project\bin添加换环境变量,这个是为了使用cmd命令时,可以正确找到exe目录(这个一般我不添加,因为环境变量添加的多,以后有什么问题不好排查,你可以进行在D:\37_OSG\project\bin进入cmd命令直接运行也是一样的)。
将库移动到正确的位置(环境变量扫盲)
1,将D:\37_OSG\3rdParty\bin目录下所有的动态链接库(*.dll)复制到D:\37_OSG\project\bin中,其实这步的目的就是把exe需要的dll放到与exe同目录下。这样是为了exe能够找到dll。
说个题外话,为什么我不喜欢添加环境变量。因为环境变量可能会被滥用。为什么你有时候写的程序可以在自己的电脑上面运行起来,在其他电脑就运行不起来。exe会找它所需要的dll,首先在同目录下面找,找不到会去系统的环境变量的目录去找,而且是按照配置的环境变量从上到下,找到了就不找了。这里包找到,不包找对。所以,举个例子,你之前用的Qt是5.13.2,并且把bin的目录都放在自己的电脑环境变量下去。并且认认真真开发了很久之后。公司业务发生调整,你现在要使用Qt5.15.2你又把bin目录放置在环境目录下,这是5.15.2的目录下5.13.2的目录的下面。你在VS配置了Qt的版本是5.15.2,写个程序发现可能就跑不起来,可能报错动态库的错误。这是因为找到5.13.2的动态库,但是你链接的lib是5.13.2的。所以你要么把环境5.15.2的目录放在5.13.2目录的前面在环境变量的配置中。最好不要那么做,因为你后面可能又要用到5.13.2的。所以最好的情况是把5.15.2的dll找到并放到exe目录下,这样才会链接正确的DLL,并且打包的时候也方便。所以建议几乎不要设置环境变量,除了个别之外。
2,将D:\37_OSG\project\lib的所有静态链接库(*.lib)复制到D:\37_OSG\project\lib中。这步是为了编译通过。
3,将D:\37_OSG\3rdParty\include的所有内容复制到D:\37_OSG\project\include中,这也是为了编译的时候能够找到头文件。
控制窗口大小
OSG的程序默认窗口最大化,按Esc退出。在学习代码和调试时不方便,测试Example时尽量将该Example的代码进行修改。将
osgViewer::Viewer viewer;
在给它传数据之后
viewer.setSceneData(node);
添加一行代码设置窗口的位置和大小。把查看器的大小设置一下。
viewer.setUpViewInWindow(100, 100, 800, 600);
如何使用OSG自带的测试数据
osg代码直接根据名称来获取数据:
if (!loadedModel) loadedModel = osgDB::readRefNodeFile("cow.osgt");
有些人就不明白了,这个数据在哪里?我明明运行得到正确的结果。其实很简单,readRefNodeFile中读取文件的时候会在系统变量中找一个名称为“OSG_FILE_PATH”的系统变量,而设置这个变量值就是你下载的OSG的测试数据。

你要环境变量设置为这一层程序才能找的到。

这样你所有的OSG的测试数据都可以用上了。
4万+

被折叠的 条评论
为什么被折叠?



