2012-11-24 47 views
1

我正在做一個非常簡單的事情,我的目標是根據另一個骨架的位置移動一個骨架,爲此我基於HipCenter位置。 (這algoritm可能是錯誤的,這個問題是關於一個例外,在foreach循環ocurring)在更新Kinect關節位置時可以理解的異常

這裏是我的實際代碼:

public static Skeleton MoveTo(this Skeleton skOrigin, Skeleton skDestiny) 
{ 
    Skeleton skReturn = skOrigin; // just making a copy 

     // find the factor to move, based on the HipCenter. 
     float whatToMultiplyX = skOrigin.Joints[JointType.HipCenter].Position.X/skDestiny.Joints[JointType.HipCenter].Position.X; 
     float whatToMultiplyY = skOrigin.Joints[JointType.HipCenter].Position.Y/skDestiny.Joints[JointType.HipCenter].Position.Y; 
     float whatToMultiplyZ = skOrigin.Joints[JointType.HipCenter].Position.Z/skDestiny.Joints[JointType.HipCenter].Position.Z; 


     SkeletonPoint movedPosition = new SkeletonPoint(); 
     Joint movedJoint = new Joint(); 
     foreach (JointType item in Enum.GetValues(typeof(JointType))) 
     { 
      // Updating the position 
      movedPosition.X = skOrigin.Joints[item].Position.X * whatToMultiplyX; 
      movedPosition.Y = skOrigin.Joints[item].Position.Y * whatToMultiplyY; 
      movedPosition.Z = skOrigin.Joints[item].Position.Z * whatToMultiplyZ; 

      // Setting the updated position to the skeleton that will be returned. 
      movedJoint.Position = movedPosition; 
      skReturn.Joints[item] = movedJoint; 
     } 

     return skReturn; 
    } 

使用F10調試一切正常ultin在德第二遍foreach循環。 當我經過第二次在foreach我就在這行

skReturn.Joints[item] = movedJoint; 

異常說一個例外:

JointType index value must match Joint.JointType 

但價值actualy脊柱。

怎麼了?

+1

你是否嘗試過通過索引引用'Joints'數組?我會嘗試明天啓動我的Kinect並測試循環,看看我是否也可以重現它。 –

+0

謝謝你,但不用擔心,我找到了一個解決方案,稍後會編輯我的問題。無論如何謝謝 – Ewerton

+0

嗨Ewerton,你可以請出版你的解決方案嗎?我在單元測試中遇到了同樣的問題,我想寫...... – Ingo

回答

2

解決,這裏是解決方案

Joint newJoint = new Joint(); // declare a new Joint 

// 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 + (someNumber)), 
       Y = (float)(newJoint.Position.Y + (someNumber)), 
       Z = (float)(newJoint.Position.Z + (someNumber)) 
      }; 

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

這將工作。

+0

感謝分享這個。 –

相關問題