♆1-OSG 概述

OSG组成模块

OpenSceneGraph及其扩展位于系统的API一级,即系统的底层绘图硬件和相应的软件驱动程序之上封装了OpenGL,并对其余的底层图形显示方式予以支持,利用OpenSceneGraph可以轻松地开发其上层的应用程序。

OSG层次结构图如下图所示:

OSG主要包括4个库,下面分别进行介绍。

一、OSG核心库(CoreLibrary)
核心库是OSG的核心,也是其存在且不断得到发展的根本原因。它的主要功能就是实现最核心的场景数据库的组织和管理、对场景图形的操作以及为外部数据库的导入提供接口等。它主要包括以下4个库:

  1. osg库:基本数据类库,负责提供基本场景图类,构建场景图形节点,如节点类、状态类、绘制类、向量和矩阵数学计算以及一般的数据类。同时,它包含一些程序所需要的特定功能类,如命令行解析和错误调试信息等。
  2. osgUtil库:工具类库,提供通用的公用类,用于操作场景图形及内容,如更新、裁减、遍历、数据统计及场景图的一些优化。
  3. osgDB库:数据的读写库,负责提供场景中数据的读写工作,提供了一个文件工具类。注意,OSG中场景图管理是通过遍历场景图层次结构来完成大部分的数据处理工作的。
  4. osgViewer库:是在OSG2.0后逐步发展稳定的一个视窗管理库,可以集中各种窗体系统,提供OSG与各种GUI的结合。因此,它是跨平台的3D管理窗口库。

二、OSG工具库(NodeKit)
OSG工具库主要是对OSG核心库中osg库的扩充,是对OSG核心库的一个补充,它实现了一些特定的功能。它主要包括以下6个库:

  1. osgFX库:特殊效果节点工具,用于渲染特效节点,包括异性光照特效(osgFX::AnisotropicLighting)、凹凸贴图特效(osgFX::BumpMapping)、卡通渲染特效(osgFX::Cartoon)、刻线特效(osgFX::Scribe)和立方图镜面高光特效(osgFX::SpecularHighlights)等。
  2. osgParticle库:粒子系统的节点工具,用于模拟各种天气或者自然现象效果,如雨效、雪效和爆炸模拟等。
  3. osgSim库:虚拟仿真效果的节点工具,用于特殊渲染,如地形高程图、光点节点和DOF变换节点等。
  4. osgTerrain库:生成地形数据的节点工具,用于渲染高程数据,如TIF、IMAGE和DEM等各种高程数据格式。注意,OSG通过一个开源库GDAL读取这些高程数据。
  5. osgText库:文字节点工具,用于向场景中添加文字信息,它完全支持TrueType字体。
  6. osgShadow库:阴影节点工具,用于向场景中添加实时阴影,提高场景渲染的真实性。

三、OSG插件库
OSG插件库是OSG的一个非常重要的特点。通过各种第三方库的支持,OSG能够直接或间接地导入3D模型或图片等场景数据,可以省去大量绘制图形的工作,从而极大地方便了开发者。具体支持的各种数据格式可参见第5章。

四、OSG内省库(osgIntrospection)
OSG内省库提供了一个与语言无关的运行程序接口,确保了OSG可以在更多的环境下运行。osgIntrospection库允许软件系统使用反射式和自省式的编程范例与OSG交互。应用程序和软件可以使用osgIntrospection库和方法迭代OSG的类型、枚举量和方法,并且不需要了解OSG编译和链接时的过程,即可调用这些方法。Smalltalk和Objective-C等语言包括了内建的反射式和自省式支持,但是C++的开发者通常无法运用这些特性,因为C++并未保留必要的元数(metadata)。为了弥补C++的这一不足,OSG提供了一系列自动生成的、从OSG源代码创建的封装库。用户程序不需要与OSG的封装直接交互,它们将由osgIntrospection整体进行管理。由于osgIntrospection及其封装的结果,许多的语言,如Java、TCL、Lua和Python,都可以与OSG进行交互。

综上所述,OSG的组成模块如下图所示:

开发的预备知识:
本书《OpenSceneGraph三维渲染引擎编程指南》主要介绍实用 OSG 函数及其应用,在阅读此书前,读者应该有一定的 C++ 开发 经验。OSG 是一个 C++ 的 API 库,同时也是对 OpenGL 的底层封装,所以读者还需先了解 OpenGL 的渲染流程。

