查看: 2267|回复: 10

如何判断一个节点为叶子节点?

[复制链接]

该用户从未签到

发表于 2009-8-25 20:48:58 | 显示全部楼层 |阅读模式
如题。
就是 一个Node节点如何判断它没有子节点。

该用户从未签到

发表于 2009-8-25 21:37:55 | 显示全部楼层
看其孩子节点个数。 node->asgroup()->getNumchildren().

该用户从未签到

发表于 2009-8-25 22:16:12 | 显示全部楼层
也可以直接使用asGeode()函数,如果返回至不是NULL,那么就是叶节点。这个方法是所有方法中最快的

该用户从未签到

 楼主| 发表于 2009-8-26 15:41:53 | 显示全部楼层
我现在还有个问题:

比如:我在3Dmax中画了一个长方体,然后将其复制出另外一个。然后将其转换成ive格式的文件。

通过asGeode()函数来遍历叶节点。设置名称。会发现,这两个图会有相同的名字。

我的本意是想让所有模块都有唯一的赋值。

是不是通过复制这种方式获得的模块就是放到了一个Geode节点里了。

那应该如何分离呢?

就是下图这种情况
OSG_Demo_PNG1.PNG

该用户从未签到

发表于 2009-8-26 17:27:23 | 显示全部楼层
我不明白您的意思,也许您需要更详细地解释自己的意图

该用户从未签到

 楼主| 发表于 2009-8-26 17:55:54 | 显示全部楼层
本帖最后由 working123 于 2009-8-26 17:58 编辑


是这样
我通过
  1. void CCoreOSG::setRoot(osg::ref_ptr<osg::Group> geode,int &tag)
  2. {
  3.         CString cs;
  4.         for(int i=0;i<geode->getNumChildren();i++)
  5.         {
  6.                 if(geode->getChild(i)->asGeode() == NULL)
  7.                 {
  8.                         geode->getChild(i)->setName("");
  9.                         setRoot(geode->getChild(i)->asGroup(),tag);
  10.                 }
  11.                 else {
  12.                 cs.Format("%d",tag);
  13.                 geode->getChild(i)->setName(cs);
  14.                 tag++;               
  15.                 }
  16.                 }
  17.         }
  18. }
复制代码
该方法的目的就是设置所有的节点拥有唯一标示
通过使用其他例子来测试,这个方法是可行的。所有的模块的名字都被相应设为“0”,“1”,“2”.......

但是只有这种情况是不可行的,就是在上个例子中所看到的两个模块的名字都被设置为了“1”。

我想知道通过一种什么方法才能避免这种情况。

该用户从未签到

发表于 2009-8-26 22:16:16 | 显示全部楼层
我还是不明白,cs不是您自己设置的吗?如果被设置成同一个名字,那应该是您自己的程序问题吧?或者您需要在3dsmax建模过程中注意调整节点的名字

该用户从未签到

 楼主| 发表于 2009-8-27 11:10:25 | 显示全部楼层
恩,

是这样,上面的那段代码的作用就是:
遍历Group中的所有节点,对于叶子节点进行赋值,cs值是自己设的。就是所有的叶子节点都存在一个属于自己的值。

我现在怀疑就是上面的两个图形模块存在于一个叶子节点上。所以为叶子节点付一个唯一值。导致这两个模块具有同样的节点名称。那如果是这样,就是一个Geode节点上具有两个模块的话,我应该如何区分这两个模块呢? 因为我区分模块的方法是通过它的Geode节点的名字的异同来解决的。显然这种方式是不能区分上面的那种情况。那我应该用什么方法来区分这两个模块呢?

该用户从未签到

发表于 2009-8-27 12:35:54 | 显示全部楼层
那么说明那两个立方体是两个Drawable对象,您可以给每个Drawable命名;也可以手动把它们分割到不同的Geode下,不过后者通常意义不大

该用户从未签到

 楼主| 发表于 2009-8-27 16:05:11 | 显示全部楼层
本帖最后由 working123 于 2009-8-27 16:07 编辑

那我现在的问题就是:

现在我在场景中做一个单击事件,获取新的模块列表,我如何判断哪个是drawable?

对了

还有

那个drawable是节点对象吗?

该用户从未签到

发表于 2009-8-27 16:53:47 | 显示全部楼层
drawable当然不是节点,不过它的信息也保存在IntersectionVisitor的计算结果中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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