Распознать два скелета Kinect

Я сделал игру (понг) с помощью 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;
            }
        }

Кто-нибудь мог бы мне помочь.


person seal    schedule 19.06.2014    source источник
comment
Как отличить игрока 1 от игрока 2?   -  person Liam McInroy    schedule 20.06.2014
comment
на данный момент не могу различить, читал, что kinect может распознать двух игроков... может давать id но не знаю как сделать   -  person seal    schedule 23.06.2014


Ответы (1)


Вам нужен способ отличить скелет один от второго. См. раздел Обнаружение пользователя Kinect, чтобы узнать, как это сделать. Затем вы можете передать скелет для первого и второго игроков двумя разными способами. Я использую идентификатор игрока, потому что если скелет теряется на кадр или два, его идентификатор остается прежним.

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;
                }
         }
     }
  }
person Liam McInroy    schedule 23.06.2014
comment
Вы имели в виду, чтобы оба идентификатора были одинаковыми? - person mason; 23.06.2014
comment
@mason Нет, ха-ха, случайно испортил мой код ... Проверьте мои правки - person Liam McInroy; 23.06.2014
comment
У меня вопрос, в каком случае код введет этот if (id1 != 0 && id2 == 0) id2 = skel.TrackingID; else if (id2 != 0 && id1 == 0) id1 = skel.TrackingID; я пробовал и он туда не проходит... я что-то пропустил? - person seal; 24.06.2014
comment
Я нашел способ отличить двух игроков, спасибо за помощь :) - person seal; 24.06.2014
comment
@seal Это условие выполняется, когда первый идентификатор был назначен (id1), поэтому он не равен нулю, но id2 по-прежнему имеет начальное значение, равное нулю, поэтому он назначает новый идентификатор id2 - person Liam McInroy; 24.06.2014