Interpolation/Catmull-Rom/Float

From Second Life Wiki
Jump to: navigation, search

Summary

Function: float fCos( rotation H, float t );

Catmull-Rom cubic interpolation spline of four floats with fraction t.
Returns a float

• rotation H The four floats are stored in a compact rotation format.
• float t

Specification

A bit more optimised:
float fCatmullRom(rotation H, float t) {
    rotation ABCD = <
        (H.x *-0.5) + (H.y * 1.5) + (H.z *-1.5) + (H.s * 0.5),
        (H.x * 1.0) + (H.y *-2.5) + (H.z * 2.0) + (H.s *-0.5),
        (H.x *-0.5) + (H.z * 0.5), (H.y * 1.0)
    >;
    rotation T; T.s = 1.0; T.z = t; T.y = T.z*T.z; T.x = T.y*T.z;
    return T.x*ABCD.x + T.y*ABCD.y + T.z*ABCD.z + T.s*ABCD.s;
}
// Released into public domain. By Nexii Malthus.

With full matrix:

rotation mCat1 = <-0.5,  1.0, -0.5,  0.0>;
rotation mCat2 = < 1.5, -2.5,  0.0,  1.0>;
rotation mCat3 = <-1.5,  2.0,  0.5,  0.0>;
rotation mCat4 = < 0.5, -0.5,  0.0,  0.0>;
float fCatmullRom(rotation H, float t) {
    rotation ABCD = <
        (H.x * mCat1.x) + (H.y * mCat2.x) + (H.z * mCat3.x) + (H.s * mCat4.x),
        (H.x * mCat1.y) + (H.y * mCat2.y) + (H.z * mCat3.y) + (H.s * mCat4.y),
        (H.x * mCat1.z) + (H.y * mCat2.z) + (H.z * mCat3.z) + (H.s * mCat4.z),
        (H.x * mCat1.s) + (H.y * mCat2.s) + (H.z * mCat3.s) + (H.s * mCat4.s)
    >;
    rotation T; T.s = 1.0; T.z = t; T.y = T.z*T.z; T.x = T.y*T.z;
    return T.x*ABCD.x + T.y*ABCD.y + T.z*ABCD.z + T.s*ABCD.s;
}
// Released into public domain. By Nexii Malthus.

Examples