Difference between revisions of "Interpolation"

From Second Life Wiki
Jump to navigation Jump to search
(Added new section. New function 'rCosAim', does an rCos animation loop, includes speeds setting)
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header}}
{{RightToc|clear:right;}}


== Interpolation Library ==
Interpolation is a way of constructing new data points within a range of known data points.


The range of applications is varied, but here in SL it can most directly be used for animating and/or moving prims or linksets via any attribute you can creatively make use of.


=== Float Functions ===
Attributes:
* Prim/Object Position
* Prim/Object Rotation
* Texture Scale/Offsets
* or you can just simply interpolate internal values


<!--############# FLOAT LINEAR #############-->
Potential applications:
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
* Movement
!style="color: #000000; background-color: #aaaaff;" height="20px"|
* Animation
Float Linear
* User Interfaces
|-
* Graphics
|
* Games
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>


{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
There are many different types of interpolation, which may exhibit different preferred or controllable behaviour.
|
{|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 f0
| Start, 0.0
|-
| float f1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fLin
| Returns linear interpolation of two floats
|}
| [[Image:Interp_Chart1.png|center]]
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}


<!--############# FLOAT COSINE #############-->
{|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 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>


{|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 f0
| Start, 0.0
|-
| float f1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fCos
| Returns cosine interpolation of two floats
|}
| [[Image:Interp_Chart2.png|center]]
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}


<!--############# FLOAT CUBIC #############-->
== Interpolation Library ==
{|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 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>
 
{|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 f0
| Modifier, 0.33~
|-
| float f1
| Start, 0.0
|-
| float f2
| End, 1.0
|-
| float f3
| Modifier, 0.66~
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fCub
| Returns cubic interpolation of four floats
|}
| [[Image:Interp_Chart3.png|center]]
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# FLOAT HERMITE #############-->
{|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 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>
 
{|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 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
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fHem
| Returns hermite interpolation of four floats with tension and bias
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
 
=== Vector Functions ===
 
<!--############# VECTOR LINEAR #############-->
{|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"|
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>
 
{|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
|-
| vector v0
| Start, 0.0
|-
| vector v1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return vector vLin
| Returns linear interpolation of two vectors
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# VECTOR COSINE #############-->
{|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"|
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>
 
{|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
|-
| vector v0
| Start, 0.0
|-
| vector v1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return vector vCos
| Returns cosine interpolation of two vectors
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# VECTOR CUBIC #############-->
{|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"|
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>
 
{|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
|-
| 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
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return vector vCub
| Returns cubic interpolation of four vectors
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# VECTOR HERMITE #############-->
{|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"|
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>
 
{|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
|-
| 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
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return vector vHem
| Returns hermite interpolation of four vectors with tension and bias
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
=== Rotation Functions ===
 
<!--############# ROTATION LINEAR #############-->
{|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"|
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>
 
{|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
|-
| rotation r0
| Start, 0.0
|-
| rotation r1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return rotation rLin
| Returns spherical linear interpolation of two rotations
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# ROTATION COSINE #############-->
{|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"|
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>
 
{|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
|-
| rotation r0
| Start, 0.0
|-
| rotation r1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return rotation rCos
| Returns spherical cosine interpolation of two rotations
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
<!--############# ROTATION CUBIC #############-->
{|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"|
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>
 
{|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
|-
| 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
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return rotation rCub
| Returns spherical cubic interpolation of four rotations
|-
!style="background-color: #eed0d0" colspan="2"| Requirement
|-
|style="background-color: #eed0d0" colspan="2"| function rotation rLin(rotation r0,rotation r1,float t)
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
=== Speed Controlled ===
 
<!--############# ROTATION COSINE AIM #############-->
{|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"|
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>
 
{|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
|-
| rotation r0
| Start, 0.0
|-
| rotation r1
| End, 1.0
|-
| float speed
| Speed of animation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return rotation rCos
| Creates a spherical cosine animation of two rotations with a specific speed
|-
!style="background-color: #eed0d0" colspan="2"| Requirement
|-
|style="background-color: #eed0d0" colspan="2"| function rotation rCos(rotation r0,rotation r1,float t)
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
 
 
== Old non-documented Library ==
 
Changes/
1.0-1.1 - Added rotation types
1.1-1.2 - Added Hermite for float and vector
 
[[Interpolation/Examples|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){
Linear Interpolation
    float F = (1 - llCos(t*PI))/2;
* [[Interpolation/Linear/Float|Float]]
    return v0*(1-F)+v1*F;}
* [[Interpolation/Linear/Vector|Vector]]
* [[Interpolation/Linear/Rotation|Rotation]]
* List of [[Interpolation/Linear/Vectors|Vectors]]


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){
Cosine Interpolation
    float t2 = t*t;float t3 = t2*t;
* [[Interpolation/Cosine/Float|Float]]
    float a0 =  (v1-v0)*(1+bias)*(1-tens)/2;
* [[Interpolation/Cosine/Vector|Vector]]
          a0 += (v2-v1)*(1-bias)*(1-tens)/2;
* [[Interpolation/Cosine/Rotation|Rotation]]
    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;}
Cubic Interpolation
* [[Interpolation/Cubic/Float|Float]]
* [[Interpolation/Cubic/Vector|Vector]]
* [[Interpolation/Cubic/Rotation|Rotation]]


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){
Catmull-Rom Cubic Interpolation
    vector P = (v3-v2)-(v0-v1);vector Q = (v0-v1)-P;vector R = v2-v0;vector S = v1;
* [[Interpolation/Catmull-Rom/Float|Float]]
    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){
Hermite Interpolation
    // Spherical-Linear Interpolation
* [[Interpolation/Hermite/Float|Float]]
    float ang = llAngleBetween(r0, r1);
* [[Interpolation/Hermite/Vector|Vector]]
    if( ang > PI) ang -= TWO_PI;
    return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*t);}


rotation rCos(rotation r0,rotation r1,float t){
Spline Interpolation
    // Spherical-Cosine Interpolation
* List of [[Interpolation/Spline/Vectors|Vectors]]
    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){
Rescale
    // Spherical-Cubic Interpolation
* [[Interpolation/Rescale/Float|Float]]
    // r0 = Start, r1 = End, r2 and r3 affect path of curve!
* [[Interpolation/Rescale/FloatFixed|Float Fixed]]
    return rLin( rLin(r0,r1,t), rLin(r2,r3,t), 2*t*(1-t) );}


default{state_entry(){}}


</lsl>
Target
* [[Interpolation/Target/Float|Float]]

Latest revision as of 13:10, 16 September 2011

Interpolation is a way of constructing new data points within a range of known data points.

The range of applications is varied, but here in SL it can most directly be used for animating and/or moving prims or linksets via any attribute you can creatively make use of.

Attributes:

  • Prim/Object Position
  • Prim/Object Rotation
  • Texture Scale/Offsets
  • or you can just simply interpolate internal values

Potential applications:

  • Movement
  • Animation
  • User Interfaces
  • Graphics
  • Games

There are many different types of interpolation, which may exhibit different preferred or controllable behaviour.


Interpolation Library

Linear Interpolation


Cosine Interpolation


Cubic Interpolation


Catmull-Rom Cubic Interpolation


Hermite Interpolation

Spline Interpolation

Rescale


Target