Пример #1
0
    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++;
    }
Пример #2
0
    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);
                 *  }
                 *
                 * }*/
            }
        }
    }
Пример #4
0
    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;
                }
            }
        }
    }
Пример #6
0
        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);
        }
Пример #7
0
    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
    }
Пример #8
0
        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;
        }
Пример #9
0
        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;
        }
Пример #10
0
 public void CopyFrom(KinectSkeleton templateSkel, Matrix4x4 transform)
 {
     mergeCount = 0;
     MergeSkeleton(templateSkel, transform);
     FinishMerging();
 }
Пример #11
0
 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;
 }
Пример #12
0
 // constructors
 public JointConstraint( KinectSkeleton ks )
 {
     this.ks = ks;
 }
Пример #13
0
 public Vector3 GetRelativePos(KinectSkeleton b, JointType j) =>
 b[j].transform.position - b[JointType.SpineMid].transform.position;
Пример #14
0
	public Mapping(KinectSkeleton ks, KinectSkeleton.Joints joint, Vector3 weights) {
		this.ks = ks;
		joints.Add(joint);
		jc_weights.Add(weights);
	}
Пример #15
0
    public bool IsReady()
    {
        KinectSkeleton skel = GetSkeleton();

        return(skel != null && skel.valid);
    }
Пример #16
0
    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();
    }
Пример #17
0
    // 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;
        }
    }
Пример #18
0
    // 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 );
    }
Пример #19
0
	// adds a joint
	public void push_joint(KinectSkeleton.Joints joint, Vector3 weights, Operators operation) {
		joints.Add(joint);
		jc_weights.Add(weights);
		operators.Add(operation);
	}
Пример #20
0
 public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton)
 {
     return(realCore.TransformSkeleton(skeleton));
 }
Пример #21
0
 public KinectSkeleton TransformSkeleton(KinectSkeleton skeleton)
 {
     return realCore.TransformSkeleton(skeleton);
 }
Пример #22
0
        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;
        }