最近开始了OSG的学习,开始搭建OSG开发环境,期间遇到了很多问题,也查阅了很多资料,最终搭建成功。OSG本来就是开源的,不应该敝帚自珍,应该多交流多分享,所以在此记录一下环境搭建的过程,方便以后查阅和交流。
OSG3.6.5稳定版下载,下载地址: OpenSceneGraph-3.6.5 release download
下载 OpenSceneGraph-OpenSceneGraph-3.6.5.zip
下载地址: Dependencies
里面有各种版本的第三方依赖库,下载自己需要的就可以了,但是必须和自己的编译器版本保持一致。我下载的是2017版本的 3rdParty_VS2017_v141_x64_V11_full.7z。
下载地址:Data Resources
下载的是 OpenSceneGraph-Data-3.4.0.zip
编译工具选择的是CMake,官网上推荐2.6.x:
直接下载最新版的CMake,下载地址:Download | CMake
下载的是 cmake-3.21.3-windows-x86_64.msi
为了方便编译,在硬盘下建立一个OSG文件夹,然后分别建立如下3个文件夹:
OpenSceneGraph-3.6.5: 用于存放解压后的 OpenSceneGraph-OpenSceneGraph-3.6.5.zip 文件
3rdParty: 用于存放解压后的 3rdParty_VS2017_v141_x64_V11_full.7z 文件
Data: 用于存放解压后的 OpenSceneGraph-Data-3.4.0.zip
build: 用于存放编译后的文件
如下图所示:
安装CMake。默认安装即可。
打开CMake,配置源文件目录和编译后的生成目录,如下所示:
(也可以直接将OpenSceneGraph-3.6.5下的CMakeLists.txt文件直接拖放到CMake界面,然后在重新配置一下build文件目录就可以了)
点击“Configure”按钮,按如下所示进行配置:
点击“Finish”按钮:
修改 ACTUAL_3RDPARTY_DIR 的值为 C:\OSG\3rdParty(前面配置好的3rdParty的目录):
BUILD_OSG_EXAMPLES 打钩:
CMAKE_INSTALL_PREFIX 的值为上面设置的build的路径:
再次点击“Configure”按钮:
还是有红色的选项,BUILD_MFC_EXAMPLE 打钩(切记!!!VS2017一定要安装MFC开发组件!!!)
再次点击“Configure”按钮,此时没有红色选项:
然后点击“Generate”按钮,进行生成。
在build目录()中找到生成的OpenSceneGraph.sln文件,然后使用vs2017打开:
选择生成->批生成:
选择 ALL BUILD 的 Debug 和 Release:
然后点击“生成”,此时会花费比较久的时间(我的机器上大概用了3个小时左右)。如果前面配置的没有错误的话,此时应该不会报错。
在运行过程中提示了以下错误:
经检查,发现是因为我使用的VS2017版本没有安装MFC组件,所以打开vs2017的安装程序,选择安装MFC组件即可,安装方法:
打开vs2017 community的安装程序:
然后点击修改按钮就会开始安装MFC组件:
(20K左右的下载速度,很难受~~)
安装完成之后,又重新ALL_BUILD一下,ALL_BUILD之后出现如下错误:
出现了一大堆的错误,这个时候不要慌,一般这种错误都是因为一个原因,可以看到出现的错误基本上都是在Examples osgviewerMFC工程中,出现问题的文件基本上集中在afxwin.h中,而这个是库文件,一般不会出错。经查,这种问题一般是因为MFC的编译平台的原因。
可以看到该工程的目标编译平台为:
其中的_WIN32_WINNT=Ox0A00,表明目标平台是Win10的,对应关系如下所示:
参考链接:使用 Windows 标头 - Win32 apps | Microsoft Docs
而该工程中定义的目标平台为0x0501(该工程中的stdafx.h头文件下定义的):
0x0501是面向xp系统的,因为我使用的是Win10操作系统,所以需要进行以下修改:
保存,再重新ALL_BUILD一下,就没有报错了。
ALL_BUILD编译完成之后,需要进行INSTALL编译,同样打开生成->批生成,选择INSTALL:
点击“生成”按钮,进行编译生成,这部分会快一些;
添加系统环境变量 OSG_FILE_PATH,值为前面的Data的目录(C:\OSG\Data):
然后在Path变量中添加前面生成目录build目录中的bin目录(C:\OSG\build\bin):
配置完成之后最好重启一下。
在命令行中输入osgversion:
在命令行中输入osglogo:
能够进行拖动,缩放等操作,但是图形渲染的有问题。命令行上打印的信息如下:
参考链接:关于在osgearth 中 出现 arial.ttf : file not handled 的问题 - 尚码园
取消勾选 OSG_TEXT_USE_FONTCONFIG
配置freetype路径:
Configure->Generate,然后重新打开 .sln解决方案,生成->批生成,先ALL_BUILD,然后再 INSTALL。再运行osglogo:
文字能够正常显示了,但是旁边的地球没有显示出来。
有了5.1.1的经验,猜测可能是因为缺少了读取.jpg文件的库,所以需要CMake重新配置一下:
Configure->Generate,然后重新打开 .sln解决方案,生成->批生成,先ALL_BUILD,然后再 INSTALL,再重新运行osglogo显示如下,问题解决:
而且地球也一直在转。
在vs2017中新建C++控制台程序项目,项目属性,选择x64,然后配置头文件目录为build的目录下的include目录,如下所示:
然后配置链接库文件,添加以下链接库:
OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib
(注:在编译生成的lib文件中,每个lib文件有一对名称相似的文件,其中文件名最后一个字母为“d”的为Debug版本所使用的,没有“d”的为Release版本所使用的。)
然后配置链接库的目录(build目录下的lib目录):
在程序文件中编写以下代码:
编译出现以下错误:
经调试发现,main函数中什么语句都不写,只是单纯的包含这两个头文件就会报这些错误,所以应该不是代码的问题,经查,应该是预处理器未定义的原因,需要在预处理器中添加 WIN32:
或者在程序中所有头文件之上添加 #include
编译没问题,运行结果:
(牛~,你终于出来了,喜极而泣)