OSG对于标准模板库(STL)的运用十分广泛,因此,读者在阅读本书前应当对STL容器,特别是列表(list)、向量组(vector)和映射(map)有较深的理解。如果读者对于设计模式(design patterns)也有一定的认识和理解,将对OSG的学习大有裨益,不过并非是必要的。

在学习使用OSG编程之前,读者有必要首先熟悉3D图形学。对于本书而言,读者需要熟悉OpenGL编程接口,而OpenGL是标准的跨平台底层3D图形API函数库。对于3D图形学,希望读者能够理解对不同类型的坐标空间熟练应用笛卡儿三维坐标系来表示三维几何数据。同时,读者需要了解一些基本的图形术语概念,不过并不需要对底层图形硬件的实现有很深入的认识和理解。

读者最好还要具备一定的线性代数知识,熟悉采用向量表示三维坐标的方法以及渲染过程中采用矩阵变换进行图形系统的相关操作,因此,还有必要了解矩阵运算的有关知识。

OSG环境搭建

OSG的获取比较简单。OSG中国官网会在官方发布最新的OSG稳定版本后第一时间制作一个安装包,该安装包包含OSG常用的插件库。

下载二进制版(无需CMake编译):


下载Debug版,便于调试。下载完后的目录结构如下:

参考这篇blog:✠OpenGL-Windows Visual Studio环境配置进行配置。
其中有一步是添加.lib文件,添加如下.lib文件到依赖项:
OpenThreads.lib、osg.lib、osgDB.lib、osgFX.lib、osgGA.lib、osgManipulator.lib、osgParticle.lib、osgShadow.lib、osgSim.lib、osgTerrain.libo、osgText.lib、osgUtil.lib、osgViewer.lib
注:下载的是debug版本的话,.lib文件文件名有个后缀“d”。

自己用CMake+VS2019编译源码,编译步骤在Blog:“OSG3.4.0+VS2010+WIN10编译及二次开发环境搭建” 有详细说明。
也可参考[这篇文章]

下载直接可以被OSG进行读取的资源文件。
请添加图片描述
下载解压后,命名为“data”,然后复制到E:/…/OpenSceneGraph-3.6.5-VC2019-64-Debug目录下,这时目录下的文件如下图:

设置环境变量:
OSG_FILE_PATH=E:…\OpenSceneGraph-3.6.5-VC2019-64-Debug\data
Path中添加E:…\OpenSceneGraph-3.6.5-VC2019-64-Debug\bin

请添加图片描述
复制下面这些到Debug目录:

第一个工程

#include<osgViewer/Viewer>// L1
#include<osg/Node>// L2
#include<osg/Group>// L3
#include<osgDB/ReadFile>// L4
#include<osgDB/WriteFile>// L5
#include<osgUtil/Optimizer>// L6
int main() {
	// 创建Viewer对象,场景浏览器
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();// L9
	// 创建场景组节点
	osg::ref_ptr<osg::Group> root = new osg::Group();// L11
	// 创建一个节点,读取牛的模型
	osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");// L13
	// 添加到场景
	root->addChild(node.get());// L15
	// 优化场景数据
	osgUtil::Optimizer optimizer;// L17
	optimizer.optimize(root.get());// L18
	// 设置场景数据
	viewer->setSceneData(root.get());// L20
	// 初始化并创建窗口
	viewer->realize();// L22
	// 开始渲染
	viewer->run();// L24
	return 0;
}

上述代码中“cow.osg”文件放在工程根目录下,“cow.osg”文件可在“data”目录下可找到。这个文件有639KB。

程序运行效果如下:(全屏显示,中间有头“3D牛”)

程序说明:
第1行:包含场景浏览器osgViewer::Viewer类头文件。
第2、3行:包含场景中基本的节点类型——节点、叶节点、组节点的头文件。
第4、5行:包含读取文件函数的头文件。
第6行:包含优化场景数据的头文件。
第9行:创建场景浏览器,用于渲染场景模型数据。
第11行:创建场景数据根节点,用于添加模型文件数据,构建场景树。
第13行:从外部读取模型文件,加载模型文件到场景。

