// Use this for initialization void Start () { kinect = devOrEmu.getKinect(); players = new Kinect.NuiSkeletonTrackingState[Kinect.Constants.NuiSkeletonCount]; trackedPlayers = new int[Kinect.Constants.NuiSkeletonMaxTracked]; trackedPlayers[0] = -1; trackedPlayers[1] = -1; bonePos = new Vector3[2,(int)Kinect.NuiSkeletonPositionIndex.Count]; rawBonePos = new Vector3[2,(int)Kinect.NuiSkeletonPositionIndex.Count]; boneVel = new Vector3[2,(int)Kinect.NuiSkeletonPositionIndex.Count]; boneState = new Kinect.NuiSkeletonPositionTrackingState[2,(int)Kinect.NuiSkeletonPositionIndex.Count]; boneLocalOrientation = new Quaternion[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; boneAbsoluteOrientation = new Quaternion[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; //create the transform matrix that converts from kinect-space to world-space Matrix4x4 trans = new Matrix4x4(); trans.SetTRS( new Vector3(-kinect.getKinectCenter().x, kinect.getSensorHeight()-kinect.getKinectCenter().y, -kinect.getKinectCenter().z), Quaternion.identity, Vector3.one ); Matrix4x4 rot = new Matrix4x4(); Quaternion quat = new Quaternion(); double theta = Mathf.Atan((kinect.getLookAt().y+kinect.getKinectCenter().y-kinect.getSensorHeight()) / (kinect.getLookAt().z + kinect.getKinectCenter().z)); float kinectAngle = (float)(theta * (180 / Mathf.PI)); quat.eulerAngles = new Vector3(-kinectAngle, 0, 0); rot.SetTRS( Vector3.zero, quat, Vector3.one); //final transform matrix offsets the rotation of the kinect, then translates to a new center kinectToWorld = flipMatrix*trans*rot; }
// Use this for initialization void Start() { kinect = devOrEmu.getKinect(); players = new Kinect.NuiSkeletonTrackingState[Kinect.Constants.NuiSkeletonCount]; trackedPlayers = new int[Kinect.Constants.NuiSkeletonMaxTracked]; trackedPlayers[0] = -1; trackedPlayers[1] = -1; bonePos = new Vector3[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; rawBonePos = new Vector3[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; boneVel = new Vector3[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; boneState = new Kinect.NuiSkeletonPositionTrackingState[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; boneLocalOrientation = new Quaternion[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; boneAbsoluteOrientation = new Quaternion[2, (int)Kinect.NuiSkeletonPositionIndex.Count]; //create the transform matrix that converts from kinect-space to world-space Matrix4x4 trans = new Matrix4x4(); trans.SetTRS(new Vector3(-kinect.getKinectCenter().x, kinect.getSensorHeight() - kinect.getKinectCenter().y, -kinect.getKinectCenter().z), Quaternion.identity, Vector3.one); Matrix4x4 rot = new Matrix4x4(); Quaternion quat = new Quaternion(); double theta = Mathf.Atan((kinect.getLookAt().y + kinect.getKinectCenter().y - kinect.getSensorHeight()) / (kinect.getLookAt().z + kinect.getKinectCenter().z)); float kinectAngle = (float)(theta * (180 / Mathf.PI)); quat.eulerAngles = new Vector3(-kinectAngle, 0, 0); rot.SetTRS(Vector3.zero, quat, Vector3.one); //final transform matrix offsets the rotation of the kinect, then translates to a new center kinectToWorld = flipMatrix * trans * rot; }
using UnityEngine;
//public int footNotTrackedCount = 0; // Waterstrong update return type private void processSkeleton() { int[] tracked = new int[Kinect.Constants.NuiSkeletonMaxTracked]; tracked[0] = -1; tracked[1] = -1; int trackedCount = 0; //update players for (int ii = 0; ii < Kinect.Constants.NuiSkeletonCount; ii++) { players[ii] = kinect.getSkeleton().SkeletonData[ii].eTrackingState; if (players[ii] == Kinect.NuiSkeletonTrackingState.SkeletonTracked) { tracked[trackedCount] = ii; trackedCount++; } } playerState[0] = -4; // -4 refer to no skeleton tracking // Waterstrong Add playerState[1] = -4; //this should really use trackingID instead of index, but for now this is fine switch (trackedCount) { case 0: trackedPlayers[0] = -1; trackedPlayers[1] = -1; offsetCalibrated = false; break; case 1: if (trackedPlayers[1] >= 0) { offsetCalibrated = false; } trackedPlayers[0] = tracked[0]; trackedPlayers[1] = -1; // Waterstrong Alter for only one player /* Waterstrong Comments * //last frame there were no players: assign new player to p1 * if (trackedPlayers[0] < 0 && trackedPlayers[1] < 0) * trackedPlayers[0] = tracked[0]; * //last frame there was one player, keep that player in the same spot * else if (trackedPlayers[0] < 0) * trackedPlayers[1] = tracked[0]; * else if (trackedPlayers[1] < 0) * trackedPlayers[0] = tracked[0]; * //there were two players, keep the one with the same index (if possible) * else * { * if (tracked[0] == trackedPlayers[0]) * trackedPlayers[1] = -1; * else if (tracked[0] == trackedPlayers[1]) * trackedPlayers[0] = -1; * else * { * trackedPlayers[0] = tracked[0]; * trackedPlayers[1] = -1; * } * }*/ break; case 2: //last frame there were no players: assign new players to p1 and p2 if (trackedPlayers[0] < 0 && trackedPlayers[1] < 0) { trackedPlayers[0] = tracked[0]; trackedPlayers[1] = tracked[1]; } //last frame there was one player, keep that player in the same spot else if (trackedPlayers[0] < 0) { if (trackedPlayers[1] == tracked[0]) { trackedPlayers[0] = tracked[1]; } else { trackedPlayers[0] = tracked[0]; trackedPlayers[1] = tracked[1]; } } else if (trackedPlayers[1] < 0) { if (trackedPlayers[0] == tracked[1]) { trackedPlayers[1] = tracked[0]; } else { trackedPlayers[0] = tracked[0]; trackedPlayers[1] = tracked[1]; } } //there were two players, keep the one with the same index (if possible) else { if (trackedPlayers[0] == tracked[1] || trackedPlayers[1] == tracked[0]) { trackedPlayers[0] = tracked[1]; trackedPlayers[1] = tracked[0]; } else { trackedPlayers[0] = tracked[0]; trackedPlayers[1] = tracked[1]; } } break; } //update the bone positions, velocities, and tracking states) for (int player = 0; player < 2; player++) { //print(player + ", " +trackedPlayers[player]); if (trackedPlayers[player] >= 0) { ///////////////////////////////////////////////////////////// // get player position // Waterstrong Add //playerPos[player] = kinectToWorld.MultiplyPoint3x4(kinect.getSkeleton().SkeletonData[trackedPlayers[player]].Position); // playerPos[player].z = playerPos[player].z; // get player position // Waterstrong Add playerPos[player] = kinectToWorld.MultiplyPoint3x4(kinect.getSkeleton().SkeletonData[trackedPlayers[player]].SkeletonPositions[(int)NuiSkeletonPositionIndex.HipCenter]); // if user is not in range return false; // Waterstorng Add if (kinect.getKinectCenter().z - playerPos[player].z < 1.7f) { playerState[player] = -3; continue; // should be continue, not break, or the second player can't get data // Waterstrong Attention } if (kinect.getKinectCenter().z - playerPos[player].z > 3.5f) { playerState[player] = 3; continue; } if (kinect.getKinectCenter().x - playerPos[player].x < -0.7f) { playerState[player] = -1; continue; } if (kinect.getKinectCenter().x - playerPos[player].x > 0.7f) { playerState[player] = 1; continue; } playerState[player] = 0; // skeleton tracking is ok // Waterstrong Add //footNotTrackedCount = 0; ///////////////////////////////////////////////////////////// for (int bone = 0; bone < (int)Kinect.NuiSkeletonPositionIndex.Count; bone++) { NuiSkeletonPositionTrackingState jointTrackingState = kinect.getSkeleton().SkeletonData[trackedPlayers[player]].eSkeletonPositionTrackingState[bone]; if (jointTrackingState == NuiSkeletonPositionTrackingState.NotTracked) { //if (bone >= (int)NuiSkeletonPositionIndex.KneeLeft && // bone <= (int)NuiSkeletonPositionIndex.FootRight && // bone != (int)NuiSkeletonPositionIndex.HipRight) //{ // ++footNotTrackedCount; //} continue; } Vector3 oldpos = bonePos[player, bone]; bonePos[player, bone] = kinectToWorld.MultiplyPoint3x4(kinect.getSkeleton().SkeletonData[trackedPlayers[player]].SkeletonPositions[bone]); //bonePos[player,bone] = kinectToWorld.MultiplyPoint3x4(bonePos[player, bone]); rawBonePos[player, bone] = kinect.getSkeleton().SkeletonData[trackedPlayers[player]].SkeletonPositions[bone]; Kinect.NuiSkeletonBoneOrientation[] or = kinect.getBoneOrientations(kinect.getSkeleton().SkeletonData[trackedPlayers[player]]); boneLocalOrientation[player, bone] = or[bone].hierarchicalRotation.rotationQuaternion.GetQuaternion(); boneAbsoluteOrientation[player, bone] = or[bone].absoluteRotation.rotationQuaternion.GetQuaternion(); //print("index " + bone + ", start" + (int)or[bone].startJoint + ", end" + (int)or[bone].endJoint); boneVel[player, bone] = (bonePos[player, bone] - oldpos) / deltaTime; boneState[player, bone] = kinect.getSkeleton().SkeletonData[trackedPlayers[player]].eSkeletonPositionTrackingState[bone]; //print(kinect.getSkeleton().SkeletonData[player].Position.z); } //if (footNotTrackedCount > 2) //{ // return false; //} } } }