/// used for updating every frame /// @note While we are still steady (i.e. we haven't gotten a "not steady" event) we update /// the time and frame every frame! public override void UpdateFrame() { if (m_context == null || m_context.UserSkeletonValid == false) { return; // no data; } NISkeletonTracker tracker = m_pointTracker as NISkeletonTracker; if (tracker.Valid == false) { return; // no one to track. } NISelectedPlayer player = tracker.GetTrackedPlayer(); if (player == null || player.Valid == false) { return; } NIUserAndSkeleton.NIPoseDetectionStateStatus curStatus = new NIUserAndSkeleton.NIPoseDetectionStateStatus(); if (m_context.UserGenrator.GetPoseStatus(player.OpenNIUserID, m_poseName, ref curStatus) == false) { return; // we do not have good pose information } if (curStatus.m_eState != PoseDetectionState.InPose) { return; } if (curStatus.m_timePoseHeld >= m_timeToHoldPose) { InternalFireDetectEvent(); } }
// protected methods protected override bool InternalInit(NIPointTracker hand) { NISkeletonTracker curHand = hand as NISkeletonTracker; if (curHand == null) { return(false); } if (m_context == null || m_context.UserSkeletonValid == false) { return(false); } NISelectedPlayer player = curHand.GetTrackedPlayer(); if (player == null) { return(false); // no player } player.m_userChangeEventHandler += PlayerUserChangeHandler; if (player.Valid) { validRequestedPoseDetection = m_context.UserGenrator.RequestPoseDetection(m_poseName, player.OpenNIUserID); return(validRequestedPoseDetection); } validRequestedPoseDetection = false; return(true); }
// protected methods /// this method tries to fill a new point on each of the relevant joints. /// It returns true if it succeed and false otherwise /// @note it will fail if even one of the points has a low confidence! /// @return true on success, false on failure. protected bool FillPoints() { // first we find a reference to the skeleton capability NISkeletonTracker hand = m_pointTracker as NISkeletonTracker; if (hand == null) { return(false); // no hand to track } NISelectedPlayer player = hand.GetTrackedPlayer(); if (player == null || player.Valid == false || player.Tracking == false) { return(false); // no player to work with... } // We need to figure out if we have a good confidence on all joints SkeletonJointPosition rightHand; SkeletonJointPosition leftHand; SkeletonJointPosition rightElbow; SkeletonJointPosition leftElbow; if (player.GetSkeletonJointPosition(SkeletonJoint.RightHand, out rightHand) == false || rightHand.Confidence <= 0.5f) { return(false); } if (player.GetSkeletonJointPosition(SkeletonJoint.LeftHand, out leftHand) == false || leftHand.Confidence <= 0.5f) { return(false); } if (player.GetSkeletonJointPosition(SkeletonJoint.RightElbow, out rightElbow) == false || rightElbow.Confidence <= 0.5f) { return(false); } if (player.GetSkeletonJointPosition(SkeletonJoint.LeftElbow, out leftElbow) == false || leftElbow.Confidence <= 0.5f) { return(false); } Vector3 pos = NIConvertCoordinates.ConvertPos(rightHand.Position); m_pointsRightHand.AddPoint(ref pos); pos = NIConvertCoordinates.ConvertPos(leftHand.Position); m_pointsLeftHand.AddPoint(ref pos); pos = NIConvertCoordinates.ConvertPos(rightElbow.Position); m_pointsRightElbow.AddPoint(ref pos); pos = NIConvertCoordinates.ConvertPos(leftElbow.Position); m_pointsLeftElbow.AddPoint(ref pos); return(true); }
/// Release the gesture public override void ReleaseGesture() { if (m_context != null && m_context.UserSkeletonValid) { NISkeletonTracker tracker = m_pointTracker as NISkeletonTracker; if (tracker.Valid) { NISelectedPlayer player = tracker.GetTrackedPlayer(); if (player != null && player.Valid && validRequestedPoseDetection) { m_context.UserGenrator.ReleasePoseDetection(m_poseName, player.OpenNIUserID); } } } m_context = null; m_poseName = ""; m_pointTracker = null; }
/// This is true if the gesture is in the middle of doing (i.e. it has detected but not gone out of the gesture). /// for our purposes this means the steady event has occurred and the unsteady has not occurred yet /// @return a value between 0 and 1. 0 means no pose, 1 means the pose has been detected and held /// for a while. a value in the middle means the pose has been detected and has been held this /// portion of the time required to fire the trigger (@ref m_timeToHoldPose). public override float GestureInProgress() { if (m_context == null || m_context.UserSkeletonValid == false) { return(0.0f); // no data; } NISkeletonTracker tracker = m_pointTracker as NISkeletonTracker; if (tracker.Valid == false) { return(0.0f); // no one to track. } NISelectedPlayer player = tracker.GetTrackedPlayer(); if (player == null || player.Valid == false) { return(0.0f); } NIUserAndSkeleton.NIPoseDetectionStateStatus curStatus = new NIUserAndSkeleton.NIPoseDetectionStateStatus(); if (m_context.UserGenrator.GetPoseStatus(player.OpenNIUserID, m_poseName, ref curStatus) == false) { return(0.0f); // we do not have good pose information } if (curStatus.m_eState != PoseDetectionState.InPose) { return(0.0f); } if (curStatus.m_timePoseHeld < 0) { return(0.0f); } if (curStatus.m_timePoseHeld >= m_timeToHoldPose) { return(1.0f); } return(curStatus.m_timePoseHeld / m_timeToHoldPose); }