// 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(); }
// 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); }
// 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(); } }