void LeapMotionFrame::copyFromFrame(const Leap::Frame& frame, const F32& maxHandAxisRadius) { // This also resets all counters clear(); // Retrieve frame information mFrameValid = frame.isValid(); mFrameId = frame.id(); mFrameTimeStamp = frame.timestamp(); mFrameInternalId = smNextInternalFrameId; ++smNextInternalFrameId; mFrameSimTime = Sim::getCurrentTime(); mFrameRealTime = Platform::getRealMilliseconds(); if(!mFrameValid) { return; } // Retrieve hand information mHandCount = frame.hands().count(); if(mHandCount > 0) { copyFromFrameHands(frame.hands(), maxHandAxisRadius); } // Retrieve pointable information mPointableCount = frame.pointables().count(); if(mPointableCount > 0) { copyFromFramePointables(frame.pointables()); } }
void LeapFishyApp::processGesture() { Leap::Frame frame = m_LeapController.frame(); if( m_LastFrame == frame ) return; Leap::GestureList gestures = m_LastFrame.isValid() ? frame.gestures( m_LastFrame ) : frame.gestures(); m_LastFrame = frame; for( int i = 0; i < gestures.count(); i++ ) { if( gestures[i].type() == Leap::Gesture::TYPE_SWIPE ) { Leap::SwipeGesture swipe = gestures[i]; Leap::Vector diff = 0.006f*(swipe.position() - swipe.startPosition()); Vec2f curSwipe(diff.x, -diff.y); m_pPlayer->AddVelocity( curSwipe ); } else if( gestures[i].type() == Leap::Gesture::TYPE_KEY_TAP || gestures[i].type() == Leap::Gesture::TYPE_SCREEN_TAP ) { m_pPlayer->KillVelocity(); } } }
static VALUE valid_p(VALUE self) { Leap::Frame * f; Data_Get_Struct(self, Leap::Frame, f); if (true == f->isValid()) { return Qtrue; } return Qfalse; }
void eleap::eleap_t::impl_t::onFrame(const Leap::Controller& controller) { const Leap::Frame frame = controller.frame(); if (frame.isValid()) { // send the known hands in this frame, this will handle hands coming and going const Leap::HandList hands = frame.hands(); { unsigned long long time_encoded = (0&0xffffffff)<<8 | (DATA_KNOWN_HANDS&0xff); float *f; unsigned char *dp; piw::data_nb_t d = ctx_.allocate_host(time_encoded,INT32_MAX,INT32_MIN,0,BCTVTYPE_INT,sizeof(int32_t),&dp,hands.count(),&f); memset(f,0,hands.count()*sizeof(int32_t)); *dp = 0; for(int i = 0; i < hands.count(); ++i) { const Leap::Hand hand = hands[i]; if(hand.isValid() && hand.fingers().count() > 1) { ((int32_t *)f)[i] = hand.id(); } } enqueue_fast(d,1); } // handle the actual data for the detected hands for(int i = 0; i < hands.count(); ++i) { const Leap::Hand hand = hands[i]; if(hand.isValid() && hand.fingers().count() > 1) { unsigned long long time_encoded = (hand.id()&0xffffffff)<<8 | (DATA_PALM_POSITION&0xff); const Leap::Vector palm_pos = hand.palmPosition(); float *f; unsigned char *dp; piw::data_nb_t d = ctx_.allocate_host(time_encoded,600,-600,0,BCTVTYPE_FLOAT,sizeof(float),&dp,3,&f); memset(f,0,3*sizeof(float)); *dp = 0; f[0] = piw::normalise(600,-600,0,palm_pos.x); f[1] = piw::normalise(600,-600,0,palm_pos.y); f[2] = piw::normalise(600,-600,0,palm_pos.z); enqueue_fast(d,1); } } } }
//Handle Leap Gesture processing. //Trigger the corresponding effects in the particle field. void GesturesDemo::processGestures() { Leap::Frame frame = controller.frame(); if ( lastFrame == frame ) { return; } Leap::GestureList gestures = lastFrame.isValid() ? frame.gestures(lastFrame) : frame.gestures(); lastFrame = frame; size_t numGestures = gestures.count(); for (size_t i=0; i < numGestures; i++) { if (gestures[i].type() == Leap::Gesture::TYPE_SCREEN_TAP) { printf("screen screen tap gesture"); Leap::ScreenTapGesture tap = gestures[i]; ci::Vec3f tapLoc = normalizeCoords(tap.position()); field.Repel(tap.id(), ci::Vec2f(tapLoc.x, tapLoc.y), 3.0); } else if (gestures[i].type() == Leap::Gesture::TYPE_KEY_TAP) { printf("screen key tap gesture"); Leap::KeyTapGesture tap = gestures[i]; ci::Vec3f tapLoc = normalizeCoords(tap.position()); field.Repel(tap.id(), ci::Vec2f(tapLoc.x, tapLoc.y), -3.0); } else if (gestures[i].type() == Leap::Gesture::TYPE_SWIPE) { printf(" swipe gesture"); Leap::SwipeGesture swipe = gestures[i]; Leap::Vector diff = 0.004f*(swipe.position() - swipe.startPosition()); ci::Vec3f curSwipe(diff.x, -diff.y, diff.z); field.Translate(swipe.id(), curSwipe); } else if (gestures[i].type() == Leap::Gesture::TYPE_CIRCLE) { printf(" circle gesture"); Leap::CircleGesture circle = gestures[i]; float progress = circle.progress(); if (progress >= 1.0f) { ci::Vec3f center = normalizeCoords(circle.center()); ci::Vec3f normal(circle.normal().x, circle.normal().y, circle.normal().z); double curAngle = 6.5; if (normal.z < 0) { curAngle *= -1; } field.Rotate(circle.id(), ci::Vec2f(center.x, center.y), circle.radius()/250, curAngle); } } } }
//function to get a frame and return it in the format acceptable to MATLAB //ie mxArray void loadFrame(mxArray *plhs[]) { //get current frame Leap::Frame frame = controller->frame(); //DEBUG: check if frame is valid if(!frame.isValid()) mexErrMsgTxt("Frame returned was not valid"); //wait for frame to be valid //while(!frame.isValid()) controller->frame(); Leap::HandList hands = frame.hands(); //import variables and create struct //number of hands int numHands = hands.count(); //if there are no hands return a null pointer if(!numHands){ plhs[0] = mxCreateDoubleScalar(0); return; } //fields returned to matlab in the struct: int numHandFields = 4; //change number of fields here**** const char *hand_field_names[] = { "position", "velocity", "direction", "pointables" //add new hand fields here**** }; //pointable temp values for a given hand int numPointables; Leap::PointableList pointList; int numPointFields = 3; //change number of pointable fields here**** const char *point_field_names[] = { "position", "velocity", "direction" //add new pointable fields here**** }; mxArray *p; //allocate the structure array to export to matlab mxArray *h = mxCreateStructMatrix(1, numHands, numHandFields, hand_field_names); //put vectors into structure array fields int i,j; //iterators for(i=0;i<numHands;i++){ //fill in hand information mxSetFieldByNumber(h,i,0,makeVector(hands[i].palmPosition())); mxSetFieldByNumber(h,i,1,makeVector(hands[i].palmVelocity())); mxSetFieldByNumber(h,i,2,makeVector(hands[i].direction())); // add new field information here**** //create pointable struct for this hand pointList = hands[i].pointables(); //get list of pointables for this hand numPointables = pointList.count(); //get number of pointables for this hand //build list of pointables p = mxCreateStructMatrix(1,numPointables,numPointFields,point_field_names); for(j=0;j<numPointables;j++){ mxSetFieldByNumber(p,j,0,makeVector(pointList[j].tipPosition())); mxSetFieldByNumber(p,j,1,makeVector(pointList[j].tipVelocity())); mxSetFieldByNumber(p,j,2,makeVector(pointList[j].direction())); //add new pointable fields here**** } //put pointable list into hand struct mxSetFieldByNumber(h,i,3,p); } plhs[0] = h; //set output return; }