2012-11-25 32 views
8

मैं एक कंकाल को किनेक्ट फ़ील्ड ओएस व्यू में वांछित स्थिति में स्थानांतरित करने के लिए एक विस्तार विधि पर काम कर रहा हूं।एक किनेक्ट कंकाल को दूसरी स्थिति में कैसे स्थानांतरित करें

मेरा कोड एक कंकाल को स्थानांतरित करने के लिए प्राप्त करता है और भाग्य की स्थिति, मैं प्राप्त कंकाल हिप केंद्र और how much to move खोजने के लिए भाग्य की स्थिति के बीच की दूरी की गणना करता हूं, फिर इस कारक को लागू करने वाले संयुक्त में एक पुनरावृत्ति। मेरा कोड, वास्तव में ऐसा लगता है।

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

असल में, केवल एक्स स्थिति माना जाता है।

अब, समस्या:

तो मैं एक नकारात्मक स्थिति में खड़े हो जाओ, और एक सकारात्मक स्थिति के लिए मेरे हाथ ले जाते हैं, एक एक अजीब व्यवहार इस छवि

enter image description here

देखने के पुन: पेश करने के लिए है, इस व्यवहार आप इस कोड

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

मैं जानता हूँ कि इस्तेमाल कर सकते हैं, इस सरल गणित है, लेकिन मैं नहीं कर सकते यह पता लगा वजह से ऐसा हो रहा है। किसी भी मदद की सराहना की जाएगी।

+1

यह कंकाल और अधिक –

+0

@George Profenza हाँ, यह है कुछ भी नहीं में प्रत्येक संयुक्त स्थिति के लिए नई स्थिति अनुवाद वेक्टर जोड़ने की बात होना चाहिए! इसे हल करने के लिए आपके कोड संशोधन क्या है? – Ewerton

+0

खुशी है कि आप हल हो गए, जब मैंने जवाब दिया तो मैं बाहर था। फिर भी, मेरे दृष्टिकोण से, यदि 'वेक्टर 4 भाग्य' इसकी ओर से अनुवाद करने के लिए एक सापेक्ष स्थिति है, तो बस 'currentPositionVector + = translationVector' (छद्म में,' currentJoint.x + = newPos.x जैसे कुछ करने में कोई फर्क नहीं पड़ता है। ', वाई और जेड के लिए)। यदि 'भाग्य पूर्ण है', तो आप वर्तमान स्थिति और नई स्थिति के बीच अंतर का उपयोग करेंगे। वह हिस्सा जो मुझे आपके दृष्टिकोण में पहेली करता है वह है कि आप फ्लेप (-1 से गुणा करें) अंतर वेक्टर। साथ ही, जब आप अंतर वेक्टर प्राप्त करते हैं, तो आप केवल एक्स घटक को जोड़ते हैं ... –

उत्तर

9

समस्या हल हो गई। इस कोड को

है
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 = (skToBeMoved.Joints[JointType.HipCenter].Position.X - destiny.X) * -1; 
     float howMuchMoveToY = (skToBeMoved.Joints[JointType.HipCenter].Position.Y - destiny.Y) * -1; 
     float howMuchMoveToZ = (skToBeMoved.Joints[JointType.HipCenter].Position.Z - destiny.Z) * -1; 

     // Iterate in the 20 Joints 
     foreach (JointType item in Enum.GetValues(typeof(JointType))) 
     { 
      newJoint = skToBeMoved.Joints[item]; 

      // applying the new values to the joint 
      SkeletonPoint pos = new SkeletonPoint() 
      { 
       X = (float)(newJoint.Position.X + (howMuchMoveToX)), 
       Y = (float)(newJoint.Position.Y + (howMuchMoveToY)), 
       Z = (float)(newJoint.Position.Z + (howMuchMoveToZ)) 
      }; 

      newJoint.Position = pos; 
      skToBeMoved.Joints[item] = newJoint; 
     } 

     return skToBeMoved; 
    }