查看: 1219|回复: 1

OSG编程指南代码的疑问

[复制链接]

该用户从未签到

发表于 2011-12-5 10:53:02 | 显示全部楼层 |阅读模式
在《OSG三维渲染引擎编程指南》上的pick例子中
node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;这两行代码是什么意思呢?有劳各位提点一下!谢谢。

整个函数的代码是:
//对象选取事件处理器
        void pick (osg::ref_ptr<osgViewer::View> view, float x, float y)
        {
                osg::ref_ptr<osg::Node> node = new osg::Node();
                osg::ref_ptr<osg::Group> parent = new osg::Group();
                //创建一个线段交集检测函数
                osgUtil::LineSegmentIntersector::Intersections intersections;
                if(view->computeIntersections(x,y,intersections))
                {
                        osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
                        osg::NodePath& nodePath = intersection.nodePath;
                        //得到选择的物体
                        node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
                        parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
                }

                //用一种高亮显示物体已经被选中
                if(parent.get()&&node.get())
                {
                        osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent.get());
                        if(!parentAsScribe)
                        {
                                osg::ref_ptr<osgFX::Scribe> scribe = new osgFX::Scribe();
                                scribe->addChild(node.get());
                                parent->replaceChild(node.get(),scribe.get());
                        }
                        else
                        {
                                //如果没有选择到,则移除高亮显示的对象
                                osg::Node::ParentList parentList = parentAsScribe->getParents();
                                for(osg::Node::ParentList::iterator itr = parentList.begin();
                                itr!= parentList.end(); ++itr)
                                {
                                        (*itr)->replaceChild(parentAsScribe.get(),node.get());
                                }
                        }
                }

        }

该用户从未签到

发表于 2011-12-5 12:13:51 | 显示全部楼层
nodepath保存的是你选中的节点的路径(从叶节点到根节点),因此node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;的租用是如果选中了一个节点那么,node是geode类型的节点,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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