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; }
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; }