Hi, all, I noticed in osgpick.cpp that osgText::Text and osg::Geometry could be picked, but when I add an osg::Geode with osg::ShapeDrawable into the HUD camera, the picking does not work anymore.
I list the code as follows. It will be appreciated if anyone can point out where the problem is or provide the correct way. Thanks in advance. // g++ osgpick.cpp -Wall -O3 -W -I/usr/include -losgDB -losgGA -losgViewer -losg -losgUtil -losgText -lOpenThreads -losgWidget -o osgpick.out #include <osgViewer/Viewer> #include <osg/Geode> #include <osg/MatrixTransform> #include <osg/Camera> #include <osg/io_utils> #include <osg/ShapeDrawable> #include <osgText/Text> #include <sstream> // class to handle events with a pick class PickHandler : public osgGA::GUIEventHandler { public: PickHandler(osgText::Text* updateText): _updateText(updateText) {} ~PickHandler() {} bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa); virtual void pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea); void setLabel(const std::string& name) { if (_updateText.get()) _updateText->setText(name); } protected: osg::ref_ptr<osgText::Text> _updateText; }; bool PickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa) { switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::PUSH): { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); if (view) pick(view,ea); return false; } case(osgGA::GUIEventAdapter::KEYDOWN): { if (ea.getKey()=='c') { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); osg::ref_ptr<osgGA::GUIEventAdapter> event = new osgGA::GUIEventAdapter(ea); event->setX((ea.getXmin()+ea.getXmax())*0.5); event->setY((ea.getYmin()+ea.getYmax())*0.5); if (view) pick(view,*event); } return false; } default: return false; } } void PickHandler::pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea) { osgUtil::LineSegmentIntersector::Intersections intersections; std::string gdlist=""; if (view->computeIntersections(ea,intersections)) { for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin(); hitr != intersections.end(); ++hitr) { std::ostringstream os; if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty())) { // the geodes are identified by name. os<<"Object \""<<hitr->nodePath.back()->getName()<<"\""<<std::endl; } else if (hitr->drawable.valid()) { os<<"Object \""<<hitr->drawable->className()<<"\""<<std::endl; } os<<" local coords vertex("<< hitr->getLocalIntersectPoint()<<")"<<" normal("<<hitr->getLocalIntersectNormal()<<")"<<std::endl; os<<" world coords vertex("<< hitr->getWorldIntersectPoint()<<")"<<" normal("<<hitr->getWorldIntersectNormal()<<")"<<std::endl; const osgUtil::LineSegmentIntersector::Intersection::IndexList& vil = hitr->indexList; for(unsigned int i=0;i<vil.size();++i) { os<<" vertex indices ["<<i<<"] = "<<vil[i]<<std::endl; } gdlist += os.str(); } } setLabel(gdlist); } osg::Camera* createHUD(osgText::Text* updateText) { osg::Camera* hudCamera = new osg::Camera; hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); hudCamera->setProjectionMatrixAsOrtho2D(0,1280,0,1024); hudCamera->setViewMatrix(osg::Matrix::identity()); hudCamera->setRenderOrder(osg::Camera::POST_RENDER); hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT); std::string timesFont("fonts/times.ttf"); osg::Vec3 position(150.0f,800.0f,0.0f); osg::Vec3 delta(0.0f,-60.0f,0.0f); { osg::Geode* geode = new osg::Geode(); osg::StateSet* stateset = geode->getOrCreateStateSet(); stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); geode->setName("simple"); hudCamera->addChild(geode); osgText::Text* text = new osgText::Text; geode->addDrawable( text ); text->setFont(timesFont); text->setText("Picking in Head Up Displays is simple!"); text->setPosition(position); position += delta; } for (int i=0; i<5; i++) { osg::Vec3 dy(0.0f,-30.0f,0.0f); osg::Vec3 dx(120.0f,0.0f,0.0f); osg::Geode* geode = new osg::Geode(); osg::StateSet* stateset = geode->getOrCreateStateSet(); const char *opts[]={"One", "Two", "Three", "January", "Feb", "2003"}; osg::Geometry *quad=new osg::Geometry; stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); std::string name="subOption"; name += " "; name += std::string(opts[i]); geode->setName(name); osg::Vec3Array* vertices = new osg::Vec3Array(4); // 1 quad osg::Vec4Array* colors = new osg::Vec4Array; colors = new osg::Vec4Array; colors->push_back(osg::Vec4(0.8-0.1*i,0.1*i,0.2*i, 1.0)); quad->setColorArray(colors, osg::Array::BIND_OVERALL); (*vertices)[0]=position; (*vertices)[1]=position+dx; (*vertices)[2]=position+dx+dy; (*vertices)[3]=position+dy; quad->setVertexArray(vertices); quad->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); geode->addDrawable(quad); hudCamera->addChild(geode); position += delta; } { // this displays what has been selected osg::Geode* geode = new osg::Geode(); osg::StateSet* stateset = geode->getOrCreateStateSet(); stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); geode->setName("The text label"); geode->addDrawable( updateText ); hudCamera->addChild(geode); updateText->setCharacterSize(20.0f); updateText->setFont(timesFont); updateText->setColor(osg::Vec4(1.0f,1.0f,0.0f,1.0f)); updateText->setText(""); updateText->setPosition(position); updateText->setDataVariance(osg::Object::DYNAMIC); position += delta; } return hudCamera; } osg::Node* createScene() { osg::ref_ptr<osg::Geode> node = new osg::Geode; osg::ref_ptr<osg::ShapeDrawable> sphere = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(500,300,0), 100)); node->addDrawable(sphere.get()); return node.release(); } int main( int argc, char **argv ) { osg::ref_ptr<osg::Node> scene = createScene(); osg::ref_ptr<osg::Group> group = new osg::Group; osg::ref_ptr<osgText::Text> updateText = new osgText::Text; osg::ref_ptr<osg::Camera> hud = createHUD(updateText.get()); hud->addChild(scene.get()); //group->addChild(scene.get()); group->addChild(hud.get()); osgViewer::Viewer viewer; viewer.addEventHandler(new PickHandler(updateText.get())); viewer.setSceneData(group.get()); return viewer.run(); } -- Martin
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org