HI Camile,

You simply need to walk back from of the end of the
Intersection::nodePath to the first group, of which ever one you wan
to use.

If you want to see an example of highlighitng picked items have a look
at the osgkeyboard mouse.

Cheers,
Robert.

On Mon, May 16, 2011 at 11:24 PM, camille matan <techma...@gmail.com> wrote:
> Hi,
> I want to select an object after a picking.
> I found how to do picking but i don't know how to get the group that 
> corresponds to the picked zone.
> My scene is composed of simple shapes (shapedrawable, geodes and group).
> I want to get the first group in the hierarchy.
>
>
>
> Code:
>
> #ifndef _picking_h
> #define _picking_h
>
> #include <osg/MatrixTransform>
> #include <osg/ShapeDrawable>
> #include <osg/PolygonMode>
> #include <osgUtil/LineSegmentIntersector>
>
> #include "includer.h"
> #include "animation.h"
> #include "rotate.h"
> #include "dove.h"
>
>
> class PickHandler : public osgGA::GUIEventHandler
> {
> public:
>    osg::Node* getOrCreateSelectionBox()
>    {
>        if ( !_selectionBox )
>        {
>            osg::ref_ptr<osg::Geode> geode = new osg::Geode;
>            geode->addDrawable(new osg::ShapeDrawable(new 
> osg::Box(osg::Vec3(), 1.0f)) );
>
>            _selectionBox = new osg::MatrixTransform;
>            _selectionBox->setNodeMask( 0x1 );
>            _selectionBox->addChild( geode.get() );
>
>            osg::StateSet* ss = _selectionBox->getOrCreateStateSet();
>            ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
>            ss->setAttributeAndModes( new 
> osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE) );
>        }
>        return _selectionBox.get();
>    }
>
>    virtual bool handle( const osgGA::GUIEventAdapter& ea, 
> osgGA::GUIActionAdapter& aa )
>    {
>        if ( ea.getEventType()!=osgGA::GUIEventAdapter::RELEASE ||
>                        
> ea.getButton()!=osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON ||
>                        
> !(ea.getModKeyMask()&osgGA::GUIEventAdapter::MODKEY_CTRL) )
>            return false;
>
>        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
>        if ( viewer )
>        {
>            osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new 
> osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), 
> ea.getY());
>            osgUtil::IntersectionVisitor iv( intersector.get() );
>            iv.setTraversalMask( ~0x1 );
>            viewer->getCamera()->accept( iv );
>
>            if ( intersector->containsIntersections() )
>            {
>                const osgUtil::LineSegmentIntersector::Intersection& result 
> =*(intersector->getIntersections().begin());
>    //                const osgUtil::LineSegmentIntersector::Intersection& 
> result =*(intersector->getIntersections().begin());
>                osg::BoundingBox bb = result.drawable->getBound();
>                osg::Vec3 worldCenter = bb.center() * 
> osg::computeLocalToWorld(result.nodePath);
>                
> _selectionBox->setMatrix(osg::Matrix::scale(bb.xMax()-bb.xMin(), 
> bb.yMax()-bb.yMin(), bb.zMax()-bb.zMin()) * 
> osg::Matrix::translate(worldCenter) );
>            }
>        }
>        return false;
>    }
>
> protected:
>    osg::ref_ptr<osg::MatrixTransform> _selectionBox;
> };
>
> #endif
>
>
>
>
>
> i think that I do something like that :
> osg::Node = result.drawable->getParent();
> or
> osg::Nodepath = result.nodepath;
> but i want finally a osg::Group.
>
> Thank !!!!!
> Camille[/code]
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=39433#39433
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to