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 move
Em 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.