public static TMOFrame[] Slerp(TMOFrame frame0, TMOFrame frame1, TMOFrame frame2, TMOFrame frame3, int length) { TMOFrame[] frames = new TMOFrame[length]; for (int frame_index = 0; frame_index < length; frame_index++) { frames[frame_index] = new TMOFrame(); frames[frame_index].matrices = new TMOMat[frame1.matrices.Length]; } for (int i = 0; i < frame1.matrices.Length; i++) { TMOMat[] interpolated_matrices = TMOMat.Slerp( frame0.matrices[i], frame1.matrices[i], frame2.matrices[i], frame3.matrices[i], length); for (int frame_index = 0; frame_index < length; frame_index++) { frames[frame_index].matrices[i] = interpolated_matrices[frame_index]; } } return(frames); }
public static void Write(BinaryWriter bw, TMOMat item) { Matrix m = item.m; bw.Write(m.M11); bw.Write(m.M12); bw.Write(m.M13); bw.Write(m.M14); bw.Write(m.M21); bw.Write(m.M22); bw.Write(m.M23); bw.Write(m.M24); bw.Write(m.M31); bw.Write(m.M32); bw.Write(m.M33); bw.Write(m.M34); bw.Write(m.M41); bw.Write(m.M42); bw.Write(m.M43); bw.Write(m.M44); }
public static TMOFrame AddSub(TMOFrame frame0, TMOFrame frame1, TMOFrame frame2, int[] index_pair) { TMOFrame ret = new TMOFrame(); ret.matrices = new TMOMat[frame0.matrices.Length]; for (int i = 0; i < frame0.matrices.Length; i++) { ret.matrices[i] = TMOMat.AddSub(frame0.matrices[i], frame1.matrices[index_pair[i]], frame2.matrices[index_pair[i]]); } return(ret); }
public static TMOMat AddSub(TMOMat mat0, TMOMat mat1, TMOMat mat2) { Matrix m0 = mat0.m; Matrix m1 = mat1.m; Matrix m2 = mat2.m; Vector3 t0 = DecomposeMatrix(ref m0); Vector3 t1 = DecomposeMatrix(ref m1); Vector3 t2 = DecomposeMatrix(ref m2); Matrix m = m1 * Matrix.Invert(m2) * m0; Vector3 t = t1 - t2 + t0; return(new TMOMat(m * Matrix.Translation(t))); }
public static TMOMat[] Slerp(TMOMat mat0, TMOMat mat1, TMOMat mat2, TMOMat mat3, int length) { TMOMat[] ret = new TMOMat[length]; Quaternion q1 = Quaternion.RotationMatrix(mat1.m); Quaternion q2 = Quaternion.RotationMatrix(mat2.m); Vector3 v0 = new Vector3(mat0.m.M41, mat0.m.M42, mat0.m.M43); Vector3 v1 = new Vector3(mat1.m.M41, mat1.m.M42, mat1.m.M43); Vector3 v2 = new Vector3(mat2.m.M41, mat2.m.M42, mat2.m.M43); Vector3 v3 = new Vector3(mat3.m.M41, mat3.m.M42, mat3.m.M43); float dt = 1.0f / length; for (int i = 0; i < length; i++) { ret[i] = new TMOMat(Matrix.RotationQuaternion(Quaternion.Slerp(q1, q2, dt * i)) * Matrix.Translation(Vector3.CatmullRom(v0, v1, v2, v3, dt * i))); } return(ret); }