mapping x,y,z坐标到Kinect到XNA的屏幕坐标或投影坐标

时间:2012-09-22 12:48:46

标签: coordinates kinect xna-4.0

我写了一个程序来记录Skeleton的联合值。 。基本上是RightHand.joint从传感器获取X,Y,Z坐标,现在我想用这些值来动画我的3D模型..不知怎的,我已经得到了将x,y值转换为真实世界投影的公式但是不明白如何使用Z坐标。我也不明白为什么我们需要做以下

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

1 个答案:

答案 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相机位置定义的深度距离的值,它应该正确动画