从上面的程序可以看出,构建OSG场景渲染程序的开发步骤如下:
(1) 设置编程环境,指定头文件。
(2) 创建场景浏览器,通过osgViewer::Viewer类创建一个对象,用于渲染场景。
(3) 设置场景数据,从外部加载模型或者场景数据。
(4) 设置场景数据,为渲染场景建立场景树,确定场景数据之间的关系。
(5) 渲染,进入循环,实现场景渲染。

OSG实用工具

一、场景浏览器osgViewer

可以直接在cmd窗口,输入osgviewerd cow.osg,出现上面显示出的“3D牛”,可以键盘、鼠标控制牛的缩放、位置、旋转。
注:我用的debug库,故为osgviewerd,如果用release库,就没有后缀"d"了。

➊命令行参数
如果要打印所有可用的命令行参数,可在控制台窗口输入:osgviewerd --help

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

➌环境变量
显示所有可用的环境变量参数,在控制台窗口输入:osgviewerd --help-env
在这里插入图片描述
通过上面详细的介绍,相信你已经能够利用 osgViewer 来浏览场景。

二、版本信息查看器osgVersion

版本信息查看器osgVersion一般情况下很少用,因为它本身没有很大的用途,只用于记录当前版本的一些信息。它的使用方法同osgViewer,在打开的控制台窗口的提示符后输入“osgversion+相应的参数”即可使用,这里不再具体讲解。

三、场景图形压缩归档工具osgArchive

osgArchive工具用于创建和读取压缩格式的数据,生成的压缩文件可以在OSG程序(如osgViewer)运行时使用。

运行 osgArchive 命令行,可以得到其参数信息,如下表所示。

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

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

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

asgarchive -a archive.osga -i mydirectory

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

osgarchive -a archive.osga -l

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

[<filename>...] syntanx:
asgarchive -a archive.osga -e cow.osg

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

osgviewer archive.osga

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

osgviewer archive.osga/glider.osg

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

osg::ref_ptr<osg::Node> masterNode = osgDB::readNodeFile("archive.osga");
osg::ref_ptr<osg::Node> gliderNode = osgDB::readNodeFile("archive.osga/glider.osg");

㊂为osgdem的分页数据生成压缩包
osgdem程序支持生成.osga压缩文件,只要指定-a<filename>,就可以将osgdem生成的纹理贴图放置到一个指定的压缩包中。
㊃支持压缩的文件格式
OpenSceneGraph的压缩包机制允许使用istream和ostream来操作压缩包的数据流,但并不是所有的3D模型和图片格式都支持istream和ostream操作。下面列出了目前支持压缩包机制的几种文件格式。
☑ .osg:OpenSceneGraph本地ASCII格式。
☑ .ive:OpenSceneGraph本地二进制格式。
☑ .dds:DirectDrawSurface图片文件格式。
☑ .jp2:JPEG2000图片文件格式。
虽然支持的文件格式种类不同,但是大部分格式都可以转换为.osg或者.ive格式,从而可以使用该工具处理大部分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文件,同时进行压缩并自动生成细化纹理(mipmappedtexture):

osgconv --compressed cow.obj cow.ive

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

osgconv --help

使用方法如下:

osgconv [option] infile1 [infile2 ...] outfile

参数选项如下表所示。

到此为止,OSG的4个实用工具已经介绍完毕,希望读者能够熟练地使用。虽然它们只是作为工具,但是在实际的项目开发过程中是非常有实用意义的。例如,可以使用osgViewer浏览工程模型,并输出统计信息,判断是否需要优化;可以使用osgArchive来打包整个工程文件,方便文件的管理;可以使用osgConv来转换数据,转换成.ive格式可以加速场景渲染。在以后的学习过程中,读者会发现它们是OSG不可缺少的一部分。

通过本章的学习,你应该对OSG有一个总体的了解,同时,也应该对OSG的设计、体系及组件有一定的了解,并熟悉OSG实用工具的使用方法。在第本章并没有介绍编程细节,请不要急于进行编程开发。如果还没有熟悉本章内容,可静下心来再看一遍。

接下来的章节将从各个方面讲解如何来编写OSG程序实现常用的渲染效果。

  • 0
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值