using KinectUtils; using Microsoft.Kinect; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MyGestureBank { public class SoccerShootGesture : Gesture { private CameraSpacePoint lastLeftFootPosition; private CameraSpacePoint lastRightFootPosition; public SoccerShootGesture() { MinNbOfFrames = 10; MaxNbOfFrames = 30; } public override void TestGesture(Body body) { if (TestPosture(body)) { Console.WriteLine("Gesture recognized, shooting motion"); Thread.Sleep(1000); OnGestureRecognized(); } } protected override bool TestEndConditions(Body body) { float threshold = 0.05f; bool areFeetClose = Math.Abs(body.Joints[JointType.FootLeft].Position.X - body.Joints[JointType.FootRight].Position.X) < threshold; return areFeetClose; } protected override bool TestInitialConditions(Body body) { CameraSpacePoint currentLeftFootPosition = body.Joints[JointType.FootLeft].Position; CameraSpacePoint currentRightFootPosition = body.Joints[JointType.FootRight].Position; CameraSpacePoint currentHipPosition = body.Joints[JointType.SpineBase].Position; CameraSpacePoint currentHeadPosition = body.Joints[JointType.Head].Position; bool isWithinDistanceX = Math.Abs(currentLeftFootPosition.X - currentRightFootPosition.X) < Math.Abs(currentHipPosition.Y - currentHeadPosition.Y); bool isWithinRangeY = IsFootBetweenHeadAndSpinBase(body.Joints[JointType.FootRight].Position, body.Joints[JointType.Head].Position, body.Joints[JointType.SpineBase].Position); return isWithinDistanceX && isWithinRangeY; } protected override bool TestPosture(Body body) { bool isWithinRangeY = IsFootBetweenHeadAndSpinBase(body.Joints[JointType.FootRight].Position, body.Joints[JointType.Head].Position, body.Joints[JointType.SpineBase].Position); return isWithinRangeY; } protected override bool TestRunningGesture(Body body) { CameraSpacePoint currentLeftFootPosition = body.Joints[JointType.FootLeft].Position; CameraSpacePoint currentRightFootPosition = body.Joints[JointType.FootRight].Position; bool areFeetCloserThanLastFrame = Math.Abs(currentLeftFootPosition.X) <= lastLeftFootPosition.X + 0.1f && Math.Abs(currentRightFootPosition.X) <= lastRightFootPosition.X + 0.1f; lastLeftFootPosition = currentLeftFootPosition; lastRightFootPosition = currentRightFootPosition; return areFeetCloserThanLastFrame; } private bool IsFootBetweenHeadAndSpinBase(CameraSpacePoint footPosition, CameraSpacePoint headPosition, CameraSpacePoint hipPosition) { float maxY = headPosition.Y; float minY = hipPosition.Y; return footPosition.Y < maxY && footPosition.Y > minY; } } }