2012-09-22 2 views
1

나는 스켈레톤의 접합 값을 기록하는 프로그램을 작성했습니다. . 기본적으로 RightHand.joint를 사용하여 센서에서 X, Y, Z 좌표를 얻습니다. 이제는이 값을 사용하여 3D 모델을 애니메이션으로 만들려고합니다. 어떻게 든 x, y 값을 실제 투영법으로 변환하는 수식을 얻었지만 는 Z 좌표와 .. 또한 나는 우리가 다음매핑 x, y, z Kinect에서 XNA의 화면 좌표 또는 투영 좌표로의 좌표

int x = (int) Math.Floor(((float.Parse(temp[0]) * 0.5f) + 0.5f) * maxWidth); 
int y = (int) Math.Floor(((float.Parse(temp[1]) * -0.5f) + 0.5f) * maxHeight); 

밤은 할 필요가 이유를 이해 해달라고하는 방법을 이해하지 않습니다 그것은 단지 대신 화면 너비에 의해 x와 y 값 & 높이를 곱하면 충분한 * 0.5f (+ 0.5f)를하는 중. . 만약 누군가가 매우 도움이 될 것입니다 또한 Z 좌표를 얻는 방법을 설명 할 수 있을까요? 여기

코드입니다 :

 protected override void Update(GameTime gameTime) 
     { 
      //// TODO: Add your update logic here 
      using (StreamReader r = new StreamReader(f)) 
      { 
       string line; 
       Viewport view = graphics.GraphicsDevice.Viewport; 
       int maxWidth = view.Width; 
       int maxHeight = view.Height; 

       while ((line = r.ReadLine()) != null) 
       { 
        string[] temp = line.Split(','); 

     int x = (int)Math.Floor(((float.Parse(temp[0]) * 0.5f) + 0.5f) * maxWidth); 
     int y = (int)Math.Floor(((float.Parse(temp[1]) * -0.5f) + 0.5f) * maxHeight); 

     //Wrong Z - value Cal (Testing) 
     int z = (int)Math.Floor(((float.Parse(temp[2])* 0.5) + 0.5f) * maxHeight); 

       motion_z.Add(new Point3D(x, y, z)); 

      } 
     } 

      ModelPosition.X = (float)(motion_z[i].X); 
      ModelPosition.Y = (float)(motion_z[i].Y); 
      ModelPosition.Z = (float)(motion_z[i].Z); 

      i++; 
      base.Update(gameTime); 
     } 
+0

제대로 애니메이션을해야하는 다른 aproach와 . XNA에서 x, y, z 값 위치를 수정하지 않고 모델에 제공합니다. 그리고 World Matrix를 사용하여 모델을 확대/축소하고 이동하고 회전 할 수 있습니다. (내 "모델"은 실린더와 구체로 구성됩니다.) – EdgarT

+0

기본적으로 내 모델은 더 자연스러운 움직임을 원합니다. 예를 들면. 물고기 . . 그래서 그것을하기 위해 복잡한 함수를 사용하는 대신에 jsut은 모션을 기록하고 그것을 움직이기 원합니다 –

+0

어쨌든 당신은 저에게 골격 좌표와 깊이의 차이를 설명 할 수 있습니까? –

답변

0
int x = (int)Math.Floor(((float.Parse(temp[0]) * 0.5f) + 0.5f) * maxWidth); 
int y = (int)Math.Floor(((float.Parse(temp[1]) * -0.5f) + 0.5f) * maxHeight); 
int z = (int)Math.Floor(((float.Parse(temp[2])/4)* 20000)); 

motion_z.Add(new Point3D(x, y, z)); 

20000 당신이 vector3 카메라 위치에서 정의하는 깊이 거리의 값이며, 그것이 내가 할