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