查看: 5821|回复: 2

osgb文件读写流程的问题,求教

[复制链接]

该用户从未签到

发表于 2011-6-3 10:35:57 | 显示全部楼层 |阅读模式
看了osg2(我主要关注osgb二进制格式)的插件,对它是如何从文件将文件中的模型节点结构读取出来的没看明白,希望明人指点:
从readNode——>readObject  再到  osgDB::InputStream的readObject 又到osgDB::InputStream 的 readObjectFields,一路盘根错节差不多到了半山腰,也没见什么具体数据的读取的影子,接下来进入readObjectFields,感觉最后的根根节节都在这里呢,首先应该是根据文件顶级父节点(文件根节点)的类型(节点类名)获取对应的对象封皮ObjectWrapper,然后从对象封皮克隆出一个对象来,这个对象还没有文件中对应的具体数据,然后循环对象封皮的Associates,每一个Associates又对应一个对象封皮,找到这个封皮调用封皮的assocWrapper->read( *this, *obj ),然后我们进入到封皮里面的世界,封皮里有好多的序列化器(应该是读取不同的数据类型的),循环所有的序列化器调用serializer->read(is, obj),最后,封皮里还有好多FinishedObjectReadCallback,又调用它们的read(现在应该是没有用到,搜了一下,没有一个实例化得FinishedObjectReadCallback,目前只有一个抽象的FinishedObjectReadCallback存在,估计是为了以后的扩展);到这里差不多就完了,自己天分不行,愣是没看明白怎么把文件中的Group啊PagedLod啊等等一系列节点按照相应的逻辑关系给创建起来。哪位高人给指点指点。
特别是,ObjectWrapper起什么作用?
ObjectWrapper中的Associates又是什么?
我的感觉是,关键的地方可能就在上面这两个东东,可行没看明白,⊙﹏⊙b汗

该用户从未签到

发表于 2011-6-3 16:14:08 | 显示全部楼层
这个格式的核心都是我一个人完成的,但是我却读不懂您的文字,不知道您想要说些什么

OSG中的每一个场景类(Node,Group等)都有一个对应的wrapper类,用于写出/读入场景类的数据。ObjectWrapper就是场景类的封装者,而所有osgWrappers/serializers中的内容都是封装每个类的具体内容

Associates相当于记录了某个类的继承关系,例如osg::Object -> osg::Node -> osg::Group -> osg::Switch,它会被解析为一个类名称的队列
那么readObjectFields()中会根据每次从Associates队列中读出一个类名称,根据名称查找相应的wrapper,然后执行wrapper的读取/写入功能
编写一整套serializers机制大概花费了我一个月的时间,而这套系统现在已经基本得到了整个osg-users的肯定和应用,并且在大家的不断提交修改的过程中逐步完善了,它会在以后逐步替代原有的.osg和.ive格式

该用户从未签到

 楼主| 发表于 2011-6-3 16:16:37 | 显示全部楼层
大致明白了,有时间我再研究研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表