interpolation/Catmull-Rom/Float

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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