How to move a kinect skeleton to another position
        Posted  
        
            by 
                Ewerton
            
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Ewerton
        
        
        
        Published on 2012-11-25T15:44:48Z
        Indexed on 
            2012/11/25
            23:04 UTC
        
        
        Read the original article
        Hit count: 339
        
Kinect
|kinect-sdk
I am working on a extension method to move one skeleton to a desired position in the kinect field os view.
My code receives a skeleton to be moved and the destiny position, i calculate the distance between the received skeleton hip center and the destiny position to find how much to move, then a iterate in the joint applying this factor. My code, actualy looks like this.
public static Skeleton MoveTo(this Skeleton skToBeMoved, Vector4 destiny)
    {
        Joint newJoint = new Joint();
        ///Based on the HipCenter (i dont know if it is reliable, seems it is.)
        float howMuchMoveToX = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.X - destiny.X);
        float howMuchMoveToY = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Y - destiny.Y);
        float howMuchMoveToZ = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Z - destiny.Z);
        float howMuchToMultiply = 1;
        // Iterate in the 20 Joints
        foreach (JointType item in Enum.GetValues(typeof(JointType)))
        {
            newJoint = skToBeMoved.Joints[item];
            // This adjust, try to keeps the skToBeMoved in the desired position
            if (newJoint.Position.X < 0)
                howMuchToMultiply = 1; // if the point is in a negative position, carry it to a "more positive" position
            else
                howMuchToMultiply = -1; // if the point is in a positive position, carry it to a "more negative" position
            // applying the new values to the joint
            SkeletonPoint pos = new SkeletonPoint()
            {
                X = newJoint.Position.X + (howMuchMoveToX * howMuchToMultiply),
                Y = newJoint.Position.Y, // * (float)whatToMultiplyY,
                Z = newJoint.Position.Z, // * (float)whatToMultiplyZ
            };
            newJoint.Position = pos;
            skToBeMoved.Joints[item] = newJoint;
            //if (skToBeMoved.Joints[JointType.HipCenter].Position.X < 0)
            //{
            //    if (item == JointType.HandLeft)
            //    {
            //        if (skToBeMoved.Joints[item].Position.X > 0)
            //        {
            //        }
            //    }
            //}
        }
        return skToBeMoved;
    }
Actualy, only X position is considered.
Now, THE PROBLEM:
If i stand in a negative position, and move my hand to a positive position, a have a strange behavior, look this image
 
To reproduce this behaviour you could use this code
using (SkeletonFrame frame = e.OpenSkeletonFrame())
        {
            if (frame == null)
                return new Skeleton();
            if (skeletons == null || skeletons.Length != frame.SkeletonArrayLength)
            {
                skeletons = new Skeleton[frame.SkeletonArrayLength];
            }
            frame.CopySkeletonDataTo(skeletons);
            Skeleton skeletonToTest = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
            Vector4 newPosition = new Vector4();
            newPosition.X = -0.03412333f;
            newPosition.Y = 0.0407479f;
            newPosition.Z = 1.927342f;
            newPosition.W = 0; // ignored
            skeletonToTest.MoveTo(newPosition);
        }
I know, this is simple math, but i cant figure it out why this is happen. Any help will be apreciated.
© Stack Overflow or respective owner