• 使用osg::TriangleFunction仿函数求交


    class PickEvent : public osgGA::GUIEventHandler
    {
    public:
     PickEvent(osg::Geometry* drawable) : _drawable(drawable){}
     ~PickEvent(){}
    public:
     bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
     {
      if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH)
      {
         osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
          double x = ea.getX();
          double y = ea.getY();

       osg::Matrix mat = viewer->getCamera()->getViewMatrix() * viewer->getCamera()->getProjectionMatrix();
       mat = mat  * viewer->getCamera()->getViewport()->computeWindowMatrix();
       osg::Matrix inversemat = osg::Matrix::inverse(mat);
       osg::Vec3d v3start = osg::Vec3d(ea.getX(), ea.getY(), 0.0) * inversemat;
       osg::Vec3d v3end = osg::Vec3d(ea.getX(), ea.getY(), 1.0) * inversemat;

       
       osg::TriangleFunctor<MyTestPicker::TriangleIntersector> intersector;
       intersector.set(v3start, v3end);
                _drawable->accept(intersector);

       MyTestPicker::TriangleIntersections::iterator it = intersector._intersections.begin();
       std::pair<const float,MyTestPicker::TriangleIntersection> ps = *it;
       osg::Vec3d v1 =  *(ps.second._v1);
       osg::Vec3d v2 = *(ps.second._v2);
       osg::Vec3d v3 = *(ps.second._v3);

      
       osg::Sphere* sphere = new osg::Sphere;
       sphere->setCenter(v1);
       sphere->setRadius(1);

      
       osg::ShapeDrawable* shapeDrawable = new osg::ShapeDrawable(sphere);
       osg::Geode* geode = new osg::Geode;
       geode->addDrawable(shapeDrawable);

       osg::Camera* camera = viewer->getCamera();
       camera->addChild(geode);

      }
      return false;
      
     }
    public:
     osg::Transform* _transform;
     osg::Geometry* _drawable;

    };

    void main()

    {

         osgViewer::Viewer viewer;

        osg::Node* node = osgDB::readNodeFile("D://cow.osg");

        osg::Group* group = dynamic_cast<osg::Group*>(node);
        osg::Node* child = group->getChild(0);
        osg::Geode* geode = dynamic_cast<osg::Geode*>(child);
        osg::Geometry* drawable = (osg::Geometry*)geode->getDrawable(0);

        viewer.addEventHandler(new PickEvent(drawable));
        viewer.setSceneData(group);
       
        return viewer.run();
    }

    }

  • 相关阅读:
    记某农信社面试
    sublime2 c++的一些使用配置
    switch case
    sizeof与strlen的区别 浅谈
    求最大公约数
    Android基础控件——PopupWindow模仿ios底部弹窗
    Android基础控件——ListView实现时间轴效果
    Android基础控件——CardView的使用、仿支付宝银行卡
    Android基础控件——AlertDialog、ProgressDialog实现单选对话框、多选对话框、进度条对话框、输入框对话框
    Android基础——适配安卓6.0新权限系统
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1785643.html
Copyright © 2020-2023  润新知