OpenSceneGraph程序设计 www.osgChina .org 第二章:OsG基础 切换线程模式 在显示帧速,显示场景时间信息与什么都不显示之间来回切换 t 在有无纹理之间切换 W 在实体模式,多边形模式,点集模式之间来回切换 在记录路径与否之间切换 2.2.2 osgVersion库版本检测 osgVersior应该是这四个程序当中用的最少的一个,它的功能很简单,就是查阅相关的版本信息。命令行参 数如表2.3: 表2.3 osgVersion的功能 命令行 功能 h或者help 在屏幕上输出帮助信息 --entries 在屏幕上输出每个版本更新时的贡献者数目 --version-number 只打印版本号 --soversion-number 只打印共享对象的版本号 --openthreads-version-number 打印openthreads的版本号 -ope nthreads-soversion-number只打印openthreads的共享版本号 -r<file>或者-read<file> 读取一个文件用来输出版本更新日志中的贡献者 通常我们在使用osgversion都只是直接输入它,判断一下当前版本。很多安装包中都没有osgversion,因为 在项目编译的时候,它会少一些引号多一些问号等等,可能是由于编码问题,总之人们不愿意去管它,可 见它的不重要性。 2.2.3 osgArchive数据归档器 osgArchive的重要性怎么强调都不为过,它首先是为众多OsG文件以及IVE文件打包提供了一个工具,最主 要的还是它所生成的OSG文件是整个文件,可以为海量数据的存放提供良好的支持。换句话说,你可以先 把数据的结点组织好,然后压在一起,最后读一下就可以了。osgArchive是一个压缩工具,曾经在VRDEV 上有人问过关于它的问题,FLMN形象的比喻道:它就像是ZP一样,是个压缩包。可以压缩与解压的工具。 来看一下它的重要的操作,如表2.4所示。 表2.4 osgArchive的功能 命令行 功能 h或者-help 它本身没有什么帮助信息,所以这条命令用处不大 a或者-archive 指定osga包名,只是指定要操作的包,在后面会举示例说明用途 i或者-insert 在包中插入模型,例如:osgarchive-a archive.osga-icow.osg glider.osg e或者-extract 抽取包中文件,例如:osgarchive-a archive.osga-ecow.osg 或者-ist 列出包中所有文件,例如:osgarchive-a archive.osga 下面来实例看一下osgArchive的重要功能,注意有的命令是可以替代的,比如-a也可以用-archive故不再多 加描述。 33
OpenSceneGraph 程序设计 www.osgChina.org 第二章:OSG 基础 33 m 切换线程模式 s 在显示帧速,显示场景时间信息与什么都不显示之间来回切换 t 在有无纹理之间切换 w 在实体模式,多边形模式,点集模式之间来回切换 z 在记录路径与否之间切换 2.2.2 osgVersion 库版本检测 osgVersion 应该是这四个程序当中用的最少的一个,它的功能很简单,就是查阅相关的版本信息。命令行参 数如表 2.3: 表 2.3 osgVersion 的功能 命令行 功能 -h 或者--help 在屏幕上输出帮助信息 --entries 在屏幕上输出每个版本更新时的贡献者数目 --version-number 只打印版本号 --soversion-number 只打印共享对象的版本号 --openthreads-version-number 打印 openthreads 的版本号 --openthreads-soversion-number 只打印 openthreads 的共享版本号 -r <file> 或者 --read <file> 读取一个文件用来输出版本更新日志中的贡献者 通常我们在使用 osgversion 都只是直接输入它,判断一下当前版本。很多安装包中都没有 osgversion,因为 在项目编译的时候,它会少一些引号多一些问号等等,可能是由于编码问题,总之人们不愿意去管它,可 见它的不重要性。 2.2.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 故不再多 加描述
OpenScene Graph程序设计 www.osgChina .org 第二章:OSG基础 1:创建新的压缩包。 创建新压缩包时,需要通过-a<filename>来指定压缩包的文件名,包括其括展名osga,然后将3D文件和图 片以-i<filename>[<filename>:J的格式添加到压缩包中。如下所示: Osgarchive-a archive.osga-i cow.osg glider.osg 完成后可以在data中查看到生成了新文件archive.osga,我们也可以使用相同的参数格式压缩整个目录。比如: Osgarchive-a archive.osga-i mydirectory .osga格式还支持主文件的形式,即,设置添加到压缩包的第一个文件是主文件。 2:列出压缩包中的文件 我们可以使用参数来列出指定压缩包中的所有文件: Osgarchive-a archive.osga-l 会打印出如图23所示列表: C:\>osgarchive -1-a archive.osga List of files in archive: cow.osg glider.osg Master file cow.osg 图2.3 osgarchive列表功能 3:从压缩包中解压出文件 我们使用-e<filename>:【<filename>]的形式从指定压缩包中解压文件: 比如:osgarchive-a archive.osga-ecow.osg 4:使用压缩包文件 压缩包文件可以按照普通OSG文件的形式来读取,此时第一个解压的文件将做为osgDB返回的结果,如果 要另载压缩包的主文件的话,只需要执行: Osgviewer archive.osga 如果希望读取压缩包中的某个文件,则输入: Osgviewer archive.osga/glider.osg 本例是将会输出那个小飞机 编写代码时我们可以按照类似的方式实现压缩包的读取: os g::ref_ptr<osg::Node>masterNode =osgDB::read Node File("a rchive .os ga"); osg::ref_ptr<osg:Node>gliderNode=osgDB::readNodeFile("archive.osga/glider.osg"); 5:为osgdem的分页数据生成压缩包 Osgdem程序支持生成的.osga压缩文件,我们只要指定-a<filename>就可以将生成文件打包,在今后我们会 详细讲解osgdem的应用的。 34
OpenSceneGraph 程序设计 www.osgChina.org 第二章:OSG 基础 34 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 的应用的
OpenScene Graph程序设计 www.osgChina .org 第二章:OsG基础 6:支持压缩的文件格式 OpenSce neGraph的压缩包机制允许使用istream和ostream来操作压缩包的数据流,但是并不是所有的3D 模型和图片格式都支持istream和ostream操作。下面列出了目前支持压缩包机制的几种文件格式: ●.osg OpenSceneGraph本地ASCI格式 ●.ive OpenSceneGraph本地二进制格式 ●.dds DirectDrawSurface图片文件格式 ●jp2PEG2000图片文件格式 眼看着上面的格式显然不是太多,但是通常我们可以将任何的格式,比如FLT和3DS的格式,都转成OSG 的格式,而OSG的格式呢,又都会转成VE的格式,如果我们有自己的格式,那么要使用osgarchive的话就 需要改写它里面的代码了,不是十分难。 2.2.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文件格式为E文件格式 Osgconv glider.osg glider..ive这样就会生成一个glider..ive文件 osgConv glider..osg cow.osga.ive这样就生成一个a.ive文件,而且在osgViewer a.ive时会同时看到牛和小飞 机,只不过小飞机在牛内部,得“走”进去看,因为小飞机太小了。 现在我们来看一下osgconv命令行的其它功能。如表2.5所示: 表2.5 osgConv的功能 命令行 功能 -0 没有实际意义,表示读写数据操作 --compressed 启用压缩纹理,默认采用OpenGL ARB压缩 --compressed-arb 采用OpenGL ARB压缩纹理 -compressed-dxt1 采用S3 TC DXT1压缩纹理 --compressed-dxt3 采用S3 TC DXT3压缩纹理 --compressed-dxt5 采用S3 TC 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 libraryName 添加一些插件库来读写数据,比如:osgdb_pfb -e extensionName 在上面添加一些读写插件,e让osgConv识别该扩展名,比如:epfb -o orientation 改变转换模型的坐标原点,建议不要使用。 35
OpenSceneGraph 程序设计 www.osgChina.org 第二章:OSG 基础 35 6:支持压缩的文件格式 OpenSceneGraph 的压缩包机制允许使用 istream 和 ostream 来操作压缩包的数据流,但是并不是所有的 3D 模型和图片格式都支持 istream 和 ostream 操作。下面列出了目前支持压缩包机制的几种文件格式: .osg OpenSceneGraph 本地 ASCII 格式 .ive OpenSceneGraph 本地二进制格式 .dds DirectDrawSurface 图片文件格式 .jp2 JPEG2000 图片文件格式 眼看着上面的格式显然不是太多,但是通常我们可以将任何的格式,比如 FLT 和 3DS 的格式,都转成 OSG 的格式,而 OSG 的格式呢,又都会转成 IVE 的格式,如果我们有自己的格式,那么要使用 osgarchive 的话就 需要改写它里面的代码了,不是十分难。 2.2.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 命令行的其它功能。如表 2.5 所示: 表 2.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 改变转换模型的坐标原点,建议不要使用
OpenSceneGraph程序设计 www.osgChina.org 第二章:OsG基础 -t translation 转化时移动模型,建议不要使用 -s scale 转化时旋转模型 --smooth 用重定位法线的方法来光滑模型 --addMissingColors 用白色来添补缺的块什么的,这些块本身没有颜色 h或help 打印所有的帮助信息 在这里再强调一下osgconv的重要性,这些工具当中,除却osgviewer之外,用的最多的就是osgconv了。 本身它就是非常非常重要的一个工具。 2.3小结 本章开始讲解了OSG的基本程序设置,并且设计了一个EWER,下一章会开始一些最基本的操作,包括在 OSG内使用NODE,GROUP组织模型,移动,旋转,缩放以及使用路径控制这些模型,以及访问模型中的一 些结点等等。 下一小节的类参考有些函数可能不知道具体有何用处,如果在以后碰到可以到这里来反查一下。 2.4本章所用类参考 2.4.1 osgViewer:Viewer 类描述: 为一个单独的场景[scene]保存一个单独的view. 类继承图表: osg::Referenced osg::Referenced 0sg-Object osg:Object osg::View osgGA::GUlActionAdapter osgViewer::ViewerBase osgViewer:View osgViewer::Viewer 类中方法: 1:Viewer() 2:Viewer(osg:ArgumentParser &arguments) 36
OpenSceneGraph 程序设计 www.osgChina.org 第二章:OSG 基础 36 -t translation 转化时移动模型,建议不要使用 -s scale 转化时旋转模型 --smooth 用重定位法线的方法来光滑模型 --addMissingColors 用白色来添补缺的块什么的,这些块本身没有颜色 -h 或--help 打印所有的帮助信息 在这里再强调一下 osgconv 的重要性,这些工具当中,除却 osgviewer 之外,用的最多的就是 osgconv 了。 本身它就是非常非常重要的一个工具。 2.3 小结 本章开始讲解了 OSG 的基本程序设置,并且设计了一个 VIEWER,下一章会开始一些最基本的操作,包括在 OSG 内使用 NODE,GROUP 组织模型,移动,旋转,缩放以及使用路径控制这些模型,以及访问模型中的一 些结点等等。 下一小节的类参考有些函数可能不知道具体有何用处,如果在以后碰到可以到这里来反查一下。 2.4 本章所用类参考 2.4.1 osgViewer::Viewer 类描述: 为一个单独的场景[scene]保存一个单独的 view. 类继承图表: 类中方法: 1:Viewer() 2:Viewer (osg::ArgumentParser &arguments)
OpenSceneGraph程序设计 www.osgChina.org 第二章:OSG基础 3:Viewer(const osgViewer::Viewer &viewer,const osg::CopyOp ©op=osg:CopyOp::SHALLOW_COPY) 说明:是Viewer的构造函数。其中第一个为常见的构造函数。第二个构造函数为从类osg:ArgumentParser 中传递参数入Viewer,类ArgumentParser可以获取main入口参数以及程序的其它信息,也可以判断传参是 否有误。第三个重载的构造函数为从另一个Viewer创建新Viewer,.里面的第一个参数表示源Viewer,而第 二个参数表示使用的拷贝类型,参数主要有两个,一个是浅拷贝:SHALLOW_COPY,另一个则是深拷贝: DEEP_COPY_OBJECTS,关于拷贝类型的不同和利弊可以参照一般C+书籍。关于OSG中的拷贝类型可以参照 类osg:CopyOp。 参数 名称 类型 描述 arguments osg:ArgumentParser 参数传递参数,Viewer会从中提取关于程序和输入的参数。 viewer const osgViewer:Viewer 源Viewer,.从该Viewer复制新Viewer。. copyop const osg::CopyOp& 拷贝类型,有默认值浅拷贝SHALLOW COPY virtual ~Viewer ( 说明:析构函数 META_Object (osgViewer,Viewer) 说明:是一个宏,宏中定义了标准Clone,且具有isSameAs,.ClassName,accept三个重要方法。目的是让从 Node派生的子类方便的定义所需要的纯虚方法。 参数 名称 类型 描述 osgViewer 父类名 Viewer 子类名 virtual void take(View &rhs) 说明:功能是从一个View中得到它的所有设置,这其中包括相机和子相机以及子视口等等,得到后View 会被销毁。 参数 名称 类型 描述 Rhs View& 从该View中获取它的设置 virtual bool readConfiguration(const std::string &filename) 说明:该方法是从类osgViewer::ViewerBase中继承下来的方法,功能是读取一个配置文件来配置Viewer.现 实中并不是常用读配置文件的方法来设置Viewer.如果读取成功,则返回True,返则返回假。 参数 名称 类型 描述 filename const std::string 该配置文件的名称,可以带路径名 virtual bool isRealized()const 说明:该方法是从类osgViewer::ViewerBase中继承下来的方法,功能是看Viewer是否己经执行了Realize 操作,如果执行了则返回真,事则返回假。 virtual void realize ( 37
OpenSceneGraph 程序设计 www.osgChina.org 第二章:OSG 基础 37 3:Viewer (const osgViewer::Viewer &viewer, const osg::CopyOp ©op=osg::CopyOp::SHALLOW_COPY) 说明:是 Viewer 的构造函数。其中第一个为常见的构造函数。第二个构造函数为从类 osg::ArgumentParser 中传递参数入 Viewer,类 ArgumentParser 可以获取 main 入口参数以及程序的其它信息,也可以判断传参是 否有误。第三个重载的构造函数为从另一个 Viewer 创建新 Viewer,里面的第一个参数表示源 Viewer,而第 二个参数表示使用的拷贝类型,参数主要有两个,一个是浅拷贝:SHALLOW_COPY,另一个则是深拷贝: DEEP_COPY_OBJECTS,关于拷贝类型的不同和利弊可以参照一般 C++书籍。关于 OSG 中的拷贝类型可以参照 类 osg::CopyOp。 参数 名称 类型 描述 arguments osg::ArgumentParser & 参数传递参数,Viewer 会从中提取关于程序和输入的参数。 viewer const osgViewer::Viewer & 源 Viewer,从该 Viewer 复制新 Viewer。 copyop const osg::CopyOp & 拷贝类型,有默认值浅拷贝 SHALLOW_COPY virtual ~Viewer () 说明: 析构函数 META_Object (osgViewer, Viewer) 说明:是一个宏,宏中定义了标准 Clone,且具有 isSameAs,ClassName,accept 三个重要方法。目的是让从 Node 派生的子类方便的定义所需要的纯虚方法。 参数 名称 类型 描述 osgViewer 父类名 Viewer 子类名 virtual void take (View &rhs) 说明:功能是从一个 View 中得到它的所有设置,这其中包括相机和子相机以及子视口等等,得到后 View 会被销毁。 参数 名称 类型 描述 Rhs View& 从该 View 中获取它的设置 virtual bool readConfiguration (const std::string &filename) 说明:该方法是从类 osgViewer::ViewerBase 中继承下来的方法,功能是读取一个配置文件来配置 Viewer.现 实中并不是常用读配置文件的方法来设置 Viewer.如果读取成功,则返回 True,返则返回假。 参数 名称 类型 描述 filename const std::string & 该配置文件的名称,可以带路径名 virtual bool isRealized () const 说明:该方法是从类 osgViewer::ViewerBase 中继承下来的方法,功能是看 Viewer 是否已经执行了 Realize 操作,如果执行了则返回真,事则返回假。 virtual void realize ()