示例#1
0
int PoseTool::processMouseEvent( ViewportMouseEvent& event )
{
  int flags = 0;

  if ( event.event.LeftDown() )
  {
    ROS_ASSERT( state_ == Position );

    pos_ = getPositionFromMouseXY( event.viewport, event.event.GetX(), event.event.GetY() );
    arrow_->setPosition( pos_ );

    state_ = Orientation;
    flags |= Render;
  }
  else if ( event.event.Dragging() )
  {
    if ( state_ == Orientation )
    {
      //compute angle in x-y plane
      Ogre::Vector3 cur_pos = getPositionFromMouseXY( event.viewport, event.event.GetX(), event.event.GetY() );
      double angle = atan2( cur_pos.y - pos_.y, cur_pos.x - pos_.x );

      arrow_->getSceneNode()->setVisible( true );

      //we need base_orient, since the arrow goes along the -z axis by default (for historical reasons)
      Ogre::Quaternion orient_x = Ogre::Quaternion( Ogre::Radian(-Ogre::Math::HALF_PI), Ogre::Vector3::UNIT_Y );

      arrow_->setOrientation( Ogre::Quaternion( Ogre::Radian(angle), Ogre::Vector3::UNIT_Z ) * orient_x );

      flags |= Render;
    }
  }
  else if ( event.event.LeftUp() )
  {
    if ( state_ == Orientation )
    {
      //compute angle in x-y plane
      Ogre::Vector3 cur_pos = getPositionFromMouseXY( event.viewport, event.event.GetX(), event.event.GetY() );
      double angle = atan2( cur_pos.y - pos_.y, cur_pos.x - pos_.x );

      onPoseSet(pos_.x, pos_.y, angle);

      flags |= (Finished|Render);
    }
  }

  return flags;
}
示例#2
0
int PoseTool::processMouseEvent( ViewportMouseEvent& event )
{
    int flags = 0;

    if( event.leftDown() )
    {
        ROS_ASSERT( state_ == Position );

        Ogre::Vector3 intersection;
        Ogre::Plane ground_plane( Ogre::Vector3::UNIT_Z, 0.0f );
        if( getPointOnPlaneFromWindowXY( event.viewport,
                                         ground_plane,
                                         event.x, event.y, intersection ))
        {
            pos_ = intersection;
            arrow_->setPosition( pos_ );

            state_ = Orientation;
            flags |= Render;
        }
    }
    else if( event.type == QEvent::MouseMove && event.left() )
    {
        if( state_ == Orientation )
        {
            //compute angle in x-y plane
            Ogre::Vector3 cur_pos;
            Ogre::Plane ground_plane( Ogre::Vector3::UNIT_Z, 0.0f );
            if( getPointOnPlaneFromWindowXY( event.viewport,
                                             ground_plane,
                                             event.x, event.y, cur_pos ))
            {
                double angle = atan2( cur_pos.y - pos_.y, cur_pos.x - pos_.x );

                arrow_->getSceneNode()->setVisible( true );

                //we need base_orient, since the arrow goes along the -z axis by default (for historical reasons)
                Ogre::Quaternion orient_x = Ogre::Quaternion( Ogre::Radian(-Ogre::Math::HALF_PI), Ogre::Vector3::UNIT_Y );

                arrow_->setOrientation( Ogre::Quaternion( Ogre::Radian(angle), Ogre::Vector3::UNIT_Z ) * orient_x );

                flags |= Render;
            }
        }
    }
    else if( event.leftUp() )
    {
        if( state_ == Orientation )
        {
            //compute angle in x-y plane
            Ogre::Vector3 cur_pos;
            Ogre::Plane ground_plane( Ogre::Vector3::UNIT_Z, 0.0f );
            if( getPointOnPlaneFromWindowXY( event.viewport,
                                             ground_plane,
                                             event.x, event.y, cur_pos ))
            {
                double angle = atan2( cur_pos.y - pos_.y, cur_pos.x - pos_.x );

                onPoseSet(pos_.x, pos_.y, angle);

                flags |= (Finished|Render);
            }
        }
    }

    return flags;
}