예제 #1
0
 /// <inheritdoc/>
 public void SetIdentity(ref SkeletonPose identity)
 {
     Debug.Assert(identity != null, "Argument must not be null.");
     identity.ResetBoneTransforms();
 }
예제 #2
0
        private static void DoWork(QuaternionF skeletonOffset, SkeletonPose skeletonA, SkeletonPose skeletonB, int boneIndexA, int neckBoneIndexA, int leftShoulderBoneIndexA, int rightShoulderBoneIndexA, int boneIndexB, int neckBoneIndexB, int leftShoulderBoneIndexB, int rightShoulderBoneIndexB)
        {
            // Reset root bone.
              skeletonB.ResetBoneTransforms(boneIndexB, boneIndexB, false, true, false);

              // Get absolute positions all bones.
              var boneA = skeletonA.GetBonePoseAbsolute(boneIndexA).Translation;
              var neckA = skeletonA.GetBonePoseAbsolute(neckBoneIndexA).Translation;
              var leftShoulderA = skeletonA.GetBonePoseAbsolute(leftShoulderBoneIndexA).Translation;
              var rightShoulderA = skeletonA.GetBonePoseAbsolute(rightShoulderBoneIndexA).Translation;
              var boneB = skeletonB.GetBonePoseAbsolute(boneIndexB).Translation;
              var neckB = skeletonB.GetBonePoseAbsolute(neckBoneIndexB).Translation;
              var leftShoulderB = skeletonB.GetBonePoseAbsolute(leftShoulderBoneIndexB).Translation;
              var rightShoulderB = skeletonB.GetBonePoseAbsolute(rightShoulderBoneIndexB).Translation;

              // Abort if any bone to bone distance is 0.
              if (Vector3F.AreNumericallyEqual(boneA, neckA)
              || Vector3F.AreNumericallyEqual(boneA, rightShoulderA)
              || Vector3F.AreNumericallyEqual(leftShoulderA, rightShoulderA)
              || Vector3F.AreNumericallyEqual(boneB, neckB)
              || Vector3F.AreNumericallyEqual(boneB, rightShoulderB)
              || Vector3F.AreNumericallyEqual(leftShoulderB, rightShoulderB))
              {
            return;
              }

              // Get shoulder axis vectors in model B space.
              var shoulderAxisA = rightShoulderA - leftShoulderA;
              shoulderAxisA = skeletonOffset.Rotate(shoulderAxisA);
              var shoulderAxisB = rightShoulderB - leftShoulderB;

              // Create a twist rotation from the shoulder vectors.
              var shoulderRotation = QuaternionF.CreateRotation(shoulderAxisB, shoulderAxisA);

              // Apply this twist to the spine. (Modifies the neckB position.)
              neckB = boneB + shoulderRotation.Rotate(neckB - boneB);

              // Get spine vectors in model B space.
              var spineAxisA = neckA - boneA;
              spineAxisA = skeletonOffset.Rotate(spineAxisA);
              var spineAxisB = neckB - boneB;

              // Create swing rotation from spine vectors.
              var spineRotation = QuaternionF.CreateRotation(spineAxisB, spineAxisA);

              // Apply the shoulder twist rotation followed by the spine swing rotation.
              skeletonB.RotateBoneAbsolute(boneIndexB, spineRotation * shoulderRotation);
        }