예제 #1
0
        // Update the skeleton pose using the data from Kinect.
        private void UpdateKinectSkeletonPose(Body body, SkeletonPose skeletonPose)
        {
            if (body == null || !body.IsTracked)
            {
                return;
            }

            for (int i = 0; i < skeletonPose.Skeleton.NumberOfBones; i++)
            {
                var joint = Bones[i].JointType;
                if (body.Joints[joint].TrackingState != TrackingState.NotTracked)
                {
                    // The joint position in "Kinect space".
                    var kinectPosition = body.Joints[joint].Position;

                    // Convert Kinect joint position to a Vector3.
                    // z is negated because in XNA the camera forward vectors is -z, but the Kinect
                    // forward vector is +z.
                    Vector3 position = new Vector3(kinectPosition.X, kinectPosition.Y, -kinectPosition.Z);

                    // Apply scale and offset.
                    position = position * Scale + Offset;

                    var orientation = Quaternion.Identity; // TODO: Use orientations of body.JointOrientations.

                    skeletonPose.SetBonePoseAbsolute(i, new SrtTransform(orientation, position));
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Updates the bone transforms of the skeleton pose, so that the bones match the ragdoll
        /// bodies.
        /// </summary>
        /// <param name="skeletonPose">The skeleton pose that is modified.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="skeletonPose" /> is <see langword="null"/>.
        /// </exception>
        public void UpdateSkeletonFromBodies(SkeletonPose skeletonPose)
        {
            if (skeletonPose == null)
            {
                throw new ArgumentNullException("skeletonPose");
            }

            var skeleton = skeletonPose.Skeleton;

            for (int i = 0; i < Bodies.Count && i < skeleton.NumberOfBones; i++)
            {
                var body = Bodies[i];
                if (body == null)
                {
                    continue;
                }

                Pose offset           = (i < BodyOffsets.Count) ? BodyOffsets[i] : Pose.Identity;
                Pose bonePoseAbsolute = Pose.Inverse * body.Pose * offset.Inverse;
                skeletonPose.SetBonePoseAbsolute(i, bonePoseAbsolute);
            }
        }
예제 #3
0
        private void UpdateKinectSkeletonPose(KinectSkeleton skeletonData, SkeletonPose skeletonPose)
        {
            if (skeletonData == null)
            {
                return;
            }

            // Update the skeleton pose using the data from Kinect.
            for (int i = 0; i < skeletonPose.Skeleton.NumberOfBones; i++)
            {
                var joint = (JointType)i;
                if (skeletonData.Joints[joint].TrackingState != JointTrackingState.NotTracked)
                {
                    // The joint position in "Kinect space".
                    SkeletonPoint kinectPosition = skeletonData.Joints[joint].Position;

                    // Convert Kinect joint position to a Vector3F.
                    // z is negated because in XNA the camera forward vectors is -z, but the Kinect
                    // forward vector is +z.
                    Vector3F position = new Vector3F(kinectPosition.X, kinectPosition.Y, -kinectPosition.Z);

                    // Apply scale and offset.
                    position = position * Scale + Offset;

                    var orientation = QuaternionF.Identity;

                    // Optional:
                    // The newer Kinect SDKs also compute bone orientations. We do not need these values
                    // because the current samples use only the joint positions to derive bone rotations.
                    //if (joint != JointType.HipCenter)   // Motion retargeting seems to work better if the hip center bone is not rotated.
                    //{
                    //  orientation = GetBoneOrientation(skeletonData, skeletonPose, i);
                    //}

                    skeletonPose.SetBonePoseAbsolute(i, new SrtTransform(orientation, position));
                }
            }
        }
예제 #4
0
        private void UpdateKinectSkeletonPose(KinectSkeleton skeletonData, SkeletonPose skeletonPose)
        {
            if (skeletonData == null)
            return;

              // Update the skeleton pose using the data from Kinect.
              for (int i = 0; i < skeletonPose.Skeleton.NumberOfBones; i++)
              {
            var joint = (JointType)i;
            if (skeletonData.Joints[joint].TrackingState != JointTrackingState.NotTracked)
            {
              // The joint position in "Kinect space".
              SkeletonPoint kinectPosition = skeletonData.Joints[joint].Position;

              // Convert Kinect joint position to a Vector3F.
              // z is negated because in XNA the camera forward vectors is -z, but the Kinect
              // forward vector is +z.
              Vector3F position = new Vector3F(kinectPosition.X, kinectPosition.Y, -kinectPosition.Z);

              // Apply scale and offset.
              position = position * Scale + Offset;

              skeletonPose.SetBonePoseAbsolute(i, new SrtTransform(QuaternionF.Identity, position));
            }
              }
        }
예제 #5
0
    // Update the skeleton pose using the data from Kinect. 
    private void UpdateKinectSkeletonPose(Body body, SkeletonPose skeletonPose)
    {
      if (body == null || !body.IsTracked)
        return;

      for (int i = 0; i < skeletonPose.Skeleton.NumberOfBones; i++)
      {
        var joint = Bones[i].JointType;
        if (body.Joints[joint].TrackingState != TrackingState.NotTracked)
        {
          // The joint position in "Kinect space".
          var kinectPosition = body.Joints[joint].Position;

          // Convert Kinect joint position to a Vector3F.
          // z is negated because in XNA the camera forward vectors is -z, but the Kinect
          // forward vector is +z. 
          Vector3F position = new Vector3F(kinectPosition.X, kinectPosition.Y, -kinectPosition.Z);

          // Apply scale and offset.
          position = position * Scale + Offset;

          var orientation = QuaternionF.Identity;   // TODO: Use orientations of body.JointOrientations.

          skeletonPose.SetBonePoseAbsolute(i, new SrtTransform(orientation, position));
        }
      }
    }
예제 #6
0
        /// <summary>
        /// Updates the bone transforms of the skeleton pose, so that the bones match the ragdoll 
        /// bodies.
        /// </summary>
        /// <param name="skeletonPose">The skeleton pose that is modified.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="skeletonPose" /> is <see langword="null"/>.
        /// </exception>
        public void UpdateSkeletonFromBodies(SkeletonPose skeletonPose)
        {
            if (skeletonPose == null)
            throw new ArgumentNullException("skeletonPose");

              var skeleton = skeletonPose.Skeleton;
              for (int i = 0; i < Bodies.Count && i < skeleton.NumberOfBones; i++)
              {
            var body = Bodies[i];
            if (body == null)
              continue;

            Pose offset = (i < BodyOffsets.Count) ? BodyOffsets[i] : Pose.Identity;
            Pose bonePoseAbsolute = Pose.Inverse * body.Pose * offset.Inverse;
            skeletonPose.SetBonePoseAbsolute(i, bonePoseAbsolute);
              }
        }