2013-05-20 2 views
0

나는 항상 Kinect를 마주 보도록 사용자의 스켈레톤을 변환하고 회전시켜야하는 Kinect에서 프로젝트를 만들고 있습니다.Kinect SDK를 사용하여 SkeletonPoint의 값을 colorImage에 매핑하기 전에 어떻게 변환합니까?

나는 스켈레톤의 실제 값을 변경할 수 없다는 것을 알고 있으므로 littleGuy라는 아바타 해골을 만들었습니다. littleGuy는 각 요소에 각각 할당 된 실제 해골의 모든 해골 점을 갖는 해골 점의 배열입니다.

모든 조작은 littleGuy 해골에 일어난 다음 transguy (번역 된 사람)라는 다른 해골에 저장됩니다. 문제는 transGuy의 값을 편집 한 다음 colorImage에 매핑하려고 할 때마다 오버플로가 발생하고 골격이 렌더링되지 않습니다.

아래 코드에서 littleGuy [0]에 센터 힙을 지정하고 나서 모든 번역이이 centerHip을 기반으로하므로 -CHip가되도록 오프셋을 선택합니다. 그런 다음 transGuy 오프셋을 추가하십시오.

if (joint.JointType == JointType.HipCenter) 
       { 
        littleguy_chip = skeleton.Joints[JointType.HipCenter].Position; 
        littleGuy[0] = littleguy_chip; 

        TransValue.X = -littleguy_chip.X; 
        TransValue.Y = -littleguy_chip.Y; 
        TransValue.Z = -littleguy_chip.Z; 

        transGuy[0] = littleGuy[0]; 
        transGuy[0].X = littleGuy[0].X + TransValue.X; 
        transGuy[0].Y = littleGuy[0].Y + TransValue.Y; 
        transGuy[0].Z = littleGuy[0].Z + TransValue.Z; 

        prevPositions[0] = joint.Position; 
       } 

그 후, 나는 transGuy 루핑 및 골격에 값을 매핑하여 각 관절을 그립니다,하지만 난 항상 가치를 정말 그들을 매핑하기 전에 포인트를 조작해야 2147483648

for (int j = 0; j < transGuy.Length; j++) 
       { 
        if ((transGuy[i] == littleguy_head && transGuy[j] == littleguy_cshoulder) 
         || (transGuy[i] == littleguy_cshoulder && transGuy[j] == littleguy_spine) 
         || (transGuy[i] == littleguy_spine && transGuy[j] == littleguy_chip)) 
        { 
         var p2 = kinect.CoordinateMapper.MapSkeletonPointToColorPoint(
          transGuy[j], ColorImageFormat.RgbResolution640x480Fps30); 

         spriteBatch.Draw(lineTex, new Vector2(p.X + 80, p.Y), 
          null, Color.White, (float)Math.Atan2(p2.Y - p.Y, (p2.X + 80) - (p.X + 80)), new Vector2(0f, (float)lineTex.Height/2), 
          new Vector2(Vector2.Distance(new Vector2(p.X + 80, p.Y), new Vector2(p2.X + 80, p2.Y)), 1f), SpriteEffects.None, 0f); 

        } 

컬러 이미지에 ... 어떻게해야합니까?

답변

0

나는이 문제를 해결했다. SkeletonPoint의 X, Y, Z 값은 부동이므로 10 진수로 캐스팅을 입력합니다. 오프셋을 추가 한 다음 전체를 캐스팅하여 float으로 다시 캐스트합니다. 새 코드는 다음과 같습니다.

if (joint.JointType == JointType.Spine) 
       { 
        littleguy_spine = skeleton.Joints[JointType.Spine].Position; 
        littleGuy[1] = littleguy_spine; 

        transGuy[1] = littleGuy[1]; 
        transGuy[1].X = (float)((decimal)(littleGuy[1].X) + (decimal)(TransValue.X)); 
        transGuy[1].Y = (float)((decimal)(littleGuy[1].Y) + (decimal)(TransValue.Y)); 
        transGuy[1].Z = (float)((decimal)(littleGuy[1].Z) + (decimal)(TransValue.Z)); 

        prevPositions[1] = joint.Position; 
       }