Difference between revisions of "Interpolation"

From Second Life Wiki
Jump to navigation Jump to search
Line 10: Line 10:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Linear
====Float Linear====
|-
|-
|
|
Line 50: Line 50:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Cosine
====Float Cosine====
|-
|-
|
|
Cosine interpolation of f0 and f1 with fraction t.
Cosine interpolation of f0 and f1 with fraction t.
<lsl>
<lsl>
float fCos(float v0,float v1,float t) {
float fCos(float f0,float f1,float t) {
     float F = (1 - llCos(t*PI))/2;
     float F = (1 - llCos(t*PI))/2;
     return v0*(1-F)+v1*F;
     return f0*(1-F)+f1*F;
}
}
</lsl>
</lsl>
Line 91: Line 91:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Cubic
====Float Cubic====
|-
|-
|
|
Line 138: Line 138:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Hermite
====Float Hermite====
|-
|-
|
|
Line 199: Line 199:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Cubic Catmull-Rom
====Float Cubic Catmull-Rom====
|-
|-
|
|
Line 226: Line 226:
!style="background-color: #d0d0ee" | Description
!style="background-color: #d0d0ee" | Description
|-
|-
| rotation <float f0, float f1, float f2, float f3>
| rotation H
| <float f0, float f1, float f2, float f3>
|-
|-
| float t
| float t
Line 247: Line 248:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Rescale
====Float Rescale====
|-
|-
|
|
Line 292: Line 293:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Float Rescale Fixed
====Float Rescale Fixed====
|-
|-
|
|
Line 299: Line 300:
float fSclFix( float from0, float from1, float to0, float to1, float t ) {
float fSclFix( float from0, float from1, float to0, float to1, float t ) {
     t = to0 + ( (to1 - to0) * ( (from0 - t) / (from0-from1) ) );
     t = to0 + ( (to1 - to0) * ( (from0 - t) / (from0-from1) ) );
     if(t < to0) t = to0; else if(t > to1) t = to1; return t; }
     if(t < to0) t = to0; else if(t > to1) t = to1; return t;
}
</lsl>
</lsl>


Line 334: Line 336:
By Nexii Malthus</div>
By Nexii Malthus</div>
|}
|}
<!--############# FLOAT TARGET ###############-->
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
====Float Target====
|-
|
Steps float 'Now' closer using float 'Vel' towards 'Target' while clamping between 'Min' and 'Max'. Useful for games, simulations and vehicles. For example keeping realtime track of linear and angular acceleration and velocity of a vehicle.
<lsl>
float fTarget(float Now, float Target, float Min, float Max, float Vel) {
    if(llFabs(Target-Now) < Vel) return Target;
    if(Now < Target) Now += Vel; else Now -= Vel;
    if(Now < Min) Now = Min; else if(Now > Max) Now = Max;
    return Now;
}
</lsl>
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
|
{|cellspacing="0" cellpadding="6" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #e0e0ff; border-collapse: collapse"
!style="background-color: #d0d0ee" | Input
!style="background-color: #d0d0ee" | Description
|-
| float Now
| 'Now' current value
|-
| float Target
| move 'Now' towards 'Target'
|-
| float Min
| Clamp output at minimum
|-
| float Max
| Clamp output at maximum
|-
| float Vel
| Move 'Now' towards 'Target' at 'Vel' (Velocity)
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fTarget
| Returns clamped output of a single step of 'Now' towards 'Target' using 'Vel'
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}


=== Vector Functions ===
=== Vector Functions ===
Line 340: Line 393:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Vector Linear
====Vector Linear====
|-
|-
|
|
Line 379: Line 432:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Vector Cosine
====Vector Cosine====
|-
|-
|
|
Line 419: Line 472:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Vector Cubic
====Vector Cubic====
|-
|-
|
|
Line 465: Line 518:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Vector Hermite
====Vector Hermite====
|-
|-
|
|
Line 527: Line 580:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Rotation Linear
====Rotation Linear====
|-
|-
|
|
Line 570: Line 623:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Rotation Cosine
====Rotation Cosine====
|-
|-
|
|
Line 614: Line 667:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Rotation Cubic
====Rotation Cubic====
|-
|-
|
|
Line 668: Line 721:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Vector List, Linear
====Vector List, Linear====
|-
|-
|
|
Line 722: Line 775:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
!style="color: #000000; background-color: #aaaaff;" height="20px"|
Rotation Cosine Aim
====Rotation Cosine Aim====
|-
|-
|
|

