OSG基础教程:官方的四程序
来源:第三维度
作者:FreeSouth[杨石兴]编著
选自《OSG程序设计教程》第二章第二节
第一个先来看看刚才我们编的osgViewer.
1 osgViewer模型查看工具
osgViewer是这四个程序当中用的最多的OSG程序,代码也非常入门与浅显易懂,在开始->运行->CMD中就可以直接启动osgViewer,因为path中添加了它的路径。 下面来看一下osgViewer的功能,如表1:
表1 osgViewer的功能表
命令:注意有的双杠 功能
--image <filename> 读取纹理文件,比如:osgViewer--image Images/skymap.jpg
--dem <filename> 以高程图的形式渲染一个镜像/DEM 比如osgViewer --dem a.img
--h或--help 命令行参数功能帮助
--help-env 所有可用的环境变量帮助
--help-keys 所有可用键帮助
--help-all 展示所有帮助信息
--SingleThreaded 为viewer选择单线程模式
--CullDrawThreadPerContext 为viewer选择CullDrawThreadPerContext线程模式
--DrawThreadPerContext 为viewer选择DrawThreadPerContext线程模式
--CullThreadPerCameraDrawThr eadPerContext 为viewer选择—CullThreadPerCameraDrawThreadPerContext线程模式
除此外,当osgViewer在渲染的过程当中,也会有一些基本的操作,同样列表如表2。
表2
按键 功能
1 选择TrackBall操作器
2 选择Flight操作器
3 选择Driver操作器
4 选择Terrain操作器
< 在窗口模式下减少分辨率
> 在窗口模式下增大分辨率
Driver:Down 在Driver操作器下,光标向下移代表向下看
Driver:Space 空格代表重置视口,回到原点
Driver:Up 在Driver操作器下,光标向上移代表向上看
Driver:a 用鼠标中键和右键加速
Driver:q 用鼠标Y键控制速度
S 输出状态到控制台
Z 切换播放与否视口录像
b 切换背面锡除与否
e 切换是否限制帧速与否,一般60帧就够了,最少30也差不多
f 在全屏与不全屏之间切换
h 输出帮助信息
l 在打开与关闭灯光之间切换
m 切换线程模式
s 在显示帧速,显示场景时间信息与什么都不显示之间来回切换
t 在有无纹理之间切换
w 在实体模式,多边形模式,点集模式之间来回切换
z 在记录路径与否之间切换
2 osgVersion库版本检测
osgVersion应该是这四个程序当中用的最少的一个,它的功能很简单,就是查阅相关的版本信息。命令行参数如表3:
表3 osgVersion的功能
命令行 功能
-h或者--help 在屏幕上输出帮助信息
--entries 在屏幕上输出每个版本更新时的贡献者数目
--version-number 只打印版本号
--soversion-number 只打印共享对象的版本号
--openthreads-version-number 打印openthreads的版本号
--openthreads-soversion-number 只打印openthreads的共享版本号
-r <file> 或者 --read <file> 读取一个文件用来输出版本更新日志中的贡献者
通常我们在使用osgversion都只是直接输入它,判断一下当前版本。很多安装包中都没有osgversion,因为在项目编译的时候,它会少一些引号多一些问号等等,可能是由于编码问题,总之人们不愿意去管它,可见它的不重要性。
3 osgArchive数据归档器
osgArchive的重要性怎么强调都不为过,它首先是为众多OSG文件以及IVE文件打包提供了一个工具,最主要的还是它所生成的OSGA文件是整个文件,可以为海量数据的存放提供良好的支持。换句话说,你可以先把数据的结点组织好,然后压在一起,最后读一下就可以了。osgArchive是一个压缩工具,曾经在VRDEV上有人问过关于它的问题,FLMN形象的比喻道:它就像是ZIP一样,是个压缩包。可以压缩与解压的工具。 来看一下它的重要的操作,如表2.4所示。
表2.4 osgArchive的功能
命令行 功能
-h或者--help 它本身没有什么帮助信息,所以这条命令用处不大
-a或者-archive 指定osga包名,只是指定要操作的包,在后面会举示例说明用途
-i或者--insert 在包中插入模型,例如:osgarchive -a archive.osga -i cow.osg glider.osg
-e或者--extract 抽取包中文件,例如:osgarchive -a archive.osga -e cow.osg
-l或者--list 列出包中所有文件,例如:osgarchive -a archive.osga -l
下面来实例看一下osgArchive的重要功能,注意有的命令是可以替代的,比如-a也可以用--archive故不再多加描述。
1:创建新的压缩包。
创建新压缩包时,需要通过-a <filename>来指定压缩包的文件名,包括其括展名osga,然后将3D文件和图片以-i <filename> [<filename>…]的格式添加到压缩包中。如下所示: Osgarchive –a archive.osga –i cow.osg glider.osg 完成后可以在data中查看到生成了新文件archive.osga,我们也可以使用相同的参数格式压缩整个目录。比如: Osgarchive –a archive.osga –i mydirectory .osga格式还支持主文件的形式,即,设置添加到压缩包的第一个文件是主文件。
2:列出压缩包中的文件
我们可以使用-l参数来列出指定压缩包中的所有文件: Osgarchive –a archive.osga –l 会打印出如图2.3所示列表:
图 2.3 osgarchive列表功能
3:从压缩包中解压出文件
我们使用-e <filename> [<filename>…]的形式从指定压缩包中解压文件: 比如:osgarchive –a archive.osga –e cow.osg
4:使用压缩包文件
压缩包文件可以按照普通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");
5:为osgdem的分页数据生成压缩包
Osgdem程序支持生成的.osga压缩文件,我们只要指定-a <filename>就可以将生成文件打包,在今后我们会详细讲解osgdem的应用的。
6:支持压缩的文件格式
OpenSceneGraph的压缩包机制允许使用istream和ostream来操作压缩包的数据流,但是并不是所有的3D模型和图片格式都支持istream和ostream操作。下面列出了目前支持压缩包机制的几种文件格式:
.osg OpenSceneGraph 本地ASCII格式
.ive OpenSceneGraph 本地二进制格式
.dds DirectDrawSurface图片文件格式
.jp2 JPEG2000图片文件格式
眼看着上面的格式显然不是太多,但是通常我们可以将任何的格式,比如FLT和3DS的格式,都转成OSG的格式,而OSG的格式呢,又都会转成IVE的格式,如果我们有自己的格式,那么要使用osgarchive的话就需要改写它里面的代码了,不是十分难。
4 osgConv格式转换与压缩
Osgconv在早些年就已经大名鼎鼎,在开始的时候,无论我们将什么格式转换成OSG格式,那么别人获得后都可以查看以及改动,自从osgconv出现后,改变很多。它与OSG的二进制发布格式IVE相呼应,可以把一个,乃至数个文件压缩到一个ive当中,这与osgarchive的不同是:比如A与B都压缩进了c.ive,其实叫转换更合适一些,因为osgConv并不具备太多的压缩功能。
如果这时osgviewer c.ive那么就会看到A和B都出现在视口中,但是如果是osgarchive把A和B都压入了c.osga中,那么查看时只会出现头文件。不是A就是B。
osgconv的意义是把多个模型归为一个以及发布它。而osgarchive的意义是模型归档后可以调度其中的一个模型。这使得pagedLod在其中大放光彩,osgdem采用的就是osga格式来调度压缩包OSGA中的各文件。
首先来举一例来说明它最经常的用途:转换OSG文件格式为IVE文件格式 Osgconv glider.osg glider.ive 这样就会生成一个glider.ive文件 osgConv glider.osg cow.osg a.ive 这样就生成一个a.ive文件,而且在osgViewer a.ive时会同时看到牛和小飞机,只不过小飞机在牛内部,得“走”进去看,因为小飞机太小了。 现在我们来看一下osgconv命令行的其它功能。如表5所示:
表 5 osgConv的功能
命令行 功能
- O 没有实际意义,表示读写数据操作
--compressed 启用压缩纹理,默认采用OpenGL ARB压缩
--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 <mode_string> 使用mode_string模式来修正透明属性,mode_string有以下待选值: MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE MAKE_ALL_STATESET_OPAQUE
-l libraryName 添加一些插件库来读写数据,比如:-l osgdb_pfb
-e extensionName 在上面添加一些读写插件,-e让osgConv识别该扩展名,比如:-e pfb
-o orientation 改变转换模型的坐标原点,建议不要使用。
-t translation 转化时移动模型,建议不要使用
-s scale 转化时旋转模型
-smooth 用重定位法线的方法来光滑模型
--addMissingColors 用白色来添补缺的块什么的,这些块本身没有颜色
-h或--help 打印所有的帮助信息
在这里再强调一下osgconv的重要性,这些工具当中,除却osgviewer之外,用的最多的就是osgconv了。本身它就是非常非常重要的一个工具。