示例#1
0
 public Matrix4x4 GetBoneTransformation(int index, bool mirrored, int smoothing = 0)
 {
     if (smoothing == 0)
     {
         return(Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Data.Scaling * Vector3.one) * (mirrored ? World[Data.Symmetry[index]].GetMirror(Data.GetAxis(Data.MirrorAxis)) : World[index]) * Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(Data.Source.Bones[index].Alignment), Vector3.one));            //Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(mirrored ? Data.Source.Bones[Data.Symmetry[index]].Alignment : Data.Source.Bones[index].Alignment), Vector3.one);
     }
     else
     {
         Frame[] frames = Data.GetFrames(Mathf.Clamp(Index - smoothing, 1, Data.GetTotalFrames()), Mathf.Clamp(Index + smoothing, 1, Data.GetTotalFrames()));
         Vector3 P      = Vector3.zero;
         Vector3 Z      = Vector3.zero;
         Vector3 Y      = Vector3.zero;
         float   sum    = 0f;
         for (int i = 0; i < frames.Length; i++)
         {
             float weight = 2f * (float)(i + 1) / (float)(frames.Length + 1);
             if (weight > 1f)
             {
                 weight = 2f - weight;
             }
             Matrix4x4 matrix = mirrored ? frames[i].World[Data.Symmetry[index]].GetMirror(Data.GetAxis(Data.MirrorAxis)) : frames[i].World[index];
             P   += weight * matrix.GetPosition();
             Z   += weight * matrix.GetForward();
             Y   += weight * matrix.GetUp();
             sum += weight;
         }
         P /= sum;
         Z /= sum;
         Y /= sum;
         return(Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Data.Scaling * Vector3.one) * Matrix4x4.TRS(P, Quaternion.LookRotation(Z, Y), Vector3.one));
     }
 }
示例#2
0
 public Vector3 GetBoneVelocity(int index, bool mirrored, float smoothing = 0f)
 {
     if (smoothing == 0f)
     {
         return((GetBoneTransformation(index, mirrored).GetPosition() - GetPreviousFrame().GetBoneTransformation(index, mirrored).GetPosition()) * Data.Framerate);
     }
     else
     {
         Frame[] frames   = Data.GetFrames(Mathf.Clamp(Timestamp - smoothing, 0f, Data.GetTotalTime()), Mathf.Clamp(Timestamp + smoothing, 0f, Data.GetTotalTime()));
         Vector3 velocity = Vector3.zero;
         float   sum      = 0f;
         for (int i = 0; i < frames.Length; i++)
         {
             float weight = 2f * (float)(i + 1) / (float)(frames.Length + 1);
             if (weight > 1f)
             {
                 weight = 2f - weight;
             }
             sum      += weight;
             velocity += weight * frames[i].GetBoneVelocity(index, mirrored);
         }
         return(velocity / sum);
     }
 }