/// <summary> /// Draws a bone line between two joints /// </summary> /// <param name="skeleton">skeleton to draw bones from</param> /// <param name="drawingContext">drawing context to draw to</param> /// <param name="jointType0">joint to start drawing from</param> /// <param name="jointType1">joint to end drawing at</param> private void DrawBone(Skeleton skeleton, DrawingContext drawingContext, JointType jointType0, JointType jointType1) { Joint joint0 = skeleton.Joints[jointType0]; Joint joint1 = skeleton.Joints[jointType1]; // If we can't find either of these joints, exit if (joint0.TrackingState == JointTrackingState.NotTracked || joint1.TrackingState == JointTrackingState.NotTracked) { return; } // Don't draw if both points are inferred if (joint0.TrackingState == JointTrackingState.Inferred && joint1.TrackingState == JointTrackingState.Inferred) { return; } // We assume all drawn bones are inferred unless BOTH joints are tracked System.Windows.Media.Pen drawPen = this.inferredBonePen; if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked) { drawPen = this.trackedBonePen; } //Console.WriteLine(drawPen.Brush.ToString()); drawingContext.DrawLine(drawPen, SkeletonPointToScreen(joint0.Position), this.SkeletonPointToScreen(joint1.Position)); }
/// <summary> /// Draws a skeleton's bones and joints /// </summary> /// <param name="skeleton">skeleton to draw</param> /// <param name="drawingContext">drawing context to draw to</param> public void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext) { // Render Torso //this.DrawBone(skeleton, drawingContext, JointType.Head, JointType.ShoulderCenter); DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderLeft); this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderRight); this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.Spine); this.DrawBone(skeleton, drawingContext, JointType.Spine, JointType.HipCenter); this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipLeft); this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipRight); // Left Arm this.DrawBone(skeleton, drawingContext, JointType.ShoulderLeft, JointType.ElbowLeft); this.DrawBone(skeleton, drawingContext, JointType.ElbowLeft, JointType.WristLeft); this.DrawBone(skeleton, drawingContext, JointType.WristLeft, JointType.HandLeft); // Right Arm this.DrawBone(skeleton, drawingContext, JointType.ShoulderRight, JointType.ElbowRight); this.DrawBone(skeleton, drawingContext, JointType.ElbowRight, JointType.WristRight); this.DrawBone(skeleton, drawingContext, JointType.WristRight, JointType.HandRight); // Left Leg this.DrawBone(skeleton, drawingContext, JointType.HipLeft, JointType.KneeLeft); this.DrawBone(skeleton, drawingContext, JointType.KneeLeft, JointType.AnkleLeft); this.DrawBone(skeleton, drawingContext, JointType.AnkleLeft, JointType.FootLeft); // Right Leg this.DrawBone(skeleton, drawingContext, JointType.HipRight, JointType.KneeRight); this.DrawBone(skeleton, drawingContext, JointType.KneeRight, JointType.AnkleRight); this.DrawBone(skeleton, drawingContext, JointType.AnkleRight, JointType.FootRight); // Render Joints foreach (Joint joint in skeleton.Joints) { Brush drawBrush = null; if (joint.TrackingState == JointTrackingState.Tracked) { drawBrush = this.trackedJointBrush; } else if (joint.TrackingState == JointTrackingState.Inferred) { drawBrush = this.inferredJointBrush; } if (drawBrush != null) { drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness); } } //render head Joint leftHand = skeleton.Joints[JointType.HandLeft]; Joint leftElbow = skeleton.Joints[JointType.ElbowLeft]; Joint head = skeleton.Joints[JointType.Head]; Joint shoulderCenter = skeleton.Joints[JointType.ShoulderCenter]; //assumes that head radius fits 4 times in the distance between hand and elbow /*float deltaX = leftHand.Position.X - leftElbow.Position.X; * float deltaY = leftHand.Position.Y - leftElbow.Position.Y; * float deltaZ = leftHand.Position.Z - leftElbow.Position.Z; * float distance = (float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); * float headRadius = (float)(distance * scale * 1.5);*/ System.Windows.Media.Pen drawPen = this.inferredBonePen; if (head.TrackingState == JointTrackingState.Tracked && shoulderCenter.TrackingState == JointTrackingState.Tracked) { drawPen = this.trackedBonePen; Brush drawBrush = this.trackedJointBrush; if (drawBrush != null) { System.Windows.Point headPointOnScreen = SkeletonPointToScreen(head.Position); System.Windows.Point shoulderPointOnScreen = SkeletonPointToScreen(shoulderCenter.Position); double deltaX = headPointOnScreen.X - shoulderPointOnScreen.X; double deltaY = headPointOnScreen.Y - shoulderPointOnScreen.Y; float distance = (float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY); float headRadius = (float)(distance / 2); Vector headVec = new Vector(headPointOnScreen.X, headPointOnScreen.Y); Vector shoulderVec = new Vector(shoulderPointOnScreen.X, shoulderPointOnScreen.Y); Vector distVector = shoulderVec - headVec; distVector.Normalize(); Vector intersectingPoint = headVec + distVector * headRadius; drawingContext.DrawEllipse(drawBrush, drawPen, this.SkeletonPointToScreen(head.Position), headRadius, headRadius); drawingContext.DrawLine(drawPen, new Point(intersectingPoint.X, intersectingPoint.Y), shoulderPointOnScreen); } } }