查看: 1290|回复: 8

自定义场景文件一问

[复制链接]

该用户从未签到

发表于 2011-6-14 14:44:10 | 显示全部楼层 |阅读模式
想用第二代序列化存储的方式存取自己的场景结构描述文件,比如建立一个场景如下:一个根节点root(Group) 下面一个模型节点 cow(osg::Node* cow=osgDB::readNodeFile("cow.osg")),将该场景保存为一个场景描述文件如下
Group{
         cow.osg
         }

因为cow已经在一个模型文件里,所以这里的场景描述文件只是该文件模型的一个文件引用,不会将cow.osg的数据保存到这个新的场景描述文件(这是重新定义wrapper的主要原因),当然,事实上的场景描述文件要复杂得多。比如Group、MatrixTransform等类的wrapper需要定义。很多地方都要改。思考了一下流程,感觉还是有点麻烦,麻烦倒是次要的,最关键的是感觉不是按照正常方式扩展的,使得程序有点乱,实现这种要求的话,有没有更直接的方式?

该用户从未签到

 楼主| 发表于 2011-6-14 15:06:17 | 显示全部楼层
本帖最后由 oman 于 2011-6-14 16:46 编辑

另外,如果InputStream和OutputStream的读写Ojbect的接口设置成Virtual会好些,个人感觉,否则派生这两个类就把基类的给隐藏了,容易出问题。

该用户从未签到

发表于 2011-6-15 08:21:15 | 显示全部楼层
InputStream和OutputStream不建议派生,因为绝大多数情况下没有派生它们的必要

在我看来您完全可以用一个UserGroup类来记录自己的信息,并直接实现它的wrapper和serializers,这比大动干戈去重写函数体要简单得多

该用户从未签到

 楼主| 发表于 2011-6-15 08:32:12 | 显示全部楼层
这种方式我想过,但问题是不单单是Group类,重写自己的Group类的话,其它相关类也都要派生新的,比如Lod,Transform等,一样动作不小。InputStream和OutputStream现在的情况也可以用,就是用着不舒服。

该用户从未签到

发表于 2011-6-15 08:33:38 | 显示全部楼层
那么您可以自己把所有的wrapper都实现一遍,然后生成osgdb_serialzier_osg.dll替代原有的就可以了

该用户从未签到

 楼主| 发表于 2011-6-15 08:55:27 | 显示全部楼层
我是要用到什么类就实现相应的warpper的,但不能替代原有的osgdb_serialzier_osg.dll,两者要共存,因为我只是读我自己的场景描述文件用我的wrapper,读模型文件什么的还是用原有的osgdb_serialzier_osg.dll,所以要共存,只是在读我的场景文件时从我自己的wrapperManager中去找我自己的wrapper实现,所以要重写Stream

该用户从未签到

发表于 2011-6-16 08:21:04 | 显示全部楼层
我有点糊涂了,您说的“重写自己的Group类的话,其它相关类也都要派生新的,比如Lod,Transform等”,以及“我只是读我自己的场景描述文件用我的wrapper”,这两句话有什么关联?我始终没有太搞清楚您的真正需求,以及您是否真的需要用osg的本地格式来保存自己的特定描述数据

该用户从未签到

 楼主| 发表于 2011-6-16 08:58:10 | 显示全部楼层
现在用重写Stream类的方式已经实现的很好了,也不怎么麻烦,就是有两个接口是隐藏父类而不是覆盖而已。这种方式跟您的序列化方式完全一样,用起来很方便,代码结构也非常清晰,扩展也非常方便,感谢二代文件,感谢array的奉献

该用户从未签到

 楼主| 发表于 2011-6-16 08:59:27 | 显示全部楼层
而且不用重写所有的wrapper,需要哪个写哪个,没写的就直接用原有的,很好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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