コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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);
                }
            }
        }