1

我使用 kinect 制作了一个游戏(乒乓球),我可以识别一个骨架,并且可以做出手势来控制左摇杆,但是当我尝试与两个玩家一起玩时,我无法识别其他玩家的骨架。这是我到目前为止所做的:

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

有人可以帮助我。

4

1 回答 1

1

您需要一种方法来区分骨架一和骨架二。请参阅Kinect 用户检测了解如何执行此操作。然后,您可以将玩家一和二的骨架传递给您的两种不同方法。我使用玩家 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;
                }
         }
     }
  }
于 2014-06-23T15:11:32.350 回答