Interpolation

From Second Life Wiki
Revision as of 12:10, 5 October 2008 by Nexii Malthus (talk | contribs)
Jump to navigation Jump to search

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 v0,float v1,float t){

   float F = (1 - llCos(t*PI))/2;
   return v0*(1-F)+v1*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
Graph goes here, k.
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


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)-(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;}

</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
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


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>