1
votes

Okay, I am pretty new to Kinect, I have the joints tracked and drawn however I cannot for the life of me draw the bones between each joint.

I have this code which will draw the joints of the skeleton

 private void DrawBody(Body body) //takes body as argument
    {
        // Draw points
        foreach (JointType type in body.Joints.Keys)
        {
            // Draw all the body joints
            switch (type)
            {
                case JointType.Head:
                case JointType.FootLeft:
                case JointType.FootRight:
                    DrawJoint(body.Joints[type], 20, Brushes.Yellow, 2, Brushes.White);
                    break;
                case JointType.ShoulderLeft:
                case JointType.ShoulderRight:
                case JointType.HipLeft:
                case JointType.HipRight:
                     DrawJoint(body.Joints[type], 20, Brushes.YellowGreen, 2, Brushes.White);
                    break;
                case JointType.ElbowLeft:
                case JointType.ElbowRight:
                case JointType.KneeLeft:
                case JointType.KneeRight:
                    DrawJoint(body.Joints[type], 15, Brushes.LawnGreen, 2, Brushes.White);
                    break;
                case JointType.HandLeft:
                    DrawHandJoint(body.Joints[type], body.HandLeftState, 20, 2, Brushes.White);
                    break;
                case JointType.HandRight:
                    DrawHandJoint(body.Joints[type], body.HandRightState, 20, 2, Brushes.White);
                    break;
                default:
                    DrawJoint(body.Joints[type], 15, Brushes.RoyalBlue, 2, Brushes.White);
                    break;
            }                

        }         
    }

My DrawJoint Function:

   private void DrawJoint(Joint joint, double radius, SolidColorBrush fill, double borderWidth, SolidColorBrush border)
    {
        //If Joint not tracked  then return Joint
        if (joint.TrackingState != TrackingState.Tracked) return;

        // Map the CameraPoint to ColorSpace so they match
        ColorSpacePoint colorPoint = kinectSensor.CoordinateMapper.MapCameraPointToColorSpace(joint.Position);

        // Create the UI element based on the parameters
        Ellipse El = new Ellipse();
        El.Fill = fill;
        El.Stroke = border;
        El.StrokeThickness = borderWidth;
        El.Width = 25;
        El.Height = 25;
        radius = 25;

        // Add the Ellipse to the canvas
        SkeletonCanvas.Children.Add(El);

        // Avoid exceptions based on bad tracking
        if (float.IsInfinity(colorPoint.X) || float.IsInfinity(colorPoint.X)) return;

        // Allign ellipse on canvas
        Canvas.SetLeft(El, colorPoint.X);
        Canvas.SetTop(El, colorPoint.Y);

    }

Now I am stuck, from this point onwards how would I draw the 'Bones' of the body between each joint on a canvas similiar to how I added the Eclipse for the Joints?.

Any help is appreciated thanks

1

1 Answers

0
votes

In your DrawBody(Body body) function, you'll need to set up the "bones" that you want to draw. Eg:

private void DrawBody(Body body)
{
    // left forearm
    DrawBone(body.Joints[JointType.HandLeft], body.Joints[JointType.ElbowLeft]);
    // right forearm
    DrawBone(body.Joints[JointType.HandRight], body.Joints[JointType.ElbowRight]);
    // ...etc...

}

The DrawBone(Joint, Joint) function would look something like this:

private void DrawBone(Joint first, Joint second)
{
    Line line = new Line();
    line.Stroke = Brushes.LightSteelBlue;

    line.X1 = first.Position.X;
    line.X2 = second.Position.X;
    line.Y1 = first.Position.Y;
    line.Y2 = second.Position.Y;

    line.StrokeThickness = 2;
    myCanvas.Children.Add(line);
}

I'm working from memory here so syntax might be off a little.