在将它们映射到colorImage之前,如何使用Kinect SDK翻译SkeletonPoint的值?

时间:2013-05-20 22:55:00

标签: c# xna kinect xna-4.0 kinect-sdk

我正在Kinect上创建一个项目,我需要翻译和旋转用户的骨架,以便它始终面向Kinect。

我知道我无法改变Skeleton的实际值,因此我创建了一个名为littleGuy的头像骨架。 littleGuy是一个SkeletonPoints数组,分别为每个元素分配了实际Skeleton的所有SkeletonPoints。

所有操作都发生在littleGuy骨架上,然后保存在一个名为transGuy(翻译家伙)的不同骨架中。问题是每当我编辑transGuy的值然后尝试将它们映射到colorImage时,我会得到一个溢出的值,并且永远不会渲染骨架。

在下面的代码中,我将Center Hip分配给littleGuy [0],然后我选择偏移为-CHip,因为所有翻译都将基于此centerHip。然后我将偏移添加到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);

                    }

我真的需要在将它们映射到彩色图像之前操纵这些点......我该怎么做?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。由于SkeletonPoint中的X,Y,Z值是浮点数。在添加偏移量时键入Cast为decimal,然后键入将整个事物转换回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;
                }