Como mover um esqueleto kinect para outra posição

Eu estou trabalhando em um método de extensão para mover um esqueleto para uma posição desejada no campo de kinect os view.

Meu código recebe um esqueleto para ser movido e a posição do destino, eu calculo a distância entre o centro do quadril do esqueleto recebido e a posição do destino para encontrarhow much to moveEm seguida, faça uma iteração na junção aplicando esse fator. Meu código, na verdade, é assim.

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;
    }

Na verdade, apenas a posição X é considerada.

Agora, o problema:

Se eu estiver em uma posição negativa, e mover minha mão para uma posição positiva, um comportamento estranho, olhe esta imagem

Para reproduzir esse comportamento, você poderia usar este código

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);
        }

Eu sei, isso é matemática simples, mas eu não consigo entender porque isso acontece. Qualquer ajuda será apreciada.

questionAnswers(1)

yourAnswerToTheQuestion