void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { SkeletonFrame allSkeletons = e.SkeletonFrame; //if (allSkeletons != null) //{ // allSkeletons is not null iff allSkeletons has a skeleton? skeleton = (from s in allSkeletons.Skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); if (skeleton != null) { var leftHandY = skeleton.Joints[JointID.HandLeft].ScaleTo(640, 480, .5f, .5f).Position.Y; var rightHandY = skeleton.Joints[JointID.HandRight].ScaleTo(640, 480, .5f, .5f).Position.Y; if (allSkeletons.FrameNumber % 1 == 0) // how many skeletons/second should be looked at and smoothed? { // initial skeleton if (smoothSkeleton == null) { smoothSkeleton = new SmoothSkeleton(leftHandY, rightHandY); } // process every new skeleton else { smoothSkeleton.update(leftHandY, rightHandY); } // // Console.Write(allSkeletons.FrameNumber + " " + allSkeletons.TimeStamp + " "); // set background color SetColor(proportion, smoothSkeleton); } } //} }
//private void SetColor(double setProportion, SkeletonData skeleton) private void SetColor(double setProportion, SmoothSkeleton skeleton) { // top of screen = 0 // bottom of screen = 480 double leftHandPosition = skeleton.leftOutput; double rightHandPosition = skeleton.rightOutput; crosshair1.SetValue(Canvas.BottomProperty, Math.Min(0, leftHandPosition - calibrationBaseline) * crosshairRate); crosshair2.SetValue(Canvas.BottomProperty, Math.Min(0, rightHandPosition - calibrationBaseline) * crosshairRate); double calibratedLeftHandPosition = leftHandPosition - calibrationBaseline; double calibratedRightHandPosition = rightHandPosition - calibrationBaseline; if (calibratedRightHandPosition == 0) { calibratedRightHandPosition += .0001; } // TODO Don't divide by zero double currentProportion = calibratedLeftHandPosition / calibratedRightHandPosition; // tolerance settings if (toleranceMode == true) // relative tolerance is enabled { toleranceLeftHand = Math.Abs(leftHandPosition - 480); toleranceRightHand = Math.Abs(rightHandPosition - 480); if (toleranceLeftHand > toleranceRightHand) { maxHandPosition = toleranceLeftHand; } else { maxHandPosition = toleranceRightHand; } tolerance = (maxHandPosition * ((maxTolerance - minTolerance) / 480) + minTolerance) / 100; // dimensions sendMessage("tolerance: " + tolerance.ToString()); } // display heights textBlock1.Text = currentProportion.ToString(); // determine gradient points double bottomTolerance = setProportion - (tolerance * 1 / 2); double topTolerance = setProportion + (tolerance * 1 / 2); double topYellow = setProportion + (tolerance * 1 / 2) + greenYellowFade; double bottomYellow = setProportion - (tolerance * 1 / 2) - greenYellowFade; double topRed = setProportion + (tolerance * 1 / 2) + greenYellowFade + yellowRedFade; double bottomRed = setProportion - (tolerance * 1 / 2) - greenYellowFade - yellowRedFade; // determine gradient mappings // slope*currentProportion - y-intercept double topToleranceYellowMap = ((1 / (greenYellowFade)) * currentProportion) - ((1 / (greenYellowFade)) * topTolerance); double topYellowRedMap = ((1 / (yellowRedFade)) * currentProportion) - ((1 / (greenYellowFade)) * topYellow); double bottomYellowToleranceMap = ((1 / (greenYellowFade)) * currentProportion) - ((1 / (greenYellowFade)) * bottomYellow); double bottomRedYellowMap = ((1 / (yellowRedFade)) * currentProportion) - ((1 / (greenYellowFade)) * bottomRed); System.Windows.Media.Color interpolatedColor = Colors.Red; if (currentProportion >= bottomTolerance && currentProportion <= topTolerance) // green { interpolatedColor = Colors.Green; } // green to yellow (top) else if (currentProportion > topTolerance && currentProportion <= topYellow) { interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Green, Colors.Yellow, topToleranceYellowMap); } // green to yellow (bottom) else if (currentProportion < bottomTolerance && currentProportion >= bottomYellow) { interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Green, bottomYellowToleranceMap); } // yellow to red (top) // (.57, .59] else if (currentProportion > topYellow && currentProportion <= topRed) { interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Red, topYellowRedMap); } // yellow to red (bottom) else if (currentProportion < bottomYellow && currentProportion >= bottomRed) { interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Red, Colors.Yellow, bottomRedYellowMap); } else { interpolatedColor = Colors.Red; } //interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Green, currentProportion); SolidColorBrush interpolatedColorBrush = new SolidColorBrush(interpolatedColor); MainCanvas.Background = interpolatedColorBrush; // set Background to a colorString, e.g. "#113355FF" }