搜档网
当前位置:搜档网 › 学习OpenSceneGraph(OSG)的旅程

学习OpenSceneGraph(OSG)的旅程

欢迎开始学习OpenSceneGraph(OSG)的旅程。通过本章,读者将了解到OSG的历史、发展和组成模块,并将学习如何获取、安装及编译OSG。本章将对本书中使用的一些规范加以说明,还会讲解如何使用OSG的常用工具以及如何设置开发环境。
1.1 OpenSceneGraph简介
1.1.1 什么是OpenSceneGraph
OSG是一个开源的场景图形管理开发库,主要为图形图像应用程序的开发提供场景管理和图形渲染优化功能。它使用可移植的ANSI C++编写,并使用已成为工业标准的OpenGL底层渲染API。因此,OSG具备跨平台性,可以运行在Windows、Mac OS X和大多数类型的UNIX和Linux操作系统上。在OSG中,大部分的操作可以独立于本地GUI,但是OSG也包含了针对某些视窗系统特有功能的支持代码,这主要是源于OpenGL本身的特性。
OSG是公开源代码的,它的用户许可方式为修改过的GNU宽通用公共许可证(GNU Lesser General Public License,LGPL)。
1.1.2 OpenSceneGraph的历史和发展
早在1997年,Don Burns便作为软件设计顾问受雇于Silicon Graphics(SGI),他在业余时间还喜欢滑翔运动。正因为对计算机图形和滑翔机同样的热衷及对尖端渲染设备的了解,他使用Performer场景图形(SGI专有)系统设计了一套基于SGI Onyx的滑翔仿真软件。
由于受到其他滑翔爱好者的鼓励,Don开始尝试使用Linux上的Mesa3D和3dfx 的Voodoo设备,以开发基于更多硬件平台的仿真软件。当这套软件开始支持OpenGL时,场景图形的概念还未能应用于Linux。为了填补这一空缺,Don开始编写一套简单的、类似于Performer的场景图形系统,名为SG。SG的开发强调朴素且易用,它满足了当时人们对于场景图形系统的需求,也使Don的滑翔仿真软件能够运行于低成本的Linux系统。
到了1998年,Don在滑翔爱好者的邮件组中遇到了Robert Osfield。那时Robert在Midland Valley Exploration工作,那是一个来自苏格兰格拉斯哥的油气公司。Robert同样对计算机图形学和可视化技术有着浓厚的兴趣。两人开始合作,对仿真软件进行改善。Robert 倡导开源,并提议将SG作为独立的开源场景图形项目继续开发,并由自己担任项目主导。项目的名称改为OpenSceneGraph,当时共有9人加入了OSG的用户邮件列表。
2000年底,Brede Johansen为OpenSceneGraph作出了第一份贡献,即添加了OSG的OpenFlight模块。当时他在挪威孔斯贝格的Kongsberg Maritime船舶仿真公司工作,该公司后来设计了基于OSG的SeaView R5视觉系统。
同样在2000年,Robert离开了原来的工作单位,作为OpenSceneGraph的专业服务商开始全职进行OSG的开发工作。在这段时间,他设计并实现了今天的OSG所使用的许多核心功能,并且是在完全没有客户和薪酬的情况下完成的。Don到了

