// Parse the skeleton for use to control the car private void ControlCar(Skeleton[] skeletons) { // Get the closest tracked user Skeleton trackedSkeleton = skeletons.GetFirstTrackedSkeleton(); // don't do anything if there is no one to track if (trackedSkeleton == null) { DisableControl(); return; } // lost track of the previous user // stop controlling the car and start tracking // new user if (trackedSkeleton.TrackingId != _trackedId) { DisableControl(); _trackedId = trackedSkeleton.TrackingId; } // get a vector representing the hands for easier coding Vector3D leftHand = GetJointVector(JointType.HandLeft, trackedSkeleton); Vector3D rightHand = GetJointVector(JointType.HandRight, trackedSkeleton); // Only continue if the hands are not crossed if (leftHand.X >= rightHand.X) return; // find the mindpoint between the two hands Vector3D handsMidpoint = new Vector3D((rightHand.X + leftHand.X)/2.0, (rightHand.Y + leftHand.Y)/2.0, (rightHand.Z + leftHand.Z)/2.0); // get the vertical position of the spine double spineYPosition = trackedSkeleton.Joints[JointType.Spine].Position.Y; // check if it is okay to control the car EnableDisableControl(handsMidpoint, spineYPosition, leftHand, rightHand); // if we are not controlling then return otherwise continue to processing. if (!_isControlling) return; // calculate the direction for the car CalculateDirection(leftHand, handsMidpoint); // calculate the velocity of the car CalculateVelocity(handsMidpoint.Z, trackedSkeleton.Position.Z); }