• Create Account

#Actualcomfy chair

Posted 18 December 2012 - 05:01 PM

Here is the code for the method SlerpMatrix that does the interpolation between matrices:

[source lang="csharp"]private static Quaternion qStart, qEnd, qResult;private static Vector3 curTrans, nextTrans, lerpedTrans;private static Vector3 curScale, nextScale, lerpedScale;private static Matrix startRotation, endRotation;private static Matrix returnMatrix;public static void SlerpMatrix( ref Matrix start, ref Matrix end, float slerpAmount, out Matrix result) { if (start == end) { result = start; return; } // Get rotation components and interpolate (not completely accurate but I don't want // to get into polar decomposition and this seems smooth enough) Quaternion.CreateFromRotationMatrix(ref start, out qStart); Quaternion.CreateFromRotationMatrix(ref end, out qEnd); Quaternion.Lerp(ref qStart, ref qEnd, slerpAmount, out qResult); // Get final translation components curTrans.X = start.M41; curTrans.Y = start.M42; curTrans.Z = start.M43; nextTrans.X = end.M41; nextTrans.Y = end.M42; nextTrans.Z = end.M43; Vector3.Lerp(ref curTrans, ref nextTrans, slerpAmount, out lerpedTrans); // Get final scale component Matrix.CreateFromQuaternion(ref qStart, out startRotation); Matrix.CreateFromQuaternion(ref qEnd, out endRotation); curScale.X = start.M11 - startRotation.M11; curScale.Y = start.M22 - startRotation.M22; curScale.Z = start.M33 - startRotation.M33; nextScale.X = end.M11 - endRotation.M11; nextScale.Y = end.M22 - endRotation.M22; nextScale.Z = end.M33 - endRotation.M33; Vector3.Lerp(ref curScale, ref nextScale, slerpAmount, out lerpedScale); // Create the rotation matrix from the slerped quaternions Matrix.CreateFromQuaternion(ref qResult, out result); // Set the translation result.M41 = lerpedTrans.X; result.M42 = lerpedTrans.Y; result.M43 = lerpedTrans.Z; // Add the lerped scale component result.M11 += lerpedScale.X; result.M22 += lerpedScale.Y; result.M33 += lerpedScale.Z; }[/source]

#1comfy chair

Posted 18 December 2012 - 04:56 PM

Here is the code for the method SlerpMatrix that does the interpolation between matrices:

[source lang="csharp"]public static void SlerpMatrix( ref Matrix start, ref Matrix end, float slerpAmount, out Matrix result) { if (start == end) { result = start; return; } // Get rotation components and interpolate (not completely accurate but I don't want // to get into polar decomposition and this seems smooth enough) Quaternion.CreateFromRotationMatrix(ref start, out qStart); Quaternion.CreateFromRotationMatrix(ref end, out qEnd); Quaternion.Lerp(ref qStart, ref qEnd, slerpAmount, out qResult); // Get final translation components curTrans.X = start.M41; curTrans.Y = start.M42; curTrans.Z = start.M43; nextTrans.X = end.M41; nextTrans.Y = end.M42; nextTrans.Z = end.M43; Vector3.Lerp(ref curTrans, ref nextTrans, slerpAmount, out lerpedTrans); // Get final scale component Matrix.CreateFromQuaternion(ref qStart, out startRotation); Matrix.CreateFromQuaternion(ref qEnd, out endRotation); curScale.X = start.M11 - startRotation.M11; curScale.Y = start.M22 - startRotation.M22; curScale.Z = start.M33 - startRotation.M33; nextScale.X = end.M11 - endRotation.M11; nextScale.Y = end.M22 - endRotation.M22; nextScale.Z = end.M33 - endRotation.M33; Vector3.Lerp(ref curScale, ref nextScale, slerpAmount, out lerpedScale); // Create the rotation matrix from the slerped quaternions Matrix.CreateFromQuaternion(ref qResult, out result); // Set the translation result.M41 = lerpedTrans.X; result.M42 = lerpedTrans.Y; result.M43 = lerpedTrans.Z; // Add the lerped scale component result.M11 += lerpedScale.X; result.M22 += lerpedScale.Y; result.M33 += lerpedScale.Z; }[/source]

PARTNERS