// Update the filter for all body joints private void FilterBodyJoints(ref KinectInterop.BodyData bodyData, int bodyIndex, SmoothParameters tempSmoothingParams) { KinectManager manager = KinectManager.Instance; int jointCount = manager.GetJointCount(); for (int jointIndex = 0; jointIndex < jointCount; jointIndex++) { // If not tracked, we smooth a bit more by using a bigger jitter radius // Always filter end joints highly as they are more noisy if (bodyData.joint[jointIndex].trackingState != KinectInterop.TrackingState.Tracked || jointIndex == (int)KinectInterop.JointType.FootLeft || jointIndex == (int)KinectInterop.JointType.FootRight || jointIndex == (int)KinectInterop.JointType.HandLeft || jointIndex == (int)KinectInterop.JointType.HandRight || jointIndex == (int)KinectInterop.JointType.HandtipLeft || jointIndex == (int)KinectInterop.JointType.HandtipRight || jointIndex == (int)KinectInterop.JointType.ThumbLeft || jointIndex == (int)KinectInterop.JointType.ThumbRight) //|| jointIndex == (int)KinectInterop.JointType.Head) { tempSmoothingParams.jitterRadius = smoothParameters.jitterRadius * 2.0f; tempSmoothingParams.maxDeviationRadius = smoothParameters.maxDeviationRadius * 2.0f; } else { tempSmoothingParams.jitterRadius = smoothParameters.jitterRadius; tempSmoothingParams.maxDeviationRadius = smoothParameters.maxDeviationRadius; } Vector3 jPosition = bodyData.joint[jointIndex].trackingState != KinectInterop.TrackingState.NotTracked ? bodyData.joint[jointIndex].position : Vector3.zero; bodyData.joint[jointIndex].position = FilterJoint(jPosition, bodyIndex, jointIndex, tempSmoothingParams); } bodyData.position = bodyData.joint[0].position; }
// Resets the filter to default values. public void Reset() { KinectManager kinectManager = KinectManager.Instance; int maxBodyCount = 10; // kinectManager.GetMaxBodyCount(); int jointCount = kinectManager.GetJointCount(); //history = new JointHistoryData[kinectManager.GetMaxBodyCount(), kinectManager.GetJointCount()]; history = new BodyHistoryData[maxBodyCount]; for (int i = 0; i < maxBodyCount; i++) { history[i] = new BodyHistoryData(jointCount); } //Debug.Log("BodyCount: " + kinectManager.GetMaxBodyCount() + ", JointCount: " + kinectManager.GetJointCount()); }
/// <summary> /// Applies foreground filter by body bounds. /// </summary> public void ApplyForegroundFilterByBody(Texture vertexTexture, RenderTexture alphaTexture, int playerIndex, int sensorIndex, int maxBodyCount, Matrix4x4 matKinectWorld, KinectManager kinectManager, Camera foregroundCamera) { Matrix4x4 matWorldKinect = matKinectWorld.inverse; if (kinectManager != null && kinectManager.userManager != null) { List <ulong> alUserIds = null; if (playerIndex < 0) { alUserIds = kinectManager.userManager.alUserIds; } else { alUserIds = new List <ulong>(); ulong userId = kinectManager.GetUserIdByIndex(playerIndex); if (userId != 0) { alUserIds.Add(userId); } } int uCount = Mathf.Min(alUserIds.Count, maxBodyCount); foregroundFilterShader.SetInt("_NumBodies", uCount); //if (uCount > 0) //{ // Debug.Log("playerIndex: " + playerIndex + ", uCount: " + uCount + ", userId: " + (uCount > 0 ? alUserIds[0] : 0)); //} // get the background rectangle (use the portrait background, if available) Rect backgroundRect = foregroundCamera.pixelRect; PortraitBackground portraitBack = PortraitBackground.Instance; if (portraitBack && portraitBack.enabled) { backgroundRect = portraitBack.GetBackgroundRect(); } int jCount = kinectManager.GetJointCount(); for (int i = 0; i < uCount; i++) { ulong userId = alUserIds[i]; bool bSuccess = kinectManager.GetUserBoundingBox(userId, /**foregroundCamera*/ null, sensorIndex, backgroundRect, out Vector3 pMin, out Vector3 pMax); //Debug.Log("pMin: " + pMin + ", pMax: " + pMax); if (bSuccess) { Vector3 posMin = new Vector3(pMin.x - leftOffset, pMin.y - offsetToFloor, pMin.z - frontOffset); Vector3 posMaxX = new Vector3(pMax.x + rightOffset, posMin.y, posMin.z); Vector3 posMaxY = new Vector3(posMin.x, pMax.y + headOffset, posMin.z); Vector3 posMaxZ = new Vector3(posMin.x, posMin.y, pMax.z + backOffset); //foregroundFilterDistXY[i] = new Vector4(xMin - 0.1f, xMax + 0.1f, yMin - offsetToFloor, yMax + 0.1f); //foregroundFilterDistZ[i] = new Vector4(zMin - 0.2f, zMax + 0.0f, 0f, 0f); bodyPosMin[i] = matWorldKinect.MultiplyPoint3x4(posMin); bodyPosMaxX[i] = matWorldKinect.MultiplyPoint3x4(posMaxX) - (Vector3)bodyPosMin[i]; bodyPosMaxY[i] = matWorldKinect.MultiplyPoint3x4(posMaxY) - (Vector3)bodyPosMin[i]; bodyPosMaxZ[i] = matWorldKinect.MultiplyPoint3x4(posMaxZ) - (Vector3)bodyPosMin[i]; bodyPosDot[i] = new Vector3(Vector3.Dot(bodyPosMaxX[i], bodyPosMaxX[i]), Vector3.Dot(bodyPosMaxY[i], bodyPosMaxY[i]), Vector3.Dot(bodyPosMaxZ[i], bodyPosMaxZ[i])); //Debug.Log("pMin: " + (Vector3)posMin + ", pMaxX: " + (Vector3)bodyPosMaxX[i] + ", pMaxY: " + (Vector3)bodyPosMaxY[i] + ", pMaxZ: " + (Vector3)bodyPosMaxZ[i] + ", pDot: " + (Vector3)bodyPosDot[i]); } //string sMessage2 = string.Format("Xmin: {0:F1}; Xmax: {1:F1}", bodyPosMin[i].x, bodyPosMaxX[i].x); //Debug.Log(sMessage2); } } //foregroundFilterShader.SetVectorArray("BodyPos", foregroundFilterPos); foregroundFilterShader.SetVectorArray("_BodyPosMin", bodyPosMin); foregroundFilterShader.SetVectorArray("_BodyPosMaxX", bodyPosMaxX); foregroundFilterShader.SetVectorArray("_BodyPosMaxY", bodyPosMaxY); foregroundFilterShader.SetVectorArray("_BodyPosMaxZ", bodyPosMaxZ); foregroundFilterShader.SetVectorArray("_BodyPosDot", bodyPosDot); foregroundFilterShader.SetTexture(foregroundFilterKernel, "_VertexTex", vertexTexture); foregroundFilterShader.SetTexture(foregroundFilterKernel, "_AlphaTex", alphaTexture); foregroundFilterShader.Dispatch(foregroundFilterKernel, vertexTexture.width / 8, vertexTexture.height / 8, 1); }
// applies foreground filter by body private void ApplyForegroundFilterByBody() { Matrix4x4 matKinectWorld = sensorInt.GetSensorToWorldMatrix(); //foregroundFilterShader.SetMatrix("_Transform", matKinectWorld); //foregroundFilterShader.SetFloat("Distance", 1f); Matrix4x4 matWorldKinect = matKinectWorld.inverse; if (kinectManager != null && kinectManager.userManager != null) { List <ulong> alUserIds = null; if (playerIndex < 0) { alUserIds = kinectManager.userManager.alUserIds; } else { alUserIds = new List <ulong>(); ulong userId = kinectManager.GetUserIdByIndex(playerIndex); if (userId != 0) { alUserIds.Add(userId); } } int uCount = Mathf.Min(alUserIds.Count, MAX_BODY_COUNT); foregroundFilterShader.SetInt("_NumBodies", uCount); // get the background rectangle (use the portrait background, if available) Rect backgroundRect = foregroundCamera.pixelRect; PortraitBackground portraitBack = PortraitBackground.Instance; if (portraitBack && portraitBack.enabled) { backgroundRect = portraitBack.GetBackgroundRect(); } int jCount = kinectManager.GetJointCount(); for (int i = 0; i < uCount; i++) { ulong userId = alUserIds[i]; //foregroundFilterPos[i] = kinectManager.GetUserPosition(userId); //float xMin = float.MaxValue, xMax = float.MinValue; //float yMin = float.MaxValue, yMax = float.MinValue; //float zMin = float.MaxValue, zMax = float.MinValue; //for (int j = 0; j < jCount; j++) //{ // if(kinectManager.IsJointTracked(userId, j)) // { // Vector3 jPos = kinectManager.GetJointPosColorOverlay(userId, j, sensorIndex, foregroundCamera, backgroundRect); // if (jPos.x < xMin) xMin = jPos.x; // if (jPos.y < yMin) yMin = jPos.y; // if (jPos.z < zMin) zMin = jPos.z; // if (jPos.x > xMax) xMax = jPos.x; // if (jPos.y > yMax) yMax = jPos.y; // if (jPos.z > zMax) zMax = jPos.z; // } //} bool bSuccess = kinectManager.GetUserBoundingBox(userId, foregroundCamera, sensorIndex, backgroundRect, out Vector3 pMin, out Vector3 pMax); if (bSuccess) { Vector3 posMin = new Vector3(pMin.x - leftRightOffset, pMin.y - offsetToFloor, pMin.z - frontOffset); Vector3 posMaxX = new Vector3(pMax.x + leftRightOffset, posMin.y, posMin.z); Vector3 posMaxY = new Vector3(posMin.x, pMax.y + headOffset, posMin.z); Vector3 posMaxZ = new Vector3(posMin.x, posMin.y, pMax.z + backOffset); //foregroundFilterDistXY[i] = new Vector4(xMin - 0.1f, xMax + 0.1f, yMin - offsetToFloor, yMax + 0.1f); //foregroundFilterDistZ[i] = new Vector4(zMin - 0.2f, zMax + 0.0f, 0f, 0f); bodyPosMin[i] = matWorldKinect.MultiplyPoint3x4(posMin); bodyPosMaxX[i] = matWorldKinect.MultiplyPoint3x4(posMaxX) - (Vector3)bodyPosMin[i]; bodyPosMaxY[i] = matWorldKinect.MultiplyPoint3x4(posMaxY) - (Vector3)bodyPosMin[i]; bodyPosMaxZ[i] = matWorldKinect.MultiplyPoint3x4(posMaxZ) - (Vector3)bodyPosMin[i]; bodyPosDot[i] = new Vector3(Vector3.Dot(bodyPosMaxX[i], bodyPosMaxX[i]), Vector3.Dot(bodyPosMaxY[i], bodyPosMaxY[i]), Vector3.Dot(bodyPosMaxZ[i], bodyPosMaxZ[i])); } //string sMessage2 = string.Format("Xmin: {0:F1}; Xmax: {1:F1}", bodyPosMin[i].x, bodyPosMaxX[i].x); //Debug.Log(sMessage2); } } //foregroundFilterShader.SetVectorArray("BodyPos", foregroundFilterPos); foregroundFilterShader.SetVectorArray("_BodyPosMin", bodyPosMin); foregroundFilterShader.SetVectorArray("_BodyPosMaxX", bodyPosMaxX); foregroundFilterShader.SetVectorArray("_BodyPosMaxY", bodyPosMaxY); foregroundFilterShader.SetVectorArray("_BodyPosMaxZ", bodyPosMaxZ); foregroundFilterShader.SetVectorArray("_BodyPosDot", bodyPosDot); foregroundFilterShader.SetTexture(foregroundFilterKernel, "_VertexTex", vertexTexture); //foregroundFilterShader.SetTexture(foregroundFilterKernel, "_AlphaTex", alphaTexture); foregroundFilterShader.Dispatch(foregroundFilterKernel, textureRes.x / 8, textureRes.y / 8, 1); }