Revision as of 12:44, 4 September 2011

Interpolation Library

Float Functions

Float Linear

Linear interpolation of f0 and f1 with fraction t. <lsl> float fLin(float f0,float f1,float t) {

   return f0*(1-t) + f1*t;

} </lsl>

Input Description
float f0 Start, 0.0
float f1 End, 1.0
float t Fraction of interpolation
Output Description
return float fLin Returns linear interpolation of two floats
Interp Chart1.png
By Nexii Malthus

Float Cosine

Cosine interpolation of f0 and f1 with fraction t. <lsl> float fCos(float f0,float f1,float t) {

   float F = (1 - llCos(t*PI))/2;
   return f0*(1-F)+f1*F;

} </lsl>

Input Description
float f0 Start, 0.0
float f1 End, 1.0
float t Fraction of interpolation
Output Description
return float fCos Returns cosine interpolation of two floats
Interp Chart2.png
By Nexii Malthus

Float Cubic

Cubic interpolation of f0, f1, f2 and f3 with fraction t. <lsl> float fCub(float f0,float f1,float f2,float f3,float t) {

   float P = (f3-f2)-(f0-f1);float Q = (f0-f1)-P;float R = f2-f0;float S = f1;
   return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;

} </lsl>

Input Description
float f0 Modifier, 0.33~
float f1 Start, 0.0
float f2 End, 1.0
float f3 Modifier, 0.66~
float t Fraction of interpolation
Output Description
return float fCub Returns cubic interpolation of four floats
Interp Chart3.png
By Nexii Malthus

Float Hermite

Hermite interpolation of f0, f1, f2 and f3 with fraction t, tension and bias. <lsl> float fHem(float f0,float f1,float f2,float f3,float t,float tens,float bias){

   float t2 = t*t;float t3 = t2*t;
   float a0 =  (f1-f0)*(1+bias)*(1-tens)/2;
         a0 += (f2-f1)*(1-bias)*(1-tens)/2;
   float a1 =  (f2-f1)*(1+bias)*(1-tens)/2;
         a1 += (f3-f2)*(1-bias)*(1-tens)/2;
   float b0 =  2*t3 - 3*t2 + 1;
   float b1 =    t3 - 2*t2 + t;
   float b2 =    t3 -   t2;
   float b3 = -2*t3 + 3*t2;
   return (  b0  *  f1+b1  *  a0+b2  *  a1+b3  *  f2  );

} </lsl>

Input Description
float f0 Modifier, 0.33~
float f1 Start, 0.0
float f2 End, 1.0
float f3 Modifier, 0.66~
float t Fraction of interpolation
float tens Tension of interpolation
float bias Bias of interpolation
Output Description
return float fHem Returns hermite interpolation of four floats with tension and bias
Graph goes here, k.
By Nexii Malthus

Float Cubic Catmull-Rom

Catmull-Rom cubic interpolation spline of four floats with fraction t. The four floats are stored in a compact rotation format. <lsl> 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;

} </lsl>

Input Description
rotation H <float f0, float f1, float f2, float f3>
float t Fraction of interpolation
Output Description
return float fCatmullRom Returns Catmull-Rom cubic interpolation
Graph goes here, k.
By Nexii Malthus


Float Rescale

Rescales a value from one range to another range. <lsl> float fScl( float from0, float from1, float to0, float to1, float t ) {

   return to0 + ( (to1 - to0) * ( (from0 - t) / (from0-from1) ) ); }

</lsl>

Input Description
float from0 'From' Range minimum
float from1 'From' Range maximum
float to0 'To' Range minimum
float to1 'To' Range maximum
float t 'From' Range value
Output Description
return float fScl Returns rescaled value between two different ranges.
Graph goes here, k.
By Nexii Malthus

