0

I use OSG on Android...

I initialized indexNode= 0 in the main

int main(int, char **)
{

    osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile( "cessna.osg");
    osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile( "cow.osg" );

    unsigned int indexNode= 0;

    osg::ref_ptr<osg::Group> root = new osg::Group;
    root->addChild( model1.get() );
    root->addChild( model2.get() );

    osg::ref_ptr<PickHandler> picker = new PickHandler;
    root->addChild( picker->getOrCreateSelectionBox() );

    osgViewer::Viewer viewer;
    viewer.setSceneData( root.get() );
    viewer.addEventHandler( picker.get() );
    return viewer.run();

}

and this the part with the print statement

 class PickHandler : public osgGA::GUIEventHandler
{
  public:
         osg::Node* getOrCreateSelectionBox();
  virtual bool handle( const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa );

  protected: osg::ref_ptr<osg::MatrixTransform> _selectionBox;
};


osg::Node* PickHandler::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();
}


bool PickHandler::handle( const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa )
{
  if ( ea.getEventType()!=osgGA::GUIEventAdapter::RELEASE || ea.getButton()!=osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON )
      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() )
        {
          osgUtil::LineSegmentIntersector::Intersection result=*(intersector->getIntersections().begin());
          osg::BoundingBox bb = result.drawable->getBound();


          osg::ref_ptr newnode = result.drawable->getParent(0);
          indexNode= mTransform->getChildIndex(newnode);

          __android_log_print(ANDROID_LOG_INFO,"index","%d\n",indexNode);


          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;
}

these lines:

osg::ref_ptr newnode = result.drawable->getParent(0);
indexNode= mTransform->getChildIndex(newnode);       
__android_log_print(ANDROID_LOG_INFO,"index","%d\n",indexNode);

I want to get the node name or the index node when I pick any node (cow or plane), I need to return any thing that help me to know which object I picked?

I don't know if what I did is correct or not, but when I click on any object it is give me number 3

user1585783
  • 21
  • 2
  • 6

2 Answers2

0

At a glance, it's not clear where it is 'giving' you the number 3. I don't see anything printed and I don't see any int that might contain 3. I see a lot of bounds and matrices.

You need to explain the situation better, perhaps with simpler demo code.

XenonofArcticus
  • 573
  • 2
  • 7
0

This is how you add node name and identifiers:

int main()
{
    ....
    osg::ref_ptr<osg::Group> root = new osg::Group;
    root->setName("Node Name");
    root->setUserValue("id", idNumber);
    ...
}

When an object is picked this is how you retrieve its name and identifiers:

osg::Node *node;
node->getUserValue("id", returnedString);
std::string name = node->getName();

Hope this clears your doubt.

vforvendetta
  • 596
  • 7
  • 15