Archie OSG Step By Step⑥ 对象选取

本文介绍如何在C++中通过添加事件处理类和构造函数来获取鼠标位置,实现基本的鼠标事件处理,包括鼠标按下和释放事件。通过事件处理函数更新鼠标位置并进行对象选取操作。

⑤位置显示X,原理还不懂,先学习简单的这节,不用另外设置Camera。

添加事件处理类CSelectHandler,勾选内联,公共继承自osgGA::GUIEventHandler,并添加cpp文件SelectHandler.cpp

添加变量

public:
    //得到鼠标位置
    float _mx;
    float _my;


修改构造函数

CSelectHandler(void):_mx(0.0f), _my(0.0f){}


添加handle事件处理虚函数

// 事件处理函数
bool CSelectHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
    osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*>(&ea);
    if (!view)
    {
        return false;
    }
    switch(ea.getEventType())
    {
        // 鼠标按下
    case(osgGA::GUIEventAdapter::PUSH):
        {
            //更新鼠标位置
            _mx = ea.getX();
            _my = ea.getY();
            break;
        }
        //释放
    case (osgGA::GUIEventAdapter::RELEASE):
        {
            //不为0,也即鼠标按下 且按下前后都是同一点
            if (_mx==ea.getX() && _my==ea.getY())
            {
                //执行对象选取
                Select(view.get(),ea.getX(),ea.getY());
            } 
            break;

        }
    default:
        break;
    }
    return false;
}


 

添加Selcet对象选取事件处理器

 

// 对象选取事件处理器
void CSelectHandler::Select(osg::ref_ptr<osgViewer::View> view, float x, float y)
{
   osg::ref_ptr<osg::Node> node = new osg::Node();
   osg::ref_ptr<osg::Group> parent = new osg::Group();

   //创建一个线段交集检测函数
   osgUtil::LineSegmentIntersector::Intersections intersections;
   if (view->computeIntersections(x,y,intersections))
   {
       osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
       osg::NodePath& nodePath = intersection.nodePath;
       // 得到选择的物体
       node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
       parent = (nodePath.size()>=2) ? dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]:0);

   }
   // 用高亮来显示选中的物体
   if (parent.get)&& node.get())
   {
       osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent.get());
       if (!parentAsScribe)
       {
           // 如果对象选择到,高亮显示
           osg::ref_ptr<osgFX::Scribe> scribe = new osgFX::Scribe();
           scribe->addChild(node.get());
           parent->replaceChild(node.get(),scribe.get());
       }
       else
       {
           // 如果没有选择到,则移除高亮显示的对象
           osg::Node::ParentList parentList = parentAsScribe->getParents();
           for (osg::Node::ParentList::iterator itr = parentList.begin();itr!=parentList.end();itr++)
           {
               (*itr)->replaceChild(parentAsScribe.get(),node.get());
           }
       }
   }
}

添加事件关联

  // 对象选取事件
    mViewer->addEventHandler(new CSelectHandler());



 

 

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值