// 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)); } } }
/// <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); } }
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)); } } }
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)); } } }
// 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)); } } }
/// <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); } }