2012-11-24 1 views
1

나는 매우 간단한 작업을 수행하고 있습니다. 내 목표는 다른 골격의 위치를 ​​기반으로 한 뼈대를 이동하는 것입니다.이 작업은 HipCenter 위치에 기반합니다. 모든 디버깅하는 F10를 사용업데이트에 대한 이해 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; 
    } 

테에서 두 번째 패스 ultin 잘 작동 :

여기

내 실제 코드입니다 (이 알고리즘으로 잘못 될 수있다,이 문제는 foreach 루프에서 ocurring 예외에 관한 것입니다) 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

공유해 주셔서 감사합니다. –