Keyhole数字地图公司(现在是Google的Google Earth部门),于2001年辞职,他也组建了自己的公司——Andes ComputerEngineering,位于加利福尼亚州的圣何塞,公司成立后继续进行OSG的开发工作。第一届OpenSceneGraph“同好”会在SIGGRAPH 2001举行,只有12个人参加,听众包括了来自Magic Earth的代表,其目的是寻求一个开源的场景图形库来支持油气相关软件的开发。他们与Don和Robert讨论了开发的事宜,并成为了OSG的第一个收费用户[1]。
随着这几年开源的不断发展,OSG的模块和第三方附加库不断完善,OSG已具备对高性能渲染、海量地形数据库、地理信息及多通道等的支持。
1.1.3 OSG中国
于2008年初成立的OsgChina——OSG中国官方网(https://www.sodocs.net/doc/be6356488.html,),作为国内目前最大的专注于OpenSceneGraph(OSG)发展和研究的网站和论坛,以及OSG英文官方站点(https://www.sodocs.net/doc/be6356488.html,)的唯一中文镜像站,一直致力于为国内OSG爱好者和开发者们提供一个交流和相互学习的无障碍平台,并且不断地收集、整理、归纳、创新,形成了愈加完备的OSG学习者资源集散中心,有数以千计的注册会员作为坚实后盾。
OsgChina日常工作人员由国内资深开发者FreeSouth、FlySky、array和Hesicong等组成,他们为OSG在中国发展提供强大的技术支持。同时,OsgChina将举办定期或不定期的OSG相关会议和研讨活动,邀请国内外的开发者和企业代表参加,与会者可以在会上展出自己的作品,宣传自己的品牌和理念。OsgChina还向与会者提供工作和进修机会,并开展各种专题讲座和学习会活动。
如果读者在学习的过程中有很多疑问,欢迎注册OSG中国官方讨论社区(https://www.sodocs.net/doc/be6356488.html,)发帖提问,共同提高。
1.1.4 OSG组成模块
通过前面的介绍已经了解,OpenSceneGraph及其扩展位于系统的API一级,即系统的底层绘图硬件和相应的软件驱动程序之上封装了OpenGL,并对其余的底层图形显示方式予以支持,利用OpenSceneGraph可以轻松地开发其上层的应用程序。OSG层次结构图如图1-1所示。
在进一步学习OSG之前,有必要学习OSG的组成模块,从而有利于从总体上把握学习OSG及应用OSG开发的方向。
OSG主要包括4个库,下面分别进行介绍。
(1)OSG核心库(Core Library)
核心库是OSG的核心,也是其存在且不断得到发展的根本原因。它的主要功能就是实现最核心的场景数据库的组织和管理、对场景图形的操作以及为外部数据库的导入提供接口等。它主要包括以下4个库。
? osg库:基本数据类,负责提供基本场景图类,构建场景图形节点,如节点类、状态类、绘制类、向量和矩阵数学计算以及一般的数据类。同时,它包含一些程序所需要的特定

功能类,如命令行解析和错误调试信息等。
? osgUtil库:工具类库,提供通用的公用类,用于操作场景图形及内容,如更新、裁减、遍历、数据统计及场景图的一些优化。
? osgDB库:数据的读写库,负责提供场景中数据的读写工作,提供了一个文件工具类。注意,OSG中场景图管理是通过遍历场景图层次结构来完成大部分的数据处理工作的。
? osgViewer库:是在OSG 2.0后逐步发展稳定的一个视窗管理库,可以集中各种窗体系统,提供OSG与各种GUI的结合。因此,它是跨平台的3D管理窗口库。
(2)OSG工具库(NodeKit)
OSG工具库主要是对OSG核心库中osg库的扩充,是对OSG核心库的一个补充,它实现了一些特定的功能。它主要包括以下6个库。
? osgFX库:特殊效果节点工具,用于渲染特效节点,包括异性光照特效(osgFX::Anisotropic Lighting)、凹凸贴图特效(osgFX::BumpMapping)、卡通渲染特效(osgFX::Cartoon)、刻线特效(osgFX::Scribe)和立方图镜面高光特效(osgFX::SpecularHighlights)等。
? osgParticle库:粒子系统的节点工具,用于模拟各种天气或者自然现象效果,如雨效、雪效和爆炸模拟等。
? osgSim库:虚拟仿真效果的节点工具,用于特殊渲染,如地形高程图、光点节点和DOF变换节点等。
? osgTerrain库:生成地形数据的节点工具,用于渲染高程数据,如TIF、IMAGE和DEM等各种高程数据格式。注意,OSG通过一个开源库GDAL读取这些高程数据。
? osgText库:文字节点工具,用于向场景中添加文字信息,它完全支持TrueType字体。
? osgShadow库:阴影节点工具,用于向场景中添加实时阴影,提高场景渲染的真实性。
(3)OSG插件库
OSG插件库是OSG的一个非常重要的特点。通过各种第三方库的支持,OSG能够直接或间接地导入3D模型或图片等场景数据,可以省去大量绘制图形的工作,从而极大地方便了开发者。具体支持的各种数据格式可参见第5章。
(4)OSG内省库(osgIntrospection)
OSG内省库提供了一个与语言无关的运行程序接口,确保了OSG可以在更多的环境下运行。osgIntrospection库允许软件系统使用反射式和自省式的编程范例与OSG交互。应用程序和软件可以使用osgIntrospection库和方法迭代OSG的类型、枚举量和方法,并且不需要了解OSG 编译和链接时的过程,即可调用这些方法。Smalltalk和Objective-C等语言包括了内建的反射式和自省式支持,但是C++的开发者通常无法运用这些特性,因为C++并未保留必要的元数(metadata)。为了弥补C++的这一不足,OSG提供了一系列自动生成的、从OSG源代码创建的封装库。用户程序不需要与OSG的封装直接交互,它们将由osgIntrospection整体进行管理。由于osgIntrospec

tion及其封装的结果,许多的语言,如Java、TCL、Lua和Python,都可以与OSG进行交互。
综上所述,OSG的组成模块如图1-2所示。

图1-2 OSG组成模块图

1.2 开发的预备知识
本书为准备学习,并使用OSG进行程序开发的开发者编写。本书主要介绍实用OSG函数及其应用,在阅读此书前,读者应该有一定的C++开发经验。OSG是一个C++的API库,同时也是对OpenGL的底层封装,所以读者还需先了解OpenGL的渲染流程。
OSG对于标准模板库(STL)的运用十分广泛,因此,读者在阅读本书前应当对STL容器,特别是列表(list)、向量组(vector)和映射(map)有较深的理解。如果读者对于设计模式(design patterns)也有一定的认识和理解,将对OSG的学习大有裨益,不过并非是必要的。
在学习使用OSG编程之前,读者有必要首先熟悉3D图形学。对于本书而言,读者需要熟悉OpenGL编程接口,而OpenGL是标准的跨平台底层3D图形API函数库。对于3D图形学,希望读者能够理解对不同类型的坐标空间熟练应用笛卡儿三维坐标系来表示三维几何数据。同时,读者需要了解一些基本的图形术语概念,不过并不需要对底层图形硬件的实现有很深入的认识和理解。
读者最好还要具备一定的线性代数知识,熟悉采用向量表示三维坐标的方法以及渲染过程中采用矩阵变换进行图形系统的相关操作,因此,还有必要了解矩阵运算的有关知识。
每个人的编程风格都是不一样的,下面简单介绍一下本书中的一些编程规范。
1.命名规范
本书使用标准的C++命名规则,编写一个子模块或派生类时,遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的统一性。标识符采用英文单词或其组合,直观且可以拼读,望文知意。
2.编程风格
OSG中提供的智能指针可以方便管理内存,防止内存的泄露。但建议初学时不要写成指针的方式,以避免不必要的错误或异常发生。例如:

osg::Geode* geode = new osg::Geode(); //指针的写法
osg::ref_ptr geode = new osg::Geode(); //建议读者的写法

当然,如果读者是熟练的C++开发人员,可以根据自己的爱好选择。注意,在一个大型系统的开发过程中,使用指针或不使用应当统一,以避免带来不必要的麻烦。
笔者还喜欢对头文件进行分类处理,以方便对头文件进行管理及操作。例如:

#include
#include
#include

#include
#include

这种写法不是固定的,只是个人偏好,但这种写法将程序开发用到的库放在一起,可以做到一目了然,不容易造成混乱。读者可以根据自己的编程风格自由选择。

1.3 OSG的安装及编译
接下

来读者将正式开始接触并使用OSG。下面首先向读者介绍一些OSG安装及编译的一些知识,这些也是开源引擎使用的一些基本技法。在以后的开发过程中,读者可能会用到很多其他的基于OSG开发的开源引擎,这些基本技法可以帮助读者学习、提高,同时,它将贯彻读者学习的整个过程。
1.3.1 OSG的获取及安装
OpenSceneGraph源代码的获取方式比较简单,只需要读者打开IE浏览器,在地址栏输入“http:// https://www.sodocs.net/doc/be6356488.html,”,然后单击Downloads下的Current Release(最新稳定版本)或者Developer Releases(开发版)超链接,在打开的网页中单击相应的超链接进行下载即可。如果读者机器上没有浏览器或者读者懒得上网找的话,需要下载一个签出源文件的工具tortoisewin32svn.exe,正确且完全安装以后,新建一个空的文件夹,右击,在弹出的快捷菜单中选择SVN CheckOut命令(这样签出的源代码可以保持随时更新),打开Checkout对话框,如图1-3所示,在URL of repository下拉列表框中输入SVN地址“https://www.sodocs.net/doc/be6356488.html,/svn/osg/OpenSceneGraph/tags/OpenSceneGraph-2.7.4”,然后单击OK按钮,读者将立刻得到OSG的最新源文件。

图1-3 SVN源码签出
获取了源代码以后,还有一项非常艰巨的工程,即编译OSG。对于OSG初学者来说,编译OSG是一件比较痛苦的事情,但当学习完1.3.2节的内容后,读者会觉得编译OSG是一件非常有趣且有挑战性的任务。
OSG的安装比较简单。OSG中国官方网站(https://www.sodocs.net/doc/be6356488.html,)会在官方发布最新的OSG稳定版本后第一时间制作一个安装包,该安装包包含OSG常用的插件库(基于VS2005SP1或者VS2008,详细的信息见安装包说明)。OSG 2.2以前的安装包都由flmn制作,OSG 2.3x系列的安装包由FreeSouth制作,OSG 2.4系列以后的安装包由笔者制作并发布。读者可登录OSG中国官方讨论区(https://www.sodocs.net/doc/be6356488.html,)下载OSG安装包。
在论坛可以下载以往所有的安装包,下载完毕后,读者可以直接进行安装,安装完毕后,在cmd中输入如下命令:

osgVersion //显示当前版本信息
OpenSceneGraph Library 2.6.0 //输出信息

然后输入“osglogo”,会出现如图1-4所示的渲染效果,即表示安装成功。

图1-4 osglogo运行截图
1.3.2 编译OSG
编译OSG确实是一件非常繁琐的工作,所以,读者需要静下心,耐心地一步一步慢慢来。作为一个OSG开发者,编译OSG也是“家常便饭”。
编译OSG需要使用第1.3.1节中获取的源码,同时需要使用一个新工具——CMake。CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),它能够输出各种格式的makefile或者project文件,能测试编译器所支持的C++特性

,类似UNIX下的auotconf(这里介绍这么多就足够了,如果想了解更多,请到百度搜索学习)。读者还需要下载一些插件库,如果读者使用的是VS2005SP1,官方提供了编译好的插件库;如果不是的话,不幸地告诉读者,您还得从网上把插件一个一个下载下来,慢慢编译。下面讲解直接使用官方的插件库编译OSG的方法,具体操作步骤如下:
(1)解压源文件,其中有一个CMakeLists.txt文件,如图1-5所示。
(2) 打开CMake,把CMakeLists.txt文件拖到CMake中,会出现如图1-6所示的界面。单击Configure按钮,选择开发环境,它会搜索、检测出当前读者的开发环境。

图1-5 源文件 图1-6 选择开发环境
(3)待CMake自动配置完成后,出现如图1-7所示的配置选项设置窗口。
(4)手动来配置。需要的手动配置的选项有下面3项。
? 第三方插件库ACTUAL_3DPARTY_DIR,选择相应的目录即可,如图1-8所示。

图1-7 配置选项设置 图1-8 选择第三方库目录
? 编译OSG的例子,BUILD_OSG_EXAMPLES由OFF设置成ON,如图1-9所示。
? 一些插件的头文件,如字体的fbuild2.h,可能在编译时找不到头文件,因此需要手动指定。待配置完成以后,单击Configure按钮,看到不再有红色的选项后,单击OK按钮,如图1-10所示。CMake的配置告一段落,随即出现C++解决方案。

图1-9 选择例子编译 图1-10 正确配置各种选项
图1-10中各个选项的具体含义如表1-1所示。
表1-1 图1-10中各个选项的含义
选 项 含 义
ACTUAL_3DPARTY_DIR 指向第三方依赖库的目录,注意有个默认值,但一般是不正确的,要根据自己的实际情况指定,而且必须指定
BUILD_OSG_APPLICATIONS 是否编译OSG的可执行文件,里面包含了4个极其重要的程序,分别是osgarchive、osgconv、osgversion和osgviewer,在后面会讲解它们的使用方法
BUILD_OSG_EXAMPLES 是否编译OSG的默认例子,一定要选择ON,因为例子很重要
BUILD_OSG_PLUGINS 是否编译OSG的插件,要选择ON
BUILD_OSG_WRAPPERS 是否编译OSG的内省库
续表
选 项 含 义
CMAKE_BACKWARDS_COMPATIBILITY CMAKE的版本信息
CMAKE_INCLUDE_PATH 包含文件目录,可以不指定,编译完成后复制
CMAKE_INSTALL_PREFIX 安装目录,默认为C:\Programs Files\OpenSceneGraph\
CMAKE_LIBRARY_PATH 库文件目录,可以不指定,编译完成后复制
CMAKE_PREFIX_PATH 当前目录,可以不指定
COLLADA_INCLUDE_DIR Collada库的包含目录,没有安装Collada可以不指定,后面类同
COLLADA_LIBRARY Collada库的库目录,不需要可以不指定
DYNAMIC_OPENSCENEGRAPH 默认开启
DYNAMIC_OPENTHREADS 默认开启
EXECUTABLE_OUTPUT_PATH 可执行文

件输出目录,可以默认为空,会放在bin下
FLTK_GL_LIBRARY FLTK的GL库,可以不指定
FLTK_INCLUDE_DIR FLTK的头文件目录
FLTK_LIBRARY FLTK的库文件,可以不指定
FREETYPE_INCLUDE_DIR_freetype2 如果第三方依赖找到正确,则此目录会有找到信息,否则重新配置第三方依赖,这是字体库,必需
FREETYPE_INCLUDE_DIR_ft2build FREETYPE的包含目录中的ft2build目录
FREETYPE_LIBRARY FREETYPE的库目录
GDAL_INCLUDE_DIR GDAL的包含文件目录
GDAL_LIBRARY GDAL的库目录
GIFLIB_INCLUDE_DIR GIF的包含目录
GIFLIB_LIBRARY GIF的库目录
INVENTOR_INCLUDE_DIR INVENTOR的包含目录,可以不指定
INVENTOR_LIBRARY INVENTOR的库目录,可以不指定
INVENTOR_LIBRARY_DEBUG INVENTOR的D版库目录,可以不指定
JASPER_INCLUDE_DIR JASPER的包含目录,可以不指定
JASPER_LIBRARY JASPER的库目录,可以不指定
LIBRARY_OUTPUT_PATH 库输出目录,可以不指定,默认为LIB
OPENVRML_INCLUDE_DIR OPENVRML的包含目录,可以不指定
OPENVRML_LIBRARY VRML的库目录,可以不指定
OPENVRML_LIBRARY_DEBUG VRML的调试版库目录,可以不指定
OSG_GLU_TESS_CALLBACK_TRIPLEDOT 默认关闭即可
PERFORMER_INCLUDE_DIR Performer的包含目录,可以不指定
PERFORMER_LIBRARY Performer的库目录,可以不指定
QT_QMAKE_EXECUTEABLE QT的QMAKE可执行目录
QUICKTIME_INCLUDE_DIR QuickTime的包含目录,可以不指定
QUICKTIME_LIBRARY QuickTime的库目录,可以不指定
SDLMAIN_LIBRARY SDL的sdlmain.lib库目录,可以不指定
SDL_INCLUDE_DIR SDL的包含文件目录,可以不指定
TIFF_INCLUDE_DIR TIFF图的包含目录
续表
选 项 含 义
TIFF_LIBRARY TIFF图的库目录
USE3DPARTY_BIN 是否使用第三方依赖,必须开启
XINE_INCLUDE_DIR XINE的包含目录,可以不指定
XINE_LIBRARY XINE的库目录,可以不指定
ZLIB_INCLUDE_DIR ZLIB的包含目录
ZLIB_LIBRARY ZLIB的库目录
WxWidgets_LIB_Dir Wx的库目录
WxWidgets_ROOT_DIR Wx的根目录

(5)再次打开解决方案。

\OpenSceneGraph 2.8.0\OpenSceneGraph-2.8.0\ OpenSceneGraph.sln

需要对osgVersion.cpp中的一些错误进行修改,主要是将其中的部分“?”替换为“"”。然后选择“编译”→“生成”→“批生成”命令,打开“批生成”对话框,选择其中的Debug和Release进行编译,如图1-11所示。

图1-11 VS2005编译批生成图示
这样配置以后,编译可能还会有错误,不过主要的应该是一些语法或者链接错误。语法错误逐一修改,链接错误则加上对应的Lib即可,Lib的添加方法为:选择“项目”→“属性”命令,在打开的属性对话框中展开“链接器”→“输入”节点,在右侧的列表中设置附加库即可。
通过编译OSG,读者会发现为了实现对各种格式的模型和图像文件的

加载,OSG需要大量的第三方库支持,其中主要包括的第三方插件库如表1-2所示。
表1-2 第三方插件库
第三方插件库 功 能 下 载 方 法
FreeType 提供了对ttf、ttc、cid、cff、cef、fon和fnt格式的字体文件的加载支持。用户程序使用osgdb_ freetype.dll插件实现对上述字体的加载 OSG 2.2及以前版本可以直接下载FreeType 2.19整合的库文件;OSG 2.3.x版本增加了Text3D类,需要下载较新版本的FreeType 2.3.x,下载地址为:www. https://www.sodocs.net/doc/be6356488.html,
LibJPEG 提供对jpg和jpe格式的图片文件的加载支持,用户程序使用osgdb_jpeg.dll实现加载 可以直接下载整合的库文件
续表
第三方插件库 功 能 下 载 方 法
LibPNG 提供对png格式的图片文件的加载支持,用户程序使用osgdb_png.dll实现加载 可以直接下载整合的库文件
LibTiff 提供对tif格式的图片文件的加载支持,用户程序使用osgdb_tiff.dll实现加载 可以直接下载整合的库文件
LibUnGIF 提供对gif格式的图片文件的加载支持,用户程序使用osgdb_gif.dll实现加载 可以直接下载整合的库文件
ZLib 提供对zip格式的压缩文件的加载支持,用户程序使用osgdb_zip.dll实现加载 可以直接下载整合的库文件
GLUT OpenGL应用工具包,GUI库的一种,可以与OSG嵌合 可以直接下载整合的库文件
GDAL GDAL是专用于解析地理信息数据(GIS)文件的工具库,并遵循MIT/X许可证开放源代码 可以下载GDAL 1.5或以上版本,下载地址为:https://www.sodocs.net/doc/be6356488.html,
Collada Open Inventor是VRML文件的官方格式,由SGI公司制定其规范并开发,其文件扩展名为wrl。用户程序使用osgdb_iv.dll实现加载 需要下载Collada-Dom库,下载地址为:https://www.sodocs.net/doc/be6356488.html,
Inventor Open Inventor是VRML文件的官方格式,由SGI公司制定其规范并开发,其文件扩展名为wrl。用户程序使用osgdb_iv.dll实现加载 需要相应的Open Inventor库,可以查询SGI网站获取其最新信息:https://www.sodocs.net/doc/be6356488.html,/projects/inventor
Jasper Jasper由加拿大维多利亚大学的一位教师主持开发,它支持“高压缩、低比特速率”的JPEG2000图片格式,其文件扩展名为jp2。用户程序使用osgdb_jp2.dll实现加载 需要下载相应的Jasper库,下载地址为:
www.ece.uvic.ca/~mdadams/jasper
OpenVRML OpenVRML是一个可以为应用程序提供VRML支持的工具包,其源代码还在不断完善中。文件扩展名为wrl,用户程序使用osgdb_vrml.dll实现加载 所需的版本为0.14.3,更新的版本可能无法为OSG 插件所用,需要下载相应的OpenVRML库,下载地址为:https://www.sodocs.net/doc/be6356488.html,
Performer OpenGL Performer是一个可扩展的高性能实时三维视景开发软件包,有自己的数据格式类型,其文件扩展名为pfb,用户程序使用osgdb_pfb.dll实现加载 需要相应的OpenGL Performer库,可以查询SGI网站获取其最新

信息:https://www.sodocs.net/doc/be6356488.html,/projects/performer/
QuickTime QuickTime SDK库提供了对MOV等媒体文件的强大支持,它支持的文件扩展名包括mov、avi、mpg、mpv、dv、mp4、m4v、psd、tga、jpg、jpe、jpeg、tif、tiff、gif和png等,用户程序使用osgdb_qt.dll实现加载 需要下载相应的QuickTime SDK库,OSG 2.0需要QuickTime SDK7.1.2及以上版本的支持。可以登录Apple的网站并注册,然后下载,下载地址为:https://www.sodocs.net/doc/be6356488.html,/quicktime
XINE XINE是一个Linux下的媒体播放开发库,目前在Windows下尚无成熟的应用,它支持的文件扩展名包括mov、mpg、mpv、dv、avi和wmv等 Windows下可能无法编译
FLTK 一种轻量级的GUI库,可以与OSG嵌合 可以下载FLTK 1.1或以上版本,下载地址为:https://www.sodocs.net/doc/be6356488.html,
续表
第三方插件库 功 能 下 载 方 法
Qt 最为强大的跨平台GUI库之一,可以与OSG嵌合 只能下载开源版本,Qt3或Qt4的版本都是可以的,下载地址为:https://www.sodocs.net/doc/be6356488.html,/products/qt
Fox 一款性能出色的GUI库,可以与OSG嵌合 可以下载FOX 1.6或以上版本,下载地址为:
https://www.sodocs.net/doc/be6356488.html,
wxWidgets 强大的跨平台GUI库之一,与MFC类似,遵循LGPL协议,可以与OSG嵌合 可以下载2.8.x或以上版本,下载地址为:https://www.sodocs.net/doc/be6356488.html,
SDL 一款历史悠久的GUI库,图形和声音的处理能力较强,遵循LGPL协议,可以与OSG嵌合 可以下载1.2或以上版本,下载地址为:https://www.sodocs.net/doc/be6356488.html,

如果在不同的平台下编译OSG,有必要准备好所需插件的源代码并且自己编译。编译第三方库的源代码时,可能会遇到一些代码问题,下面列出一些常见问题及解决方案。
(1)VRML插件库
在Windows系统下,我们需要使用OpenVRML 0.4.13版本来执行插件的编译,因为OpenVRML的更新版本依赖于boost库,因此代码与VRML插件不兼容。
首先,打开解决方案:

...\OpenVRML\src\openvrml-0.14.3\ide-projects\Windows\VisualC7\OpenVRML\OpenVRML.sln

选择Debug模式,并修改其他工程的Librarian->General->Output File选项,在输出文件名的末尾添加字母d,这样我们在Debug方式下将生成openvrmld.lib等文件,而非原来的openvrml.lib,Release方式则不用进行改动。配置完成后,Debug和Release模式下生成的文件就可以放置在同一个目录下了。同时,读者需要对代码作以下修改。
将Token.hpp的第76行:

inline operator<(RefToken l,RefToken r); //{return true;}

修改为:

inline bool operator<(RefToken l,RefToken r); //{return true;}

将AST.hpp的第151行:

inline operator<(RefAST l,RefAST r); // {return true;}

修改为:

inline bool operator<(RefAST l,RefAST r); // {return true;}

最后,修改regerror.c,其中有一处旧式C函数的声明方法:

size_t regerror(errcode, preg, errbuf, errbuf_size)
int errcode;
con

st regex_t *preg;
char *errbuf;

size_t errbuf_size;
{

修改为:

size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)\\
{

(2)Inventor插件库
Inventor插件库的源代码本身并没有问题,不过,在Windows环境下无法正常编译,会出现类型未定义的错误,因为部分类型在Win32环境下没有定义,可以在头文件assert.h中添加下面的定义:

typedef signed char int8_t;
typedef short int16_t;
typedef unsigned short uint16_t;

(3)wxWidgets插件库
在编译wxWidgets插件库的源代码时,会出现与wxGLCanvas相关的LNK2019错误,这不是编译时OSG的问题,而是由于所使用的wxWidgets没有开启OpenGL渲染项造成的。重新设置lib目录下setup.h文件中的wxUSE_GLCANVAS参数为1,并再次编译wxWidgets即可。
(4)QuickTime插件库
编译QuickTime插件库的源代码时,通常是可以正常编译通过的,但在设置QuickTime的库时可能容易犯错误。注意如下设置:

QUICKTIME_INCLUDE_DIR:QTDevWin\CIncludes
QUICKTIME_LIBRARY:qtmlClient.lib

现在读者应该熟悉如何编译OSG的源代码了,如果还是没有编译成功,可到OSG中国官方讨论区(https://www.sodocs.net/doc/be6356488.html,)发帖提问。
1.3.3 OSG邮件列表
学习OSG,就意味着要埋头去研究源代码,面对浩瀚的源代码,不明白、不理解是在所难免的事情。这个时候,邮件列表可以帮助读者解疑答惑。最新的版本发布信息和相关的问题都会在邮件列表中汇集,这些信息都是英文的,相信只要读者的英语过了四级或者同等水平,看懂应该是不成问题的。作为OSG的学习者,订阅邮件列表是一个非常有助于学习OSG的途径。订阅邮件列表的方法比较简单,在IE浏览器的地址栏中输入“https://www.sodocs.net/doc/be6356488.html,/projects/osg/wiki/MailingLists”,单击“转到”按钮,在打开的网页中填写注册信息,完成注册以后,读者会收到一封激活的E-mail,然后激活就可以正常使用邮件列表了。
以后读者每天打开E-mail时就会看到邮件列表上的很多问题及解决方案。到目前为止,笔者已经收到近两万封邮件列表的E-mail,从中受益匪浅。如果读者担心邮箱因此而爆满或者读者没有兴趣继续阅读这些邮件,重新打开注册的网页,用类似注册的方式取消订阅即可。

1.4 OSG基础
现在开始步入OSG的编程之旅。在读者安装完OSG后,需要设置开发环境,本节将首先进行介绍。可能读者以前是DC或者VC++6.0的爱好者,现在建议您使用VS,这些编译工具在工程方面还是有很大的差别。当然,这也不是必需的。在DC、VC++6.0或者BCB的环境下同样也可以进行OSG开发,它们具体的设置类同,这里不再赘述。
1.4.1 开发环境设置
正确使用安装包安装OSG并完成OSG的编译后

,打开VS2005,选择“工具”→“选项”命令,打开“选项”对话框,展开“项目和解决方案”节点,选择“VC++目录”选项,这里设置的内容有包含文件和库文件两项,分别选择OSG目录中的include和lib文件夹所在的路径,如图1-12所示。

图1-12 开发环境设置
具体设置方法如下:
(1)包含文件和库文件目录分别设置为:

...\OsgChina\OpenSceneGraph\include
...\OsgChina\OpenSceneGraph\lib

(2)右击“我的电脑”图标,在弹出的快捷菜单中选择“属性”命令,打开“系统属性”对话框,选择“高级”选项卡,单击“环境变量”按钮,在弹出的“环境变量”对话框中设置下面两个环境变量:

PATH: ...\OsgChina\OpenSceneGraph\bin;
OSG_FILE_PATH: ...\OsgChina\OpenSceneGraph\data

安装包中会自动添加这些环境变量,使用安装包时就不必为此费心。
1.4.2 OSG中的HelloWorld工程
到目前为止,相信读者已经对OSG有了一个大致的了解,并且已经掌握了OSG的编译方法和开发环境的设置。下面来编写我们的第一个程序。
启动VS2005,选择“新建”→“项目”命令,在Win32控制台下新建一个空项目osgVR,在其中添加新建源文件main.cpp,输入程序清单1-1中的代码。
程序清单1-1
00001 /**********************************************************
00002 *Write by FlySky
00003 *zzuxp@https://www.sodocs.net/doc/be6356488.html, https://www.sodocs.net/doc/be6356488.html,
00004 **********************************************************/
00005
00006 #include
00007
00008 #include
00009 #include
00010 #include
00011
00012 #include
00013 #include
00014
00015 #include
00016
00017 int main()
00018 {
00019 //创建Viewer对象,场景浏览器
00020 osg::ref_ptr viewer = new osgViewer::Viewer();
00021
00022 //创建场景组节点
00023 osg::ref_ptr root = new osg::Group();
00024
00025 //创建一个节点,读取牛的模型
00026 osg::ref_ptr node = osgDB::readNodeFile("cow.osg");
00027
00028 //添加到场景
00029 root->addChild(node.get());
00030
00031 //优化场景数据
00032 osgUtil::Optimizer optimizer ;
00033 optimizer.optimize(root.get()) ;
00034
00035 //设置场景数据
00036 viewer->setSceneData(root.get());
00037
00038 //初始化并创建窗口
00039 viewer->realize();
00040
00041 //开始渲染
00042 viewer->run();
00043
00044 return 0 ;
00045 }

然后选择“项目”→“属性”命令,打开“osgVR属性页”对话框,展开“链接器”→“输入”节点,设置“附加依赖项”,输

入“OpenThreads.lib osg.lib osgDB.lib osgFX.lib osgGA.lib osgManipulator.lib osgParticle.lib osgShadow.lib osgSim.lib osgTerrain.lib osgText.lib osgUtil.lib osgViewer.lib”,单击“确定”按钮,如图1-13所示。
这里在Release下编译,因为在Debug下编译程序可能会出现中断,不过,这都是正常的。如果选择在Debug下编译,只要在相应的库后面加上d即可。还有一点需要注意的是,Release下的库和Debug下的库不能混用,即不要在附加库中同时加入Release和Dubug下的库,应当分别与之对应使用,否则会出现运行错误或者无法意料的程序异常。
编译运行该程序,读者可以看到OSG中最熟悉的奶牛,如图1-14所示。

图1-13 附加依赖项设置 图1-14 奶牛模型
下面对程序清单1-1中的代码进行简单的说明。
? 第6行:包含场景浏览器osgViewer::Viewer类头文件。
? 第8~10行:包含场景中基本的节点类型——节点、叶节点、组节点的头文件。
? 第12~13行:包含读取文件函数的头文件。
? 第15行:包含优化场景数据的头文件。
? 第19行:创建场景浏览器,用于渲染场景模型数据。
? 第23行:创建场景数据根节点,用于添加模型文件数据,构建场景树。
? 第26行:从外部读取模型文件,加载模型文件到场景中。
从上面的程序可以看出,构建OSG场景渲染程序的开发步骤如下:
(1)设置编程环境,指定头文件。
(2)创建场景浏览器,通过osgViewer::Viewer类创建一个对象,用于渲染场景。
(3)设置场景数据,从外部加载模型或者场景数据。
(4)设置场景数据,为渲染场景建立场景树,确定场景数据之间的关系。
(5)渲染,进入循环,实现场景渲染。
本节介绍了一个最简单的OSG程序,通过上面的程序,读者应该了解了OSG程序的基本结构。可能还有读者有疑惑,没关系,通过以后的学习,会慢慢了解并熟悉所有的东西,成为OSG编程高手。

1.4.3 OSG实用工具——场景浏览器osgViewer
osgViewer是OpenSceneGraph发行版附带的最基本的场景图形浏览器,它演示了编写基本场景视口的方法,当然也可以直接使用osgViewer作为3D图形浏览工具。使用osgViewer可以简单地对场景进行浏览,同时,也能对相关的渲染数据进行统计。
选择“开始”→“运行”命令,在打开的“运行”对话框中输入“cmd”命令,单击“确定”按钮,打开控制台窗口,在提示符后输入“osgviewer cow.osg”命令,按Enter键即可打开全屏幕的浏览视口。下面将对具体命令参数逐一介绍。命令的用法可以简单归结为:

osgviewer [options] filename

1.命令行参数
如果要打印所有可用的命令行参数,则在控制台窗口的提示符后输入:

os

gviewer--help

按Enter键后会出现参数信息,如表1-3所示。
表1-3 osgViewer的命令行参数说明
参 数 说 明
--CullDrawThreadPerContext 设置线程模式为--CullDrawThreadPerContext
--CullThreadPerCameraDrawThreadPerContext 设置线程模式为--CullThreadPerCameraDrawThreadPerContext
--DrawThreadPerContext 设置线程模式为--DrawThreadPerContext
--SingleThreaded 设置单线程模式为--SingleThreaded
--accum-rgb 请求使用rgb累积缓冲
--accum-rgba 请求使用rgba累积缓冲
--cc 请求使用编译环境和线程
--clear-color 设置viewer的背景色,数据形式为:r,g,b[,a]
--dem 加载DEM/IMAGE文件并渲染高度图(HeightField)
--display 设置显示设备模式,可以选用的模式有:MONITOR、POWERWALL、REALITY_CENTER、EAD_MOUNTED_DISPLAY
--help-all 显示所有命令行、环境变量、鼠标及键盘操作信息
--help-env 显示可用的环境变量
--help-keys 显示可用的键盘、鼠标操作信息
--image 读取一张图片,并渲染在四边形上
--login 通过验证信息读取网络文件
--rgba 请求使用RGBA颜色缓冲
--samples 设置重采样系数
--screen 设置屏幕个数
--serialize-draw 设置连续绘制模式
续表
参 数 说 明
--stencil 请求使用模板缓冲
--stereo 使用默认的立体显示模式,如果环境中没有指定,默认模式为(ANAGLYPHIC)
--stereo 设置立体显示模式,可以选择的模式有:ANAGLYPHIC、QUAD_BUFFER、HORIZONTAL_SPLIT、VERTICAL_SPLIT、LEFT_EYE、RIGHT_EYE、HORIZONTAL_INTERLACE、VERTICAL_ INTERLACE、CHECKERBOARD、ON、OFF
--window 设置窗口的位置及大小
-O 使用指定的插件读取/写入文件
-e 加载插件库可以加载的扩展名的文件
-h or–help 显示命令行参数
-l 加载指定插件链接库
-p 加载路径文件,实现路径动画

2.键盘和鼠标指令
在osgViewer运行过程中,按下h键即可显示键盘和鼠标的操作信息,再次按下h键可以关闭文字显示。也可以在控制台窗口中显示键盘和鼠标操作信息,如表1-4所示。

osgviewer--help-keys

表1-4 键盘和鼠标指令说明
键盘和鼠标指令 说 明
* 增大LODScale比例系数
/ 减小LODScale比例系数
1 选择轨迹球(Trackball)相机操作器(默认)
2 选择飞行(Flight)相机操作器
3 选择驾驶(Drive)相机操作器
4 选择地形(Terrain)相机操作器
< 减少窗口屏幕分辨率(窗口模式)
> 增加窗口屏幕分辨率(窗口模式)
Drive:Down 使用光标向下键向下看
Drive:Space 重置相机位置到初始值
Drive:Up 使用光标向上键向上看
Drive:a 使用中键或者右键控制速度
Drive:q 使用鼠标Y坐标控制速度
Flight:a 转弯时没有偏航角
Flight:q 转

弯时自动设置偏航角(默认)
S 输出统计信息到控制台
Terrain:+ 立体显示模式下,增大融合距离
Terrain:- 立体显示模式下,减小融合距离
续表
键盘和鼠标指令 说 明
Terrain:Space 重置相机位置到初始值
Trackball:+ 立体显示模式下,增大融合距离
Trackball:- 立体显示模式下,减小融合距离
Trackball:SpaceReset 重置相机位置到初始值
Z 演示记录的路径动画
b 允许/禁止背面绘制
c 抓图
e 切换帧缓冲模式
f 切换全屏/窗口显示场景
h 显示帮助信息
l 允许/禁止光照
m 切换线程模式
s 允许/禁止显示场景统计信息
t 允许/禁止使用纹理
w 设置多边形填充模式
z 开始记录相机动画

3.环境变量
显示所有可用的环境变量参数,在控制台窗口中提示符后输入:

osgviewer--help-env

按Enter键后显示的信息如表1-5所示。
表1-5 环境变量参数说明
环境变量参数 说 明
OSG_BUILD_KDTREES ON/OFF
OSG_COMPIlE_CONTEXTS OFF/ON
OSG_COMPUTE_NEAR_FAR_MODE DO_NOT_COMPUTE_NEAR_FAR、COMPUTE_NEAR_FAR_ USING_ B-OUNDING_VOLUMES、COMPUTE_NEAR_FAR_ USING_PRIMITIVES
OSG_CONFIG_FILE 加载指定相机配置文件
OSG_DATABASE_PAGER_DRAWABLE DoNotModify、DisplayList、VBO、VertexArrays
OSG_DATABASE_PAGER_PRIORITY DEFAULT、MIN、LOW、NOMINAL、HIGH or MAX
OSG_DEFAULT_BIN_SORT_MODE SORT_BY_STATE、SORT_BY_STATE_THEN_FRONT_TO_ BACK、SORT_FRONT_TO_BACK、SORT_BACK_TO_FRONT
OSG_DISPLAY_TYPE MONITOR、POWERWALL、REALITY_CENTER、HEAD_ MOUNTED_DISPLAY
OSG_DO_PRE_COMPILE ON/OFF
OSG_EXPIRY_DELAY PagedLOD不可用子节点释放内存的时间
OSG_EXPIRY_FRAMES PagedLOD不可用子节点释放内存的帧数
续表
环境变量参数 说 明
OSG_EYE_SEPARATION 两眼视点之间的距离
OSG_FILE_PATH [;path].. 数据文件路径
OSG_GL_ERROR_CHECKING ONCE_PER_ATTRIBUTE、ON
OSG_LIBRARY_PATH [;path].. 库文件和插件库文件的路径
OSG_MAXIMUM_OBJECTS_TO_COMPILE_PER_ FRAME OpenGL数据页中每帧编译最多的对象个数
OSG_MAX_NUMBER_OF_GRAPHICS_CONTEXTS 程序所用图形上下文的最大值
OSG_MAX_PAGEDLOD PAGEDLOD支持的最多分页
OSG_MAX_TEXTURE_SIZE 纹理贴图的最大尺寸
OSG_MINIMUM_COMPILE_TIME_PER_FRAME OpenGL数据页中每帧编译的最短时间
OSG_NEAR_FAR_RATIO 近平面与远平面的距离比(0.0~1.0)
OSG_NUM_DATABASE_THREADS 数据分页的线程个数
OSG_NUM_HTTP_DATABASE_THREADS 网络数据分页的线程个数
OSG_OPTIMIZER " []" OFF、DEFAULT、FLATTEN_STATIC_TRANSFORMS、FLATTEN_ STATIC_TRANSFORMS_DUPLICATING_SHARED_SUBGRAPHS、REMOVE_REDUNDANT_NODES、COMBINE_ADJACENT_LODS、SHARE_DUPLICATE_STATE、MERGE_GEOMETRY、MERGE_
GEODES、SPATIALIZE_GROUPS、COPY_SHARED_NODES、TRISTRIP_GEOMETRY OPTIMIZE_

TEXTURE_SETTINGS、REMOVE_LOADED_PROXY_NODES、TESSELLATE_GEOMETRY、CHECK_GEOMETRY、FLATTEN_BILLBOARDS、TEXTURE_ ATLAS_BUILDER、STATIC_OBJECT_DETECTION
OSG_RELEASE_DELAY PagedLOD释放子节点延迟时间
OSG_RELEASE_FRAMES PagedLOD释放子节点延迟帧数
OSG_SCREEN 显示器(默认为0)
OSG_SCREEN_DISTANCE 眼睛和屏幕的实际距离
OSG_SCREEN_HEIGHT 屏幕的实际高度
OSG_SCREEN_WIDTH 屏幕的实际宽度
OSG_SERIALIZE_DRAW_DISPATCH OFF/ON
OSG_SPLIT_STEREO_AUTO_ADJUST_ASPECT_ RATIO OFF/ON
OSG_SPLIT_STEREO_HORIZONTAL_EYE_ MAPPING OFF/ON
OSG_SPLIT_STEREO_HORIZONTAL_
SEPARATION OFF/ON
OSG_SPLIT_STEREO_VERTICAL_EYE_
MAPPING LEFT_EYE_LEFT_VIEWPORT、LEFT_EYE_RIGHT_VIEWPORT
续表
环境变量参数 说 明
OSG_SPLIT_STEREO_VERTICAL_SEPARATION 视口区域纵横分割的像素
OSG_STEREO OFF/ON
OSG_STEREO_MODE QUAD_BUFFER、ANAGLYPHIC、HORIZONTAL_SPLIT、VERTICAL_SPLIT、LEFT_EYE、RIGHT_EYE、VERTICAL_ INTERLACE、HORIZONTAL_INTERLACE
OSG_TEXT_INCREMENTAL_SUBLOADING ON/OFF
OSG_THREADING SingleThreaded、CullDrawThreadPerContext、DrawThreadPerContext or CullThreadPerCameraDrawThreadPerContext
OSG_THREAD_SAFE_REF_UNREF 线程的安全性
OSG_WIN32_NV_MULTIMON_MULTITHREAD_WORKAROUND ON/OFF
OSG_WINDOW x y width height 默认窗口的位置及大小
OSG_WRITE_OUT_DEFAULT_VALUES ON/OFF

通过上面详细的介绍,相信读者已经能够利用osgViewer来浏览场景。
1.4.4 OSG实用工具——版本信息查看器osgVersion
版本信息查看器osgVersion一般情况下很少用,因为它本身没有很大的用途,只用于记录当前版本的一些信息。它的使用方法同osgViewer,即选择“开始”→“运行”命令,在打开的“运行”对话框中输入“cmd”命令,在打开的控制台窗口的提示符后输入“osgversion+相应的参数”即可使用,这里不再具体讲解。
参数说明如表1-6所示。
表1-6 osgVersion的参数说明
参 数 说 明
--major-number 只输出版本号的主号
--minor-number 只输出版本号的副号
--openthreads-soversion-number 只输出共享OpenThreads的版本号
--openthreads-version-number 只输出OpenThreads的版本号
--patch-number 只输出版本修正号
--so-number 只输出共享版本号
--version-number 只输出版本号
-h or -help 显示帮助信息
-r or –read 读取贡献者名单文件

1.4.5 OSG实用工具——场景图形压缩归档工具osgArchive
osgArchive工具用于创建和读取压缩格式的数据,生成的压缩文件可以在OSG程序(如osgViewer)运行时使用。
运行osgArchive命令行,可以得到其参数信息,如表1-7所示。
表1-7 osgArchive参数说明
参 数 说 明
-h or -help 显示帮助信息
-a or -archive 指定压缩后目标文件名(.osga)
-I or -insert 在压缩

包中插入模型
-e or -extract 从压缩包中抽取文件
-l or -list 列出压缩包中所有文件

1.如何使用osgArchive
(1)创建新的压缩包
创建新压缩包时,需要通过-i 来指定压缩包文件名,包括其扩展名,然后将3D文件和图片文件以-i [ ...]的格式添加到压缩包中。具体格式如下所示:

osgarchive -a archive.osga -i cow.osg glider.osg

也可以使用相同的参数格式压缩整个目录,例如:

osgarchive -a archive.osga -i mydirectory

.osga格式还支持主文件的形式,即设定添加到压缩包的第一个文件是主文件。
(2)列出压缩包中的文件
可以使用-l参数来列出指定压缩包中所有的文件,例如:

osgarchive -a archive.osga -l

这样可以打印出压缩包中包含的文件列表。
(3)从压缩包中解压文件
可以使用-e [...]的格式从指定压缩包中解压文件,例如:

[...] syntanx:
osgarchive -a archive.osga -e cow.osg

2.在其他OpenSceneGraph程序中使用压缩包文件
压缩文件可以按照普通OSG文件的形式来读取,此时第一个解压的文件将作为osgDB返回的结果。如果要加载压缩包的主文件,只需要执行如下命令:

osgviewer archive.osga

如果希望读取压缩包中的某个文件,则执行如下命令:

osgviewer archive.osga/glider.osg

编写代码时,可以按照如下方式实现压缩包的读取:

osg::ref_ptrmasterNode=osgDB::readNodeFile("archive.osga");
osg::ref_ptrgliderNode=osgDB::readNodeFile("archive.osga/glider.osg");

3.为osgdem的分页数据生成压缩包
osgdem程序支持生成.osga压缩文件,只要指定-a ,就可以将osgdem生成的纹理贴图放置到一个指定的压缩包中。
4.支持压缩的文件格式
OpenSceneGraph的压缩包机制允许使用istream和ostream来操作压缩包的数据流,但并不是所有的3D模型和图片格式都支持istream和ostream操作。下面列出了目前支持压缩包机制的几种文件格式。
? .osg:OpenSceneGraph本地ASCII格式。
? .ive:OpenSceneGraph本地二进制格式。
? .dds:DirectDrawSurface图片文件格式。
? .jp2:JPEG2000图片文件格式。
虽然支持的文件格式种类不同,但是大部分格式都可以转换为.osg或者.ive格式,从而可以使用该工具处理大部分OSG支持的文件。
1.4.6 OSG实用工具——数据转换工具osgConv
osgConv工具用于读取3D数据,执行基本的操作,并重新保存为新的3D数据文件。
1.使用osgConv转换OSG本地文件格式
osgConv可用于读取标准3D文件格式,如OpenFlight、3DS、Alias和Wavefront(OBJ)等,并将其转换为OSG本地格式,如ASCII形式的.osg文件或者二进制形式的.ive文件。默认情况下,它将对读入的场景图形进行优化

,转换后的场景图形因此会变得更加小巧,在运行时也更加快速。.ive文件格式的读取更为快捷,它特别适用于分页数据库和大型数据库文件的开发。
下面的命令用于将cow.obj转换为.ive文件:

osgconv cow.obj cow.ive

下面的命令用于将cow.obj转换为.ive文件,同时进行压缩并自动生成细化纹理(mipmapped texture):

osgconv--compressed cow.obj cow.ive

2.命令行参数
输出参数操作信息的命令如下:

osgconv--help

使用方法如下:

osgconv [options] infile1 [infile2 ...] outfile
参数选项如表1-8所示。
表1-8 osgConv的命令行参数说明
参 数 说 明
-O option ReaderWriter选项
--compressed 使用压缩纹理
--compressed-arb 使用OpenGL ARB压缩纹理
--compressed-dxt1 使用S3TC DXT1压缩纹理
--compressed-dxt3 使用S3TC DXT3压缩纹理
--compressed-dxt5 使用S3TC DXT5压缩纹理
--fix-transparency 修正不透明状态属性,默认模式为MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE
--fix-transparency-mode
指定模式修正不透明状态属性,可以选择的模式有:MAKE_OPAQUE_TEXTURE_ STATESET_OPAQUE和MAKE_ALL_STATESET_OPAQUE
-l libraryName 加载指定的插件库,如-l osgdb_pfb。当需要指定一个插件库来加载某种格式的文件时,这个参数是十分有用的
-e extensionName 为指定的文件扩展名加载文件读/写插件,如-e pfb。这个参数有时比-l参数更为方便,因为它会自动根据插件库文件在不同的平台位置加载插件
-o orientation 将输入文件的几何体变换方位后转换到输出文件,方位参数的格式如下所示:

X1,Y1,Z1-X2,Y2,Z2 /角度值:-A0,A1,A2

其中,X1、Y1、Z1表示输入文件垂直轴的向量,而X2、Y2、Z2表示输出文件垂直轴的向量;如果使用角度值,则它表示绕(A0,A1,A2)轴的旋转角度。例如,我们希望将一个Y轴为垂直轴的坐标系统下的模型转换到Z轴为垂直轴的坐标系下,其参数可以设置为:0,1,0-0,0,1或-90-1,0,0
-t translation 转换输出文件的空间位置信息。位置参数的格式如下所示:

X,Y,Z

其中,X、Y、Z表示世界空间下的绝对坐标
-s scale 缩放模型的尺寸,缩放参数的格式如下所示:

SX,SY,SZ

其中,SX、SY、SZ表示放缩因子。注意,放缩是在目标文件的坐标系下完成的
--smooth 为每一个Geometry生成顶点法线,使模型表面平滑
--addMissingColors 为没有颜色的Geometry添加颜色(白色)
--overallNormal 用单一法向量替代所有法向量
--formats 输出所有支持的文件的格式和操作信息
--format
输出指定文件的格式和操作信息
--plugins 列出所有插件库支持的文件格式
--plugin
输出指定的插件库的目录和文件格式信息

到此为止,OSG的4个实用工具已经介绍完毕,希

望读者能够熟练地使用。虽然它们只是作为工具,但是在实际的项目开发过程中是非常有实用意义的。例如,可以使用osgViewer浏览工程模型,并输出统计信息,判断是否需要优化;可以使用osgArchive来打包整个工程文件,方便文件的管理;可以使用osgConv来转换数据,转换成.ive格式可以加速场景渲染。在以后的学习过程中,读者会发现它们是OSG不可缺少的一部分。
通过本章的学习,读者应该对OSG有一个总体的了解,同时,也应该对OSG的设计、体系及组件有一定的了解,并熟悉OSG实用工具的使用方法。在第1章并没有介绍编程细节,读者不要急于进行编程开发。如果还没有熟悉本章内容,可静下心来再看一遍。
接下来的章节将从各个方面讲解如何来编写OSG程序实现常用的渲染效果。


相关主题