public Matrix4x4 GetBoneTransformation(int index, bool mirrored, int smoothing = 0) { if (smoothing == 0) { return(mirrored ? World[Data.Symmetry[index]].GetMirror(Data.GetAxis(Data.MirrorAxis)) : World[index]); } 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(P, Quaternion.LookRotation(Z, Y), Vector3.one)); } }
public Matrix4x4 GetBoneTransformation(int index, bool mirrored) { return(mirrored ? World[Data.Symmetry[index]].GetMirror(Data.GetAxis(Data.MirrorAxis)) : World[index]); }