Пример #1
0
    // draws the skeleton in the given texture
    private void DrawSkeleton(Texture2D aTexture, ref KinectWrapper.BodyData bodyData)
    {
        int jointsCount = KinectWrapper.Constants.JointCount;

        for (int i = 0; i < jointsCount; i++)
        {
            int parent = (int)KinectWrapper.GetParentJoint((KinectWrapper.JointType)i);

            if (bodyData.joint[i].trackingState == KinectWrapper.TrackingState.Tracked && bodyData.joint[parent].trackingState == KinectWrapper.TrackingState.Tracked)
            {
                Vector2 posParent = KinectWrapper.GetKinectPointDepthCoords(bodyData.joint[parent].kinectPos);
                Vector2 posJoint  = KinectWrapper.GetKinectPointDepthCoords(bodyData.joint[i].kinectPos);

//				posParent.y = KinectWrapper.Constants.ImageHeight - posParent.y - 1;
//				posJoint.y = KinectWrapper.Constants.ImageHeight - posJoint.y - 1;
//				posParent.x = KinectWrapper.Constants.ImageWidth - posParent.x - 1;
//				posJoint.x = KinectWrapper.Constants.ImageWidth - posJoint.x - 1;

                //Color lineColor = playerJointsTracked[i] && playerJointsTracked[parent] ? Color.red : Color.yellow;
                DrawLine(aTexture, (int)posParent.x, (int)posParent.y, (int)posJoint.x, (int)posJoint.y, Color.yellow);
            }
        }

        //aTexture.Apply();
    }
Пример #2
0
    // returns the interaction box for the right hand of the specified user, in meters
    public bool GetRightHandInteractionBox(Int64 userId, ref Vector3 leftBotBack, ref Vector3 rightTopFront, bool bValidBox)
    {
        if (dictUserIdToIndex.ContainsKey(userId))
        {
            int index = dictUserIdToIndex[userId];

            if (index >= 0 && index < KinectWrapper.Constants.BodyCount &&
                bodyFrame.bodyData[index].bIsTracked != 0)
            {
                KinectWrapper.BodyData bodyData = bodyFrame.bodyData[index];
                bool bResult = true;

                if (bodyData.joint[(int)KinectWrapper.JointType.ShoulderLeft].trackingState == KinectWrapper.TrackingState.Tracked &&
                    bodyData.joint[(int)KinectWrapper.JointType.HipRight].trackingState == KinectWrapper.TrackingState.Tracked)
                {
                    leftBotBack.x   = bodyData.joint[(int)KinectWrapper.JointType.ShoulderLeft].position.x;
                    rightTopFront.x = leftBotBack.x + 2 * (bodyData.joint[(int)KinectWrapper.JointType.HipRight].position.x - leftBotBack.x);
                }
                else
                {
                    bResult = bValidBox;
                }

                if (bodyData.joint[(int)KinectWrapper.JointType.HipLeft].trackingState == KinectWrapper.TrackingState.Tracked &&
                    bodyData.joint[(int)KinectWrapper.JointType.ShoulderLeft].trackingState == KinectWrapper.TrackingState.Tracked)
                {
                    leftBotBack.y   = bodyData.joint[(int)KinectWrapper.JointType.HipLeft].position.y;
                    rightTopFront.y = bodyData.joint[(int)KinectWrapper.JointType.ShoulderLeft].position.y;

                    float fDelta = (rightTopFront.y - leftBotBack.y) * 2 / 3;
                    leftBotBack.y   += fDelta;
                    rightTopFront.y += fDelta;
                }
                else
                {
                    bResult = bValidBox;
                }

                if (bodyData.joint[(int)KinectWrapper.JointType.HipCenter].trackingState == KinectWrapper.TrackingState.Tracked)
                {
                    leftBotBack.z   = bodyData.joint[(int)KinectWrapper.JointType.HipCenter].position.z;
                    rightTopFront.z = leftBotBack.z - 0.5f;
                }
                else
                {
                    bResult = bValidBox;
                }

                return(bResult);
            }
        }

        return(false);
    }
Пример #3
0
    // Processes body frame data
    private void ProcessBodyFrameData()
    {
        List <Int64> lostUsers = new List <Int64>();

        lostUsers.AddRange(alUserIds);

        for (int i = 0; i < KinectWrapper.Constants.BodyCount; i++)
        {
            KinectWrapper.BodyData bodyData = bodyFrame.bodyData[i];
            Int64 userId = bodyData.liTrackingID;

            if (bodyData.bIsTracked != 0 && Mathf.Abs(kinectToWorld.MultiplyPoint3x4(bodyData.position).z) >= minUserDistance)
            {
                // get the body position
                Vector3 bodyPos = kinectToWorld.MultiplyPoint3x4(bodyData.position);

                if (liPrimaryUserId == 0)
                {
                    // check if this is the closest user
                    bool bClosestUser      = true;
                    int  iClosestUserIndex = i;

                    if (detectClosestUser)
                    {
                        for (int j = 0; j < KinectWrapper.Constants.BodyCount; j++)
                        {
                            if (j != i)
                            {
                                KinectWrapper.BodyData bodyDataOther = bodyFrame.bodyData[j];

                                if ((bodyDataOther.bIsTracked != 0) &&
                                    (Mathf.Abs(kinectToWorld.MultiplyPoint3x4(bodyDataOther.position).z) < Mathf.Abs(bodyPos.z)))
                                {
                                    bClosestUser      = false;
                                    iClosestUserIndex = j;
                                    break;
                                }
                            }
                        }
                    }

                    if (bClosestUser)
                    {
                        // calibrate the first or closest user
                        CalibrateUser(userId, iClosestUserIndex);
                    }
                }

                // calibrate current user
                CalibrateUser(userId, i);

                // convert Kinect positions to world positions
                bodyFrame.bodyData[i].position = bodyPos;

                for (int j = 0; j < KinectWrapper.Constants.JointCount; j++)
                {
                    bodyData.joint[j].position = kinectToWorld.MultiplyPoint3x4(bodyData.joint[j].position);

                    if ((bodyData.liTrackingID == liPrimaryUserId) && (j == (int)KinectWrapper.JointType.HipCenter) &&
                        bodyData.joint[j].trackingState == KinectWrapper.TrackingState.Tracked)
                    {
                        string debugText = String.Format("Body Pos: {0}", bodyData.joint[j].position);

                        if (calibrationText)
                        {
                            calibrationText.guiText.text = debugText;
                        }
                    }
                }

                lostUsers.Remove(userId);
            }
        }

        // remove the lost users if any
        if (lostUsers.Count > 0)
        {
            foreach (Int64 userId in lostUsers)
            {
                RemoveUser(userId);
            }

            lostUsers.Clear();
        }
    }