Float Rescale Fixed

Rescales a value from one range to another range. The value is clamped between the range. <lsl> float fSclFix( float from0, float from1, float to0, float to1, float t ) {

   t = to0 + ( (to1 - to0) * ( (from0 - t) / (from0-from1) ) );
   if(t < to0) t = to0; else if(t > to1) t = to1; return t;

} </lsl>

Input Description
float from0 'From' Range minimum
float from1 'From' Range maximum
float to0 'To' Range minimum
float to1 'To' Range maximum
float t 'From' Range value
Output Description
return float fScl Returns rescaled and clamped value between two different ranges.
Graph goes here, k.
By Nexii Malthus

Float Target

Steps float 'Now' closer using float 'Vel' towards 'Target' while clamping between 'Min' and 'Max'. Useful for games, simulations and vehicles. For example keeping realtime track of linear and angular acceleration and velocity of a vehicle. <lsl> float fTarget(float Now, float Target, float Min, float Max, float Vel) {

   if(llFabs(Target-Now) < Vel) return Target;
   if(Now < Target) Now += Vel; else Now -= Vel;
   if(Now < Min) Now = Min; else if(Now > Max) Now = Max;
   return Now;

} </lsl>

Input Description
float Now 'Now' current value
float Target move 'Now' towards 'Target'
float Min Clamp output at minimum
float Max Clamp output at maximum
float Vel Move 'Now' towards 'Target' at 'Vel' (Velocity)
Output Description
return float fTarget Returns clamped output of a single step of 'Now' towards 'Target' using 'Vel'
Graph goes here, k.
By Nexii Malthus


Vector Functions

Vector Linear

Linear interpolation of v0 and v1 with fraction t. <lsl> vector vLin(vector v0, vector v1,float t){

   return v0*(1-t) + v1*t;}

</lsl>

Input Description
vector v0 Start, 0.0
vector v1 End, 1.0
float t Fraction of interpolation
Output Description
return vector vLin Returns linear interpolation of two vectors
Graph goes here, k.
By Nexii Malthus

Vector Cosine

Cosine interpolation of v0 and v1 with fraction t. <lsl> vector vCos(vector v0,vector v1,float t){

   float F = (1 - llCos(t*PI))/2;
   return v0*(1-F)+v1*F;}

</lsl>

Input Description
vector v0 Start, 0.0
vector v1 End, 1.0
float t Fraction of interpolation
Output Description
return vector vCos Returns cosine interpolation of two vectors
Graph goes here, k.
By Nexii Malthus

Vector Cubic

Cubic interpolation of v0, v1, v2 and v3 with fraction t. <lsl> vector vCub(vector v0,vector v1,vector v2,vector v3,float t){

   vector P = (v3-v2)-(v1-v0);vector Q = (v1-v0)-P;vector R = v2-v1;vector S = v0;
   return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;}

</lsl>

Input Description
vector v0 Start Point
vector v1 Start Tangent
vector v2 End Point
vector v3 End Tangent
float t Fraction of interpolation
Output Description
return vector vCub Returns cubic interpolation of four vectors
Graph goes here, k.
By Nexii Malthus

Vector Hermite

Hermite interpolation of v0, v1, v2 and v3 with fraction t, tension and bias. <lsl> vector vHem(vector v0,vector v1,vector v2,vector v3,float t,float tens,float bias){

   float t2 = t*t;float t3 = t2*t;
   vector a0 =  (v1-v0)*(1+bias)*(1-tens)/2;
          a0 += (v2-v1)*(1-bias)*(1-tens)/2;
   vector a1 =  (v2-v1)*(1+bias)*(1-tens)/2;
          a1 += (v3-v2)*(1-bias)*(1-tens)/2;
   float b0 =  2*t3 - 3*t2 + 1;
   float b1 =    t3 - 2*t2 + t;
   float b2 =    t3 -   t2;
   float b3 = -2*t3 + 3*t2;
   return (  b0  *  v1+b1  *  a0+b2  *  a1+b3  *  v2  );}

</lsl>

