查看: 999|回复: 3

《openscenegraph程序设计》中第五章关于结点的疑问

[复制链接]

该用户从未签到

发表于 2014-4-10 16:11:54 | 显示全部楼层 |阅读模式
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>


class UseEventHandler : public osgGA::GUIEventHandler
{
public:

    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
                osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
                if (!viewer) return false;

        switch(ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        {
                                if (ea.getKey()== 0xFF51)
                                {
                                        viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
                                        viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
                                }
                               
                                if (ea.getKey()== 0xFF53)
                                {
                                        viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(0) ;
                                        viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(1) ;
                                }
                        }
                        break;

                case osgGA::GUIEventAdapter :USH:
                        if(ea.getButton () == 4)
                        {
                                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(0) ;
                                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
                        }
                        break;
                case osgGA::GUIEventAdapter:OUBLECLICK:
                        if(ea.getButton() == 1)
                        {
                                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
                                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(1) ;
                        }
                        break;
                default:
                        break;
                }


        return false;
    }
};


void main()
{
    osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group() ;
   
        root ->addChild(osgDB::readNodeFile("cow.osg")) ;
        root ->addChild(osgDB::readNodeFile("glider.osg"));

        viewer.setSceneData(root.get ());
        viewer.addEventHandler(new UseEventHandler) ;
    viewer.realize();
    viewer.run();
}


看不明白为什么结点1就代表牛(cow),而结点0就代表飞机(glider)呢?

该用户从未签到

发表于 2014-4-10 17:43:55 | 显示全部楼层
viewer ->getSceneData() ->asGroup() ->getChild(i)表示获取根节点下的第i个子节点

root ->addChild(osgDB::readNodeFile("cow.osg")) ;
root ->addChild(osgDB::readNodeFile("glider.osg"));
因为你加入的时候 第一个加入的是牛,第二个加入的是飞机
所以getChild(0)表示牛
getChild(1)表示飞机

root ->addChild(osgDB::readNodeFile("glider.osg"));
root ->addChild(osgDB::readNodeFile("cow.osg")) ;
若你加入的顺序反一下 getChild(0)表示飞机,getChild(1)第一个表示牛

该用户从未签到

 楼主| 发表于 2014-4-10 16:19:36 | 显示全部楼层
if (ea.getKey()== 0xFF51)
                                {
                                        viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
                                        viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
                                }

getChild(1)就是获得1即牛的结点,getChild(0)就是获得0即飞机的结点,为什么啊?怎么理解啊?

该用户从未签到

 楼主| 发表于 2014-4-10 21:22:39 | 显示全部楼层
xhm2010 发表于 2014-4-10 17:43
viewer ->getSceneData() ->asGroup() ->getChild(i)表示获取根节点下的第i个子节点

root ->addChild(os ...

谢谢了,果然是这样的(之前我也是这样理解的,可是和书上写的不一样,特纳闷),我试了试。

是原书中写错了(估计是笔误吧)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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