public void MergeSkeleton(KinectSkeleton srcData, Matrix4x4 transform) { if (!srcData.valid) { return; } //TODO utilize jointStates if (mergeCount == 0) { //first skeleton, set data for (int i = 0; i < JOINT_COUNT; i++) { jointPositions3D[i] = transform.MultiplyPoint(srcData.jointPositions3D[i]); jointStates[i] = srcData.jointStates[i]; } } else { for (int i = 0; i < JOINT_COUNT; i++) { jointPositions3D[i] += transform.MultiplyPoint(srcData.jointPositions3D[i]); if (jointStates[i] > srcData.jointStates[i]) { jointStates[i] = srcData.jointStates[i]; } } } valid = true; mergeCount++; }
public Vector3 GetRelativePos(Body b, JointType j) { var parent = KinectSkeleton.GetParent(j).Value(); var dir = ToVector3(b.Joints[j]) - ToVector3(b.Joints[parent]); return(dir.normalized); }
public void RefreshBodyObject(User user)//Kinect.Body body, GameObject bodyObject) { if (Application.isPlaying && showSkeletons) { KinectSkeleton skeleton = GetKinectSkeleton(user.skeletonID); if (skeleton != null && (skeleton.valid)) { for (int i = 0; i < skeleton.jointPositions3D.Length; i++) { KinectSkeleton.TrackingState state = skeleton.jointStates[i]; bool tracked = state != KinectSkeleton.TrackingState.NotTracked; //JointMaterial = joints[i].GetComponent<Renderer>().material; //JointMaterial.color = GetColorForState(state); if (tracked) { joints[i].localPosition = skeleton.jointPositions3D[i]; } } for (int k = 0; k < HumanTopology.BONE_CONNECTIONS.Length; k++) { BoneConnection bone = HumanTopology.BONE_CONNECTIONS[k]; JointType joint1 = bone.fromJoint; JointType joint2 = bone.toJoint; LineRenderer lr = joints[(int)joint2].GetComponent <LineRenderer>(); lr.SetPosition(0, joints[(int)joint1].position); lr.SetPosition(1, joints[(int)joint2].position); } /*for (int i = 0; i < HumanTopology.BONE_CONNECTIONS.Length; i++) * { * BoneConnection bone = HumanTopology.BONE_CONNECTIONS[i]; * JointType joint1 = bone.fromJoint; * JointType joint2 = bone.toJoint; * KinectSkeleton.TrackingState state1 = skeleton.jointStates[(int)joint1]; * KinectSkeleton.TrackingState state2 = skeleton.jointStates[(int)joint2]; * LineRenderer lr = joints[i].GetComponent<LineRenderer>(); * bool tracked = state1 != KinectSkeleton.TrackingState.NotTracked && state2 != KinectSkeleton.TrackingState.NotTracked; * if (tracked) * { * lr.SetPosition(0, skeleton.jointPositions3D[(int)joint1]); * lr.SetPosition(1, skeleton.jointPositions3D[(int)joint2]); * * lr.startColor = GetColorForState(state1); * lr.endColor = GetColorForState(state2); * } * * }*/ } } }
public JointConstraint( KinectSkeleton ks, KinectSkeleton.Joints joint_a, KinectSkeleton.Joints joint_b, Relations relation, Operators operation, Vector3 val ) { this.ks = ks; this.joint_a = joint_a; this.joint_b = joint_b; this.relation = relation; this.operation = operation; this.val = val; }
/*private void drawEye(Vector3 pos, DetectionResult closed, Quaternion rotation) * { * Color color = faceColor; * if (closed == DetectionResult.Unknown) * color.a *= 0.4f; * if (closed == DetectionResult.Maybe) * color.a *= 0.8f; * Gizmos.color = color; * if (closed != DetectionResult.Yes) * Gizmos.DrawSphere(pos, eyeRadius); * else * { * Gizmos.matrix = transform.localToWorldMatrix * Matrix4x4.TRS(pos, rotation, new Vector3(0.9f, 0.2f, 0.9f)); * Gizmos.DrawSphere(Vector3.zero, eyeRadius); * Gizmos.matrix = transform.localToWorldMatrix; * } * * }*/ public void CreateSkeleton(User user) { if (Application.isPlaying && showSkeletons) { KinectSkeleton skeleton = GetKinectSkeleton(user.skeletonID); if (skeleton != null && (skeleton.valid)) { for (int i = 0; i < skeleton.jointPositions3D.Length; i++) { GameObject jointObj = GameObject.CreatePrimitive((PrimitiveType.Sphere)); LineRenderer lr = jointObj.AddComponent <LineRenderer>(); lr.positionCount = 2; lr.material = BoneMaterial; lr.startWidth = 0.005f; lr.endWidth = 0.005f; JointMaterial = jointObj.GetComponent <Renderer>().material; if (user.userID == 0) { JointMaterial.color = Color.red; } else if (user.userID == 1) { JointMaterial.color = Color.green; } else if (user.userID == 2) { JointMaterial.color = Color.yellow; } else if (user.userID == 3) { JointMaterial.color = Color.cyan; } else if (user.userID == 4) { JointMaterial.color = Color.magenta; } jointObj.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); jointObj.name = HumanTopology.JOINT_NAMES[i]; jointObj.transform.parent = user.gameObject.transform; joints[i] = jointObj.transform; } } } }
public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton) { KinectSkeleton transformedSkeleton = new KinectSkeleton(); transformedSkeleton.leftHandClosed = skeleton.leftHandClosed; transformedSkeleton.rightHandClosed = skeleton.rightHandClosed; transformedSkeleton.TrackingId = skeleton.TrackingId; transformedSkeleton.SkeletonTrackingState = skeleton.SkeletonTrackingState; //transformedSkeleton.utcSampleTime = skeleton.utcSampleTime; transformedSkeleton.sourceKinectID = skeleton.sourceKinectID; transformedSkeleton.Position = skeletonTransformation.Transform(skeleton.Position); //Transform the joints for (int i = 0; i < skeleton.skeleton.Count; i++) { transformedSkeleton.skeleton[i] = TransformJoint(skeleton.skeleton[i]); } return(transformedSkeleton); }
private void Update() { //Update the kinect data for (int i = 0; i < users.Length; i++) { if (users[i].skeletonProvider != null) { KinectSkeleton skeleton = users[i].GetSkeleton(); if (skeleton != null && skeleton.valid) { if (!users[i].created) { users[i].skeletonProvider.CreateSkeleton(users[i]); users[i].created = true; } if (users[i].updateFromKinect) { /*transform.position = getHeadPosition(); * if (lookAt != null) * { * transform.LookAt(lookAt.transform.position); * } * //else transform.localRotation = Quaternion.identity;*/ users[i].skeletonProvider.RefreshBodyObject(users[i]); } } } } #region Kabsch implementation if (kabsch) { //Get the latest Tranform positions for (int i = 0; i < users.Length; i++) { if (users[i].GetSkeleton() != null && users[i].GetSkeleton().valid) { for (int j = 0; j < users[i].skeletonProvider.joints.Length; j++) { pointSets[i][j] = users[i].skeletonProvider.joints[j].position; } } } for (int j = 0; j < targetPointSet.Length; j++) { if (users[0].GetSkeleton() != null && users[0].GetSkeleton().valid) { targetPointSet[j] = new Vector4(users[0].skeletonProvider.joints[j].position.x, users[0].skeletonProvider.joints[j].position.y, users[0].skeletonProvider.joints[j].position.z, users[0].skeletonProvider.joints[j].localScale.x); } } //Calculate new positions for the skeletons for (int k = 1; k < users.Length; k++) { if (users[k].GetSkeleton() != null && users[k].GetSkeleton().valid) { Matrix4x4 kabschTransform = solver.SolveKabsch(pointSets[k], targetPointSet); for (int i = 0; i < users[k].skeletonProvider.joints.Length; i++) { users[k].skeletonProvider.joints[i].position = kabschTransform.MultiplyPoint3x4(pointSets[k][i]); for (int j = 0; j < HumanTopology.BONE_CONNECTIONS.Length; j++) { BoneConnection bone = HumanTopology.BONE_CONNECTIONS[j]; JointType joint1 = bone.fromJoint; JointType joint2 = bone.toJoint; LineRenderer lr = users[k].skeletonProvider.joints[(int)joint2].GetComponent <LineRenderer>(); lr.SetPosition(0, users[k].skeletonProvider.joints[(int)joint1].position); lr.SetPosition(1, users[k].skeletonProvider.joints[(int)joint2].position); } /*for (int j = 0; j < HumanTopology.BONE_CONNECTIONS.Length; j++) * { * BoneConnection bone = HumanTopology.BONE_CONNECTIONS[j]; * JointType joint1 = bone.fromJoint; * JointType joint2 = bone.toJoint; * KinectSkeleton.TrackingState state1 = users[k].GetSkeleton().jointStates[(int)joint1]; * KinectSkeleton.TrackingState state2 = users[k].GetSkeleton().jointStates[(int)joint2]; * LineRenderer lr = users[k].skeletonProvider.joints[i].GetComponent<LineRenderer>(); * bool tracked = state1 != KinectSkeleton.TrackingState.NotTracked && state2 != KinectSkeleton.TrackingState.NotTracked; * if (tracked) * { * lr.SetPosition(0, users[k].skeletonProvider.joints[(int)joint1].position); * lr.SetPosition(1, users[k].skeletonProvider.joints[(int)joint2].position); * } * }*/ } } } } #endregion #region Kalman implementation if (kalman) { for (int i = 0; i < HumanTopology.JOINT_NAMES.Length; i++) { for (int j = 0; j < users.Length; j++) { if (users[j].GetSkeleton() != null && users[j].GetSkeleton().valid) { filters[i].PredictState(Time.deltaTime); filters[i].UpdateState(new double[, ] { { users[j].skeletonProvider.joints[i].position.x }, { users[j].skeletonProvider.joints[i].position.y }, { users[j].skeletonProvider.joints[i].position.z }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 } }); double oldPos = filters[i].StateMatrix[0, 0]; /*for (int k = 1; k < 10; k++) * { * double[,] PredictedState = filters[i].SafePredictState(0.1 * k); * Debug.DrawLine(new Vector3((float)oldPos, k * 0.02f, 0f), new Vector3((float)PredictedState[0, 0], (k + 1) * 0.02f, 0f), Color.green); * oldPos = PredictedState[0, 0]; * * Debug.DrawLine(new Vector3(Mathf.Sin((Time.time + (k * 0.1f))), k * 0.02f, 0f), * new Vector3(Mathf.Sin((Time.time + ((k + 1f) * 0.1f))), (k + 1) * 0.02f, 0f), Color.red); * }*/ fusedJoints[i].position = new Vector3((float)filters[i].StateMatrix[0, 0], (float)filters[i].StateMatrix[1, 0], (float)filters[i].StateMatrix[2, 0]); } } } for (int k = 0; k < HumanTopology.BONE_CONNECTIONS.Length; k++) { BoneConnection bone = HumanTopology.BONE_CONNECTIONS[k]; JointType joint1 = bone.fromJoint; JointType joint2 = bone.toJoint; LineRenderer lr = fusedJoints[(int)joint2].GetComponent <LineRenderer>(); lr.SetPosition(0, fusedJoints[(int)joint1].position); lr.SetPosition(1, fusedJoints[(int)joint2].position); } readyToScale = true; } #endregion }
public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton) { KinectSkeleton transformedSkeleton = new KinectSkeleton(); transformedSkeleton.leftHandClosed = skeleton.leftHandClosed; transformedSkeleton.rightHandClosed = skeleton.rightHandClosed; transformedSkeleton.TrackingId = skeleton.TrackingId; transformedSkeleton.SkeletonTrackingState = skeleton.SkeletonTrackingState; //transformedSkeleton.utcSampleTime = skeleton.utcSampleTime; transformedSkeleton.sourceKinectID = skeleton.sourceKinectID; transformedSkeleton.Position = skeletonTransformation.Transform(skeleton.Position); //Transform the joints for (int i = 0; i < skeleton.skeleton.Count; i++) { transformedSkeleton.skeleton[i] = TransformJoint(skeleton.skeleton[i]); } return transformedSkeleton; }
internal void AddSkeletonToMerge(KinectSkeleton skeleton) { for (int i = skeletonsToMerge.Count - 1; i >= 0; i--) { if (skeletonsToMerge[i].sourceKinectID == skeleton.sourceKinectID) { skeletonsToMerge.RemoveAt(i); } } skeletonsToMerge.Add(skeleton); needsUpdate = true; }
public void CopyFrom(KinectSkeleton templateSkel, Matrix4x4 transform) { mergeCount = 0; MergeSkeleton(templateSkel, transform); FinishMerging(); }
public JointConstraint( KinectSkeleton ks, KinectSkeleton.Joints joint_a, KinectSkeleton.Joints joint_b ) { this.ks = ks; this.joint_a = joint_a; this.joint_b = joint_b; }
// constructors public JointConstraint( KinectSkeleton ks ) { this.ks = ks; }
public Vector3 GetRelativePos(KinectSkeleton b, JointType j) => b[j].transform.position - b[JointType.SpineMid].transform.position;
public Mapping(KinectSkeleton ks, KinectSkeleton.Joints joint, Vector3 weights) { this.ks = ks; joints.Add(joint); jc_weights.Add(weights); }
public bool IsReady() { KinectSkeleton skel = GetSkeleton(); return(skel != null && skel.valid); }
private void RemoteComputer_NewSkeletonFrame(object state, ReceivedMessageEventArgs args) { //DateTime now = DateTime.Now; MemoryStream memStream = new MemoryStream(args.data); BinaryReader reader = new BinaryReader(memStream); long timeStampSkeleton = reader.ReadInt64(); validBodiesCount = reader.ReadByte(); for (int cnt = 0; cnt < 6; cnt++) { KinectSkeleton skeleton = pendingSkeletonFrame.skeletons[cnt]; if (cnt < validBodiesCount) { skeleton.valid = true; skeleton.ID = (ulong)reader.ReadInt64(); skeleton.jointPositions3D = new Vector3[25]; for (int i = 0; i < KinectSkeleton.JOINT_COUNT; i++) { var position = new Vector3(); position.x = -reader.ReadSingle(); position.y = reader.ReadSingle(); position.z = reader.ReadSingle(); skeleton.jointPositions3D[i] = position; skeleton.jointStates[i] = (KinectSkeleton.TrackingState)reader.ReadByte(); } skeleton.handLeftConfidence = reader.ReadByte(); //0=not confident, 1= confident skeleton.handLeftState = reader.ReadByte(); skeleton.handRightConfidence = reader.ReadByte(); skeleton.handRightState = reader.ReadByte(); } else { skeleton.valid = false; } } //accelerometer reading float x, y, z, w; x = reader.ReadSingle(); y = reader.ReadSingle(); z = reader.ReadSingle(); w = reader.ReadSingle(); pendingSkeletonFrame.deviceAcceleration = KinectToWorldNoT(new Vector3(x / w, y / w, z / w)); //mProCamUnit.KinectToWorldNoT(new Vector3(x / w, y / w, z / w)); pendingSkeletonFrame.timeStampSkeleton = timeStampSkeleton; reader.Close(); lock (nextSkeletonFrame) { Swap <KinectSkeletonFrame>(ref nextSkeletonFrame, ref pendingSkeletonFrame); /*/ Skeletal data serialization * if (StreamToFile) * { * // Serialize skeleton frame to file * formatter.Serialize(skeletonStream, nextSkeletonFrame); * }*/ } nextSkeletonFrameReady.Set(); }
// updates joints void update_joint(KinectSkeleton.Joints joint_type, GameObject joint_obj) { Quaternion spine_rotation; Vector3 direction = game_joint_pos[(int)joint_type]; switch (joint_type) { case Joints.HEAD: skShoulderCenter.transform.localRotation = Quaternion.FromToRotation(Vector3.up, direction) * Quaternion.FromToRotation(Vector3.up, new Vector3(0.0f, 1.0f, -0.2f)); break; case Joints.SHOULDER_CENTER: skSpine.transform.localRotation = Quaternion.FromToRotation(model_joint_pos[(int)Joints.SHOULDER_CENTER], direction); break; case Joints.ELBOW_LEFT: spine_rotation = Quaternion.FromToRotation(model_joint_pos[(int)Joints.SPINE], game_joint_pos[(int)Joints.SPINE]); spine_rotation.w /= 0.5f; spine_rotation *= Quaternion.FromToRotation(Vector3.up, new Vector3(0.0f, 1.0f, 0.2f)); skLeftShoulder.transform.localRotation = Quaternion.Inverse(spine_rotation) * Quaternion.Inverse(Quaternion.FromToRotation(model_joint_pos[(int)Joints.SHOULDER_CENTER], game_joint_pos[(int)Joints.SHOULDER_CENTER])) * Quaternion.FromToRotation(model_joint_pos[(int)Joints.ELBOW_LEFT], direction); break; case Joints.WRIST_LEFT: skLeftElbow.transform.localRotation = Quaternion.FromToRotation(game_joint_pos[(int)Joints.ELBOW_LEFT], direction); break; case Joints.HAND_LEFT: skLeftWrist.transform.localRotation = Quaternion.FromToRotation(game_joint_pos[(int)Joints.WRIST_LEFT], direction); break; case Joints.ELBOW_RIGHT: spine_rotation = Quaternion.FromToRotation(model_joint_pos[(int)Joints.SPINE], game_joint_pos[(int)Joints.SPINE]); spine_rotation.w /= 0.5f; spine_rotation *= Quaternion.FromToRotation(Vector3.up, new Vector3(0.0f, 1.0f, 0.2f)); skRightShoulder.transform.localRotation = Quaternion.Inverse(spine_rotation) * Quaternion.Inverse(Quaternion.FromToRotation(model_joint_pos[(int)Joints.SHOULDER_CENTER], game_joint_pos[(int)Joints.SHOULDER_CENTER])) * Quaternion.FromToRotation(model_joint_pos[(int)Joints.ELBOW_RIGHT], direction); break; case Joints.WRIST_RIGHT: skRightElbow.transform.localRotation = Quaternion.FromToRotation(game_joint_pos[(int)Joints.ELBOW_RIGHT], direction); break; case Joints.HAND_RIGHT: skRightWrist.transform.localRotation = Quaternion.FromToRotation(game_joint_pos[(int)Joints.WRIST_RIGHT], direction); break; case Joints.SPINE: Quaternion base_rotation = Quaternion.FromToRotation(model_joint_pos[(int)Joints.SPINE], direction); base_rotation.w /= 0.5f; skHipCenter.transform.localRotation = base_rotation * Quaternion.FromToRotation(Vector3.up, new Vector3(0.0f, 1.0f, 0.9f)); break; default: break; } }
// Use this for initialization void Start() { if (ks_master == null) ks_master = this; raw_joint_pos[(int)Joints.HIP_CENTER] = new Vector3(0.0f, 0.0f, 0.0f); game_joint_pos[(int)Joints.HIP_CENTER] = new Vector3(0.0f, 0.0f, 0.0f); // adds all the game objects to the associated hashmap for the enum type if (skHead != null) add_skeleton_joint (Joints.HEAD, skHead); if (skSpine != null) add_skeleton_joint (Joints.SPINE, skSpine); if (skHipCenter != null) add_skeleton_joint (Joints.HIP_CENTER, skHipCenter); if (skShoulderCenter != null) add_skeleton_joint (Joints.SHOULDER_CENTER, skShoulderCenter); if (skLeftShoulder != null) add_skeleton_joint (Joints.SHOULDER_LEFT, skLeftShoulder); if (skLeftElbow != null) add_skeleton_joint (Joints.ELBOW_LEFT, skLeftElbow); if (skLeftWrist != null) add_skeleton_joint (Joints.WRIST_LEFT, skLeftWrist); if (skLeftHand != null) add_skeleton_joint (Joints.HAND_LEFT, skLeftHand); if (skRightShoulder != null) add_skeleton_joint (Joints.SHOULDER_RIGHT, skRightShoulder); if (skRightElbow != null) add_skeleton_joint (Joints.ELBOW_RIGHT, skRightElbow); if (skRightWrist != null) add_skeleton_joint (Joints.WRIST_RIGHT, skRightWrist); if (skRightHand != null) add_skeleton_joint (Joints.HAND_RIGHT, skRightHand); // get the bone lengths and positions of the default pose for the rigged character. foreach (KeyValuePair<Joints, GameObject> joint in skeleton) { if (joint.Key != Joints.HIP_CENTER) { bone_lengths[(int)joint.Key] = joint.Value.transform.localPosition.magnitude; model_joint_pos[(int)joint.Key] = joint.Value.transform.localPosition; } } // start the kinect skeleton server and the kinect skeleton client for this game client = new KinectSkeletonClient(); // starts the joint data update thread thr_joint_data_update = new Thread(this.run_joint_data_update); thr_joint_data_update.Start(); // some testing gestures // this should be moved out and in to a json file ideally. // ok // Gesture left_hand_up = new Gesture("left-hand-up", (int)ActionManager.actions.handUp); // left_hand_up.constraints.Add( new JointConstraint( this, // Joints.HAND_LEFT, // Joints.SHOULDER_LEFT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.GREATER_THAN, // new Vector3(-10.0f, 1.2f, -10.0f) ) ); // Gesture left_hand_down = new Gesture("left-hand-down", (int)ActionManager.actions.handDown); // left_hand_down.constraints.Add ( new JointConstraint(this, // Joints.HAND_LEFT, // Joints.SPINE, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.LESS_THAN, // new Vector3(-10.0f, 0.0f, -10.0f) ) ); // ok // Gesture left_hand_left = new Gesture("left-hand-left", (int)ActionManager.actions.handLeft); // left_hand_left.constraints.Add ( new JointConstraint(this, // Joints.HAND_LEFT, // Joints.SHOULDER_LEFT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.LESS_THAN, // new Vector3(-2.0f, 10.0f, 10.0f) ) ); // ok // Gesture left_hand_right = new Gesture("left-hand-right", (int)ActionManager.actions.handRight); // left_hand_right.constraints.Add ( new JointConstraint(this, // Joints.HAND_LEFT, // Joints.SHOULDER_LEFT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.GREATER_THAN, // new Vector3(1.0f, -10.0f, -10.0f) ) ); // ok Gesture right_hand_up = new Gesture("right-hand-up", (int)ActionManager.actions.handUp); right_hand_up.constraints.Add( new JointConstraint(this, Joints.HAND_RIGHT, Joints.SHOULDER_RIGHT, JointConstraint.Relations.COMPONENT_DISTANCE, JointConstraint.Operators.GREATER_THAN, new Vector3(-10.0f, 1.2f, -10.0f) ) ); // ok // Gesture right_hand_left = new Gesture("right-hand-left", (int)ActionManager.actions.handLeft); // right_hand_left.constraints.Add ( new JointConstraint(this, // Joints.HAND_RIGHT, // Joints.SHOULDER_RIGHT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.LESS_THAN, // new Vector3(-1.0f, 10.0f, 10.0f) ) ); // // ok // Gesture right_hand_right = new Gesture("right-hand-right", (int)ActionManager.actions.handRight); // right_hand_right.constraints.Add ( new JointConstraint(this, // Joints.HAND_RIGHT, // Joints.SHOULDER_RIGHT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.GREATER_THAN, // new Vector3(2.0f, -10.0f, -10.0f) ) ); // Gesture super_charge_charging = new Gesture("super-charge-charging", (int)ActionManager.actions.superShoot); // super_charge_charging.constraints.Add ( new JointConstraint(this, // Joints.HAND_LEFT, // Joints.SHOULDER_LEFT, // JointConstraint.Relations.DISTANCE, // JointConstraint.Operators.LESS_THAN, // new Vector3(4.0f, 0.0f, 0.0f) ) ); // super_charge_charging.constraints.Add( new JointConstraint(this, // Joints.HAND_RIGHT, // Joints.SHOULDER_RIGHT, // JointConstraint.Relations.COMPONENT_DISTANCE, // JointConstraint.Operators.GREATER_THAN, // new Vector3(-10.0f, 1.2f, -10.0f) ) ); // gestures.Add("super-charge-charging", super_charge_charging); // gestures to handle either left knee raised or right knee raised Gesture switch_places_ll = new Gesture("switch-places-left-leg", (int)ActionManager.actions.switchPlaces); switch_places_ll.constraints.Add( new JointConstraint(this, Joints.KNEE_LEFT, Joints.HIP_CENTER, JointConstraint.Relations.COMPONENT_DISTANCE, JointConstraint.Operators.GREATER_THAN, new Vector3(-10.0f, -3.0f, -10.0f) ) ); Gesture switch_places_rl = new Gesture("switch-places-right-leg", (int)ActionManager.actions.switchPlaces); switch_places_rl.constraints.Add( new JointConstraint(this, Joints.KNEE_RIGHT, Joints.HIP_CENTER, JointConstraint.Relations.COMPONENT_DISTANCE, JointConstraint.Operators.GREATER_THAN, new Vector3(-10.0f, -3.0f, -10.0f) ) ); // AnimatedGesture stupid_wave = new AnimatedGesture("stupid-wave", 2); // stupid_wave.add_keyframe(right_hand, 1.0f, 0.0f); // stupid_wave.add_keyframe(left_hand, 1.0f, 0.0f); // animated_gestures.Add("stupid-wave", stupid_wave); // 2 gestures.Add("switch-places-ll", switch_places_ll); gestures.Add("switch-places-rl", switch_places_rl); // gestures.Add( "left-hand-up", left_hand_up ); gestures.Add("right-hand-up", right_hand_up); // 4 // gestures.Add ("left-hand-left", left_hand_left); // gestures.Add ("right-hand-left", right_hand_left); // gestures.Add ("left-hand-right", left_hand_right); // gestures.Add ("right-hand-right", right_hand_right); Mapping aim_x = new Mapping(this, Joints.HAND_LEFT, new Vector3(1, 0, 0)); aim_x.push_joint(Joints.HIP_CENTER, new Vector3(1, 0, 0), Mapping.Operators.SUBTRACT); aim_x.set_bound(4.5f); aim_x.normalize(); mappings.Add("aim_x", aim_x ); Mapping aim_y = new Mapping(this, Joints.HAND_LEFT, new Vector3(0, 1, 0)); aim_y.push_joint(Joints.SHOULDER_RIGHT, new Vector3(0, 1, 0), Mapping.Operators.SUBTRACT); aim_y.set_bound(4.5f); aim_y.normalize(); mappings.Add("aim_y", aim_y ); }
// adds a joint public void push_joint(KinectSkeleton.Joints joint, Vector3 weights, Operators operation) { joints.Add(joint); jc_weights.Add(weights); operators.Add(operation); }
public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton) { return(realCore.TransformSkeleton(skeleton)); }
public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton) { return realCore.TransformSkeleton(skeleton); }
private void RenderSkeletonOnDepth(KinectSkeleton skeleton, Color renderColor, int kinectID) { if (depthSource != null) { //Calculate the offset Point offset = new Point(0.0, 0.0); if (DepthImageCanvas.ActualWidth != DepthImage.ActualWidth) { offset.X = (DepthImageCanvas.ActualWidth - DepthImage.ActualWidth) / 2; } if (DepthImageCanvas.ActualHeight != DepthImage.ActualHeight) { offset.Y = (DepthImageCanvas.ActualHeight - DepthImage.ActualHeight) / 2; } //Render all the bones (this can't be looped because the enum isn't ordered in order of bone connections) //If there is a neck, we need to draw it different if (skeleton.skeleton[JointType.Neck].TrackingState != TrackingState.NotTracked) { DrawBoneOnDepth(skeleton.skeleton[JointType.Head], skeleton.skeleton[JointType.Neck], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.Neck], skeleton.skeleton[JointType.SpineShoulder], renderColor, 2.0, offset, kinectID); } else if (skeleton.skeleton[JointType.Head].TrackingState != TrackingState.NotTracked && skeleton.skeleton[JointType.ShoulderCenter].TrackingState != TrackingState.NotTracked) { DrawBoneOnDepth(skeleton.skeleton[JointType.Head], skeleton.skeleton[JointType.ShoulderCenter], renderColor, 2.0, offset, kinectID); } DrawBoneOnDepth(skeleton.skeleton[JointType.Head], skeleton.skeleton[JointType.ShoulderCenter], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ShoulderCenter], skeleton.skeleton[JointType.ShoulderLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ShoulderLeft], skeleton.skeleton[JointType.ElbowLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ElbowLeft], skeleton.skeleton[JointType.WristLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.WristLeft], skeleton.skeleton[JointType.HandLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ShoulderCenter], skeleton.skeleton[JointType.ShoulderRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ShoulderRight], skeleton.skeleton[JointType.ElbowRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ElbowRight], skeleton.skeleton[JointType.WristRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.WristRight], skeleton.skeleton[JointType.HandRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.ShoulderCenter], skeleton.skeleton[JointType.Spine], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.Spine], skeleton.skeleton[JointType.HipCenter], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HipCenter], skeleton.skeleton[JointType.HipLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HipLeft], skeleton.skeleton[JointType.KneeLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.KneeLeft], skeleton.skeleton[JointType.AnkleLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.AnkleLeft], skeleton.skeleton[JointType.FootLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HipCenter], skeleton.skeleton[JointType.HipRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HipRight], skeleton.skeleton[JointType.KneeRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.KneeRight], skeleton.skeleton[JointType.AnkleRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.AnkleRight], skeleton.skeleton[JointType.FootRight], renderColor, 2.0, offset, kinectID); //The thumb and hand tip only get draw if the skeleton is a Kinect v2, but that's okay, the logic in the method will figure it out DrawBoneOnDepth(skeleton.skeleton[JointType.HandLeft], skeleton.skeleton[JointType.ThumbLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HandLeft], skeleton.skeleton[JointType.HandTipLeft], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HandRight], skeleton.skeleton[JointType.ThumbRight], renderColor, 2.0, offset, kinectID); DrawBoneOnDepth(skeleton.skeleton[JointType.HandRight], skeleton.skeleton[JointType.HandTipRight], renderColor, 2.0, offset, kinectID); for (int i = 0; i < skeleton.skeleton.Count; i++) { DrawJointPointOnDepth(skeleton.skeleton[i], renderColor, 2.0, offset, kinectID); } DrawHandStateOnDepth(skeleton.skeleton[JointType.HandLeft], skeleton.leftHandClosed, 5.0, offset, kinectID); DrawHandStateOnDepth(skeleton.skeleton[JointType.HandRight], skeleton.rightHandClosed, 5.0, offset, kinectID); } drawingDepthSkeleton = false; }