Input Description
vector v0 Modifier, 0.33~
vector v1 Start, 0.0
vector v2 End, 1.0
vector v3 Modifier, 0.66~
float t Fraction of interpolation
float tens Tension of interpolation
float bias Bias of interpolation
Output Description
return vector vHem Returns hermite interpolation of four vectors with tension and bias
Graph goes here, k.
By Nexii Malthus

Rotation Functions

Rotation Linear

Spherical Linear interpolation of r0 and r1 with fraction t. Also known as SLERP <lsl> rotation rLin(rotation r0,rotation r1,float t){

   // Spherical-Linear Interpolation
   float ang = llAngleBetween(r0, r1);
   if( ang > PI) ang -= TWO_PI;
   return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*t);}

</lsl>

Input Description
rotation r0 Start, 0.0
rotation r1 End, 1.0
float t Fraction of interpolation
Output Description
return rotation rLin Returns spherical linear interpolation of two rotations
Graph goes here, k.
By Nexii Malthus

Rotation Cosine

Spherical Cosine interpolation of r0 and r1 with fraction t. I liken to call it as SCORP <lsl> rotation rCos(rotation r0,rotation r1,float t){

   // Spherical-Cosine Interpolation
   float f = (1 - llCos(t*PI))/2;
   float ang = llAngleBetween(r0, r1);
   if( ang > PI) ang -= TWO_PI;
   return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*f);}

</lsl>

Input Description
rotation r0 Start, 0.0
rotation r1 End, 1.0
float t Fraction of interpolation
Output Description
return rotation rCos Returns spherical cosine interpolation of two rotations
Graph goes here, k.
By Nexii Malthus

Rotation Cubic

Spherical Cubic interpolation of r0 and r1 with fraction t. I liken to call it as SCURP <lsl> rotation rCub(rotation r0,rotation r1,rotation r2,rotation r3,float t){

   // Spherical-Cubic Interpolation
   // r0 = Start, r1 = End, r2 and r3 affect path of curve!
   return rLin( rLin(r0,r1,t), rLin(r2,r3,t), 2*t*(1-t) );}

</lsl>

Input Description
rotation r0 Start, 0.0
rotation r1 End, 1.0
rotation r2 Modifier, 0.33~
rotation r3 Modifier, 0.66~
float t Fraction of interpolation
Output Description
return rotation rCub Returns spherical cubic interpolation of four rotations
Requirement
function rotation rLin(rotation r0,rotation r1,float t)
Graph goes here, k.
By Nexii Malthus

Vector List

Vector List, Linear

Interpolates between two vectors in a list of vectors. <lsl> vector pLin(list v, float t, integer Loop ){

 float l = llGetListLength(v); t *= l-1;
 float f = (float)llFloor(t);
 integer i1 = 0; integer i2 = 0;
 if(Loop){ i1 = (integer)(f-llFloor(f/l)*l);
       ++f;i2 = (integer)(f-llFloor(f/l)*l);}
 else {
   if(  f > l-1 ) i1 = (integer)l-1;
   else if(  f >= 0 ) i1 = (integer)f;
   if(f+1 > l-1 ) i2 = (integer)l-1;
   else if(f+1 >= 0 ) i2 = (integer)f+1; }
 vector v1 = llList2Vector(v, i1);
 vector v2 = llList2Vector(v, i2);
 return vLin( v1, v2, t-f );}

</lsl>

Input Description
list v A path of vectors.
float t Interpolation, Start 0.0 - 1.0 End.
integer Loop Whether the list loops over.
Output Description
return vector pLin Returns a vector that is the linear interpolation of two vectors between 't'.
Graph goes here, k.
By Nexii Malthus


Speed Controlled

Rotation Cosine Aim

Spherical Cosine interpolation of r0 and r1 with speed regulation. Does the entire animation loop to rotate between r0 to r1 with a specific speed, with the cosine interpolation it makes it appear to accelerate and deccelerate realistically. <lsl> rCosAim( rotation r0, rotation r1, float speed ){

   float ang = llAngleBetween(r0, r1) * RAD_TO_DEG;
   if( ang > PI) ang -= TWO_PI;
   float x; float y = (ang/speed)/0.2;
   for( x = 0.0; x < y; x += 1.0 )
       llSetRot( rCos( r0, r1, x/y ) );

} </lsl>

