当前位置:   article > 正文

osg鼠标点选类_osg拾取鼠标点击的模型表面上的点

osg拾取鼠标点击的模型表面上的点

 

添加了注释便于理解


  1. class mousehandle:public osgGA::GUIEventHandler
  2. {
  3. public:
  4. mousehandle(){}
  5. ~mousehandle(){}
  6. void pick(osgViewer::View* view,float x,float y);
  7. bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);//ea,鼠标点击位置 //aa 控制显示参数,是Viewer的祖父类,由它可以得到viewer
  8. protected:
  9. float _mx;
  10. float _my;
  11. };
  12. bool mousehandle::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
  13. {
  14. osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
  15. if (!view) return false;
  16. switch(ea.getEventType())
  17. {
  18. //鼠标按下
  19. case(osgGA::GUIEventAdapter::PUSH):
  20. {
  21. if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)//鼠标左键
  22. {
  23. //更新鼠标位置
  24. _mx = ea.getX();
  25. _my = ea.getY();
  26. //pick(view, ea.getX(), ea.getY());
  27. }
  28. break;
  29. }
  30. //拖动鼠标
  31. case(osgGA::GUIEventAdapter::DRAG):
  32. //释放/抬起鼠标
  33. case(osgGA::GUIEventAdapter::RELEASE):
  34. {
  35. if (_mx==ea.getX() && _my==ea.getY())//判断当前抬起鼠标点位置与鼠标点击位置是否相同,即是否存在拖动鼠标
  36. {
  37. pick(view, ea.getX(), ea.getY());//执行对象选取
  38. }
  39. break;
  40. }
  41. default:
  42. break;
  43. }
  44. return false;
  45. }
  46. //实现鼠标点选
  47. void mousehandle::pick(osgViewer::View* view, float x, float y)
  48. {
  49. osg::ref_ptr<osg::Node> node = new osg::Node();
  50. osg::ref_ptr<osg::Group> parent = new osg::Group();
  51. node=nullptr;
  52. parent=nullptr;
  53. //创建一个线段交集检测//intersections 存放与射线相交的节点
  54. osgUtil::LineSegmentIntersector::Intersections intersections;
  55. //computeIntersections()函数判断鼠标与场景中对象交点
  56. if (view->computeIntersections(x, y, intersections))
  57. {
  58. osgUtil::LineSegmentIntersector::Intersections::iterator intersection=intersections.begin(); //获取第一个交点
  59. const osg::NodePath& nodePath = intersection->nodePath;//获取第一个交点的path
  60. //得到选择的物体
  61. node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;//获取交点所在的子节点
  62. parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>
  63. (nodePath[nodePath.size()-2]):0;//获取交点的父节点/组节点
  64. }
  65. if (parent.get() && node.get())//选中模型
  66. {
  67. //添加选中后事件
  68. }
  69. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/314980
推荐阅读
相关标签
  

闽ICP备14008679号