C# 识别两个骨骼Kinect

C# 识别两个骨骼Kinect,c#,kinect,kinect-interaction,C#,Kinect,Kinect Interaction,我用kinect做了一个游戏(pong),我可以识别一个骨架,我可以做手势来控制左边的棍子,但是当我尝试与两个玩家玩游戏时,我无法识别其他玩家的骨架。这就是我目前所做的: private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { Skeleton[] skeletons = new Skeleton[0]; using

我用kinect做了一个游戏(pong),我可以识别一个骨架,我可以做手势来控制左边的棍子,但是当我尝试与两个玩家玩游戏时,我无法识别其他玩家的骨架。这就是我目前所做的:

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            Skeleton[] skeletons = new Skeleton[0];

            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                    skeletonFrame.CopySkeletonDataTo(skeletons);
                }
                if (skeletons.Length != 0)
                {
                    foreach (Skeleton skel in skeletons)
                    {
                        if (skel.TrackingState == SkeletonTrackingState.Tracked)
                        {
                            this.tracked(skel);
                            this.trackedLeft(skel);
                        }
                    }
                }
            }
        }

        public void tracked(Skeleton skeleton)
        {
            Joint jHandRight = skeleton.Joints[JointType.HandRight];
            Joint jHipCenter = skeleton.Joints[JointType.HipCenter];
            if ((jHipCenter.Position.Z - jHandRight.Position.Z) > 0.2)
            {
                //Consider hand raised in front of them
                //System.Diagnostics.Debug.WriteLine("Hand: Raised");
                //MessageBox.Show("POR FAVORRRRRRRR");
                //movement[0] = false;
                movement[0] = true;
                movement[1] = false;
            }
            else
            {
                //Hand is lowered by the users side
                //System.Diagnostics.Debug.WriteLine("Hand: Lowered");
                //MessageBox.Show("A SERRRRIIIIIOOOOOOOOOOOOOO");
                //movement[1] = false;
                movement[1] = true;
                movement[0] = false;
            }
        }

有人可以帮我。

你需要一种区分骨架一和骨架二的方法。请参阅以了解如何执行此操作。然后可以将玩家1和玩家2的骨架传递给两种不同的方法。我使用玩家ID是因为如果一个骨架丢失一两帧,它们的ID将保持不变

int id1 = 0, id2 = 0;

... 

if (skeletons.Length != 0)
{
    foreach (Skeleton skel in skeletons)
    {
         if (skel.TrackingState == SkeletonTrackingState.Tracked)
         {
                if (skel.TrackingID == id1)
                    this.tracked(skel);
                else if (skel.TrackingID == id2)
                    this.trackedLeft(skel);
                else
                {
                     if (id1 != 0 && id2 == 0)
                         id2 = skel.TrackingID;
                     else if (id2 != 0 && id1 == 0)
                         id1 = skel.TrackingID;
                }
         }
     }
  }

如何区分玩家1和玩家2?目前我无法区分,我读到kinect可以识别两个玩家。。。也许是给身份证,但不知道如何识别你的意思是两个身份证都是一样的?@mason No haha不小心弄乱了我的代码。。。检查我的编辑我有一个问题,在这种情况下,如果(id1!=0&&id2==0)id2=skel.TrackingID;如果(id2!=0&&id1==0)id1=skel.TrackingID我试过了,但它从未通过那里。。。我遗漏了什么吗?我找到了区分这两个玩家的方法,谢谢你的帮助:)@seal当第一个id被分配(id1)时,条件是满足的,所以它不是零,但id2的起始值仍然是零,所以它将新id分配给id2