查看: 4034|回复: 6

Node/Group/Geode/Drawable之间的关系和区别是怎样的?

[复制链接]

该用户从未签到

发表于 2008-12-28 11:23:45 | 显示全部楼层 |阅读模式
我知道它们之间的继承关系,但不理解如何在它们之间进行转换?

如将drawable添加到geode中,node又加入group中,node与group是如何相互转换的? 我该看些什么资料能理解这些关系?

我下面的代码编译是正确的,但链接就出错,不知道错在哪里?



#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/MatrixTransform>

void main()
{

    osgViewer::Viewer viewer;

        osg::Group * root = new osg::Group() ;

        osg::Node *gliderNode = osgDB::readNodeFile("glider.osg") ;

       gliderNode->asGroup()->addChild(osgDB::readNodeFile("axes.osg"));
       
        root ->addChild(osgDB::readNodeFile("osgcool.osg")) ;

        root->addChild(gliderNode);


        viewer.setSceneData(root);

        viewer.realize();

         viewer.run();

}

该用户从未签到

发表于 2008-12-28 13:48:00 | 显示全部楼层
这个比较简单,,,,你可以看一下文档中的继承关系图,,,osg::Geode和osg::Group都是继承自osg::Node的~~~~~~
你上面那种转换是错误的,,,简单的,,因为只有node是group节点的时候才能那样转换的,,否则返回的是0~~~~~

该用户从未签到

发表于 2008-12-28 14:22:02 | 显示全部楼层
这是一种名为“装饰”的设计模式。Drawable可以理解为最终要绘制的物件,通常是可绘制的顶点数据列表,它只能被添加到场景节点树的末端节点上,也就是Geode节点。Geode不能再有子节点。
Group节点是场景节点树的重要组成部分,单纯的Group节点只作分支之用,我们更常使用的是派生自Group的开关节点Switch,位置变换节点Transform,以及LOD等。Group节点可以有一个或多个子节点。
Node节点是所有节点类的基类。这些基本概念可以参考《OSG快速入门指导》这本书,虽然是基于OSG 1.2版本编写的,但基本概念依然很有助益

一个比较标准的节点类型转换做法是使用dynamic_cast操作符:
  1. osg::Group* gliderGroup = dynamic_cast<osg::Group*>(gliderNode);
  2. if (gliderGroup) gliderGroup->addChild(osgDB::readNodeFile("axes.osg"));
复制代码
当然您的方法也是可以的,即使用asGroup()函数,但是要注意返回的指针是否为NULL,也就是不能进行转换。例如此处您试图将Geode节点转换成Group节点,由于这两者没有继承关系,因此转换会失败,注意readNodeFile的返回值可能是Group,Geode或者其它节点类型(均返回虚基类Node类型,可以用dynamic_cast尝试转换),这取决于模型文件的内容

[ 本帖最后由 array 于 2008-12-28 14:31 编辑 ]

该用户从未签到

 楼主| 发表于 2008-12-28 21:02:46 | 显示全部楼层
谢谢两位版主!

我还有疑问:
array版主说“readNodeFile的返回值可能是Group,Geode或者其它节点类型(均返回虚基类Node类型,可以用dynamic_cast尝试转换),这取决于模型文件的内容”, 我在程序中如

何判断readNodeFile()返回值的类型是Group,Geode或者其它节点类型?

该用户从未签到

发表于 2008-12-28 21:07:32 | 显示全部楼层
如果的确无法预知模型文件的根节点类型,一个简单的方法是使用className()函数,它返回一个字符串名称(例如"Group","Switch"),几乎所有的Node派生类节点都会使用META_Node宏重写这个函数。

该用户从未签到

 楼主| 发表于 2008-12-29 21:06:24 | 显示全部楼层
谢谢array指点!

该用户从未签到

发表于 2008-12-29 22:10:34 | 显示全部楼层
哈哈,我也受这个问题困扰呢,之前还以为读入的一般都是group类型,后来发现什么类型的都有。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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