Input Description
rotation r0 Start, 0.0
rotation r1 End, 1.0
float speed Speed of animation
Output Description
return rotation rCos Creates a spherical cosine animation of two rotations with a specific speed
Requirement
function rotation rCos(rotation r0,rotation r1,float t)
Graph goes here, k.
By Nexii Malthus

Old non-documented Library

Changes/ 1.0-1.1 - Added rotation types 1.1-1.2 - Added Hermite for float and vector

Example Script

<lsl> //===================================================// // Interpolation Library 1.2 // // "May 12 2008", "6:16:20 GMT-0" // // Copyright (C) 2008, Nexii Malthus (cc-by) // // http://creativecommons.org/licenses/by/3.0/ // //===================================================//

float fLin(float v0, float v1,float t){

   return v0*(1-t) + v1*t;}

float fCos(float v0,float v1,float t){

   float F = (1 - llCos(t*PI))/2;
   return v0*(1-F)+v1*F;}

float fCub(float v0,float v1,float v2,float v3,float t){

   float P = (v3-v2)-(v0-v1);float Q = (v0-v1)-P;float R = v2-v0;float S = v1;
   return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;}

float fHem(float v0,float v1,float v2,float v3,float t,float tens,float bias){

   float t2 = t*t;float t3 = t2*t;
   float a0 =  (v1-v0)*(1+bias)*(1-tens)/2;
         a0 += (v2-v1)*(1-bias)*(1-tens)/2;
   float a1 =  (v2-v1)*(1+bias)*(1-tens)/2;
         a1 += (v3-v2)*(1-bias)*(1-tens)/2;
   float b0 =  2*t3 - 3*t2 + 1;
   float b1 =    t3 - 2*t2 + t;
   float b2 =    t3 -   t2;
   float b3 = -2*t3 + 3*t2;
   return (  b0  *  v1+b1  *  a0+b2  *  a1+b3  *  v2  );}

vector vLin(vector v0, vector v1,float t){

   return v0*(1-t) + v1*t;}

vector vCos(vector v0,vector v1,float t){

   float F = (1 - llCos(t*PI))/2;
   return v0*(1-F)+v1*F;}

vector vCub(vector v0,vector v1,vector v2,vector v3,float t){

   vector P = (v3-v2)-(v0-v1);vector Q = (v0-v1)-P;vector R = v2-v0;vector S = v1;
   return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;}

vector vHem(vector v0,vector v1,vector v2,vector v3,float t,float tens,float bias){

   float t2 = t*t;float t3 = t2*t;
   vector a0 =  (v1-v0)*(1+bias)*(1-tens)/2;
          a0 += (v2-v1)*(1-bias)*(1-tens)/2;
   vector a1 =  (v2-v1)*(1+bias)*(1-tens)/2;
          a1 += (v3-v2)*(1-bias)*(1-tens)/2;
   float b0 =  2*t3 - 3*t2 + 1;
   float b1 =    t3 - 2*t2 + t;
   float b2 =    t3 -   t2;
   float b3 = -2*t3 + 3*t2;
   return (  b0  *  v1+b1  *  a0+b2  *  a1+b3  *  v2  );}

rotation rLin(rotation r0,rotation r1,float t){

   // Spherical-Linear Interpolation
   float ang = llAngleBetween(r0, r1);
   if( ang > PI) ang -= TWO_PI;
   return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*t);}

rotation rCos(rotation r0,rotation r1,float t){

   // Spherical-Cosine Interpolation
   float f = (1 - llCos(t*PI))/2;
   float ang = llAngleBetween(r0, r1);
   if( ang > PI) ang -= TWO_PI;
   return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*f);}

rotation rCub(rotation r0,rotation r1,rotation r2,rotation r3,float t){

   // Spherical-Cubic Interpolation
   // r0 = Start, r1 = End, r2 and r3 affect path of curve!
   return rLin( rLin(r0,r1,t), rLin(r2,r3,t), 2*t*(1-t) );}

default{state_entry(){}}

</lsl>