查看: 1734|回复: 4

osg场景树的一个现象

[复制链接]

该用户从未签到

发表于 2010-1-15 21:01:26 | 显示全部楼层 |阅读模式
本帖最后由 sunjs 于 2010-1-15 21:04 编辑

情况一:(注意group只有一个孩子)
三级3个节点:root、group、node
关系:root->addChild(group.get());
      group->addChild(node.get());
      node = osgDB::readNodeFile("cow.osg");
      viewer->setSceneData(root.get());
调试查看,结果出乎我的意料:
root children 个数1个:内存地址为:node的内存地址,也就是说node成了root的直接孩子;
group children 个数1个:内存地址也为:node的地址,也就是说node仍然是group的直接孩子;
node parents 个数2个:内存地址分别为:root的地址和group的地址,也就是说node有两个直接父节点,分别为root 和 group
这与我预期不一样。
=================================================
情况二:(注意group有多个孩子)
三级4个节点:root、group、node1、node2
关系:root->addChild(group.get());
      group->addChild(node1.get());
      group->addChild(node2.get());
      node1 = osgDB::readNodeFile("cow.osg");
      node2 = osgDB::readNodeFile("cessna.osg");
      viewer->setSceneData(root.get());
调试查看,结果与预期一致:
  即root有一个直接孩子group;
  group有两个直接孩子node1和node2
=================================================
各位是否也发现同样问题?请多发表高见啊!

该用户从未签到

发表于 2010-1-17 09:03:58 | 显示全部楼层
答案是不可能存在这样的问题,一定是您自己的代码编写有误,或者判断方法有误

该用户从未签到

 楼主| 发表于 2010-1-18 22:50:13 | 显示全部楼层
2# array


#include <Windows.h>
#include <osg/Node>
#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

#include <osgUtil/Optimizer>

int main()
{
        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
        osg::ref_ptr<osg::Group> root = new osg::Group;

        //////////////////////////////////////////////////////////////////////////
        osg::ref_ptr<osg::Group> group = new osg::Group;
        group->addChild(node.get());
        root->addChild(group.get());
        //////////////////////////////////////////////////////////////////////////

        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        viewer->setSceneData(root.get());

        osgUtil::Optimizer* optimizer = new osgUtil::Optimizer;
        optimizer->optimize(root.get());

        group->removeChildren(0, 1);   // 删除group下的孩子

        viewer->run();

        return 0;
}

Array,能不能帮我解释下
osgUtil::Optimizer* optimizer = new osgUtil::Optimizer;
optimizer->optimize(root.get());
这两行的原理啊?
我发现,当没有这两行时,渲染并不会显示牛;而当上面两行加上去之后牛仍然显示,说明场景中的数据已经于group没有关系了。我现在对以上两行的优化原理是一头雾水啊!上网搜了很久也没有搜到比较好的文档,自己看了下源码,依然是云里雾里的,Array能否解释下,希望详细点!谢谢!

该用户从未签到

发表于 2010-1-19 08:44:47 | 显示全部楼层
Optimizer的确会简化场景树的结构,合并几何数据,以及清除它认为无用的节点和纹理数据等等。比如您自己的结构:

root - group - cow

对于Optimizer来说,中间的group节点是无用并且可去除的,从这段程序来看也正是如此。如果您认为这样的优化作法有问题(事实上多数情况下,的确可能不符合实际的要求),可以不使用Optimizer,它并不是必需的

该用户从未签到

 楼主| 发表于 2010-1-19 13:28:54 | 显示全部楼层
4# array
多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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