Difference between revisions of "Interpolation/Spline/Vectors"
Jump to navigation
Jump to search
(Created page with "{{LSL_Function |mode=user |func=pSpline |p1_type=list|p1_name=v |p2_type=float|p2_name=t |p3_type=integer|p3_name=Loop|p3_desc=Whether the list is a curved line or loops into a c…") |
m (<lsl> tag to <source>) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
|func=pSpline | |func=pSpline | ||
|p1_type=list|p1_name=v | |p1_type=list|p1_name=v | ||
|p2_type=float|p2_name=t | |p2_type=float|p2_name=t|p2_desc=Ranges between [0, 1] | ||
|p3_type=integer|p3_name=Loop|p3_desc=Whether the list is a curved line or loops into a closed shape. | |p3_type=integer|p3_name=Loop|p3_desc=Whether the list is a curved line or loops into a closed shape. | ||
|return_type=vector | |return_type=vector | ||
Line 9: | Line 9: | ||
|func_desc= | |func_desc= | ||
B-Spline Interpolation between four vector points in a list of vectors that define a path. | B-Spline Interpolation between four vector points in a list of vectors that define a path. | ||
|spec=< | |spec=<source lang="lsl2">vector pSpline(list v, float t, integer Loop) { | ||
integer l = llGetListLength(v); t *= l-1; | integer l = llGetListLength(v); t *= l-1; | ||
integer f = llFloor(t); t -= f; | integer f = llFloor(t); t -= f; | ||
Line 26: | Line 26: | ||
return Index; | return Index; | ||
} | } | ||
// Released into public domain. By Nexii Malthus.</ | // Released into public domain. By Nexii Malthus.</source> | ||
|examples=< | |examples= | ||
<source lang="lsl2"> | |||
//Quick Dirty Example By To-mos Codewarrior (tomos.halsey) | |||
integer LINK_cube;integer LINK_1; | |||
integer LINK_2; integer LINK_3; | |||
integer LINK_4; integer LINK_5; | |||
integer LINK_6; integer LINK_7; | |||
vector pos_1;vector pos_2; | |||
vector pos_3;vector pos_4; | |||
vector pos_5;vector pos_6; | |||
vector pos_7; | |||
getlinks() | |||
{ | |||
integer total=llGetNumberOfPrims()+1; | |||
string name; | |||
while((total--)-1) | |||
{ | |||
name=llGetLinkName(total); | |||
if(name == "Cube")LINK_cube = total; | |||
if(name == "1") LINK_1 = total; | |||
if(name == "2") LINK_2 = total; | |||
if(name == "3") LINK_3 = total; | |||
if(name == "4") LINK_4 = total; | |||
if(name == "5") LINK_5 = total; | |||
if(name == "6") LINK_6 = total; | |||
if(name == "7") LINK_7 = total; | |||
} | |||
} | |||
getPositions() | |||
{ | |||
pos_1 = llList2Vector(llGetLinkPrimitiveParams(LINK_1, [PRIM_POS_LOCAL]), 0); | |||
pos_2 = llList2Vector(llGetLinkPrimitiveParams(LINK_2, [PRIM_POS_LOCAL]), 0); | |||
pos_3 = llList2Vector(llGetLinkPrimitiveParams(LINK_3, [PRIM_POS_LOCAL]), 0); | |||
pos_4 = llList2Vector(llGetLinkPrimitiveParams(LINK_4, [PRIM_POS_LOCAL]), 0); | |||
pos_5 = llList2Vector(llGetLinkPrimitiveParams(LINK_5, [PRIM_POS_LOCAL]), 0); | |||
pos_6 = llList2Vector(llGetLinkPrimitiveParams(LINK_6, [PRIM_POS_LOCAL]), 0); | |||
pos_7 = llList2Vector(llGetLinkPrimitiveParams(LINK_7, [PRIM_POS_LOCAL]), 0); | |||
} | |||
vector bSpline(list v, float t, integer Loop) { | |||
integer l = llGetListLength(v); t *= l-1; | |||
integer f = llFloor(t); t -= f; | |||
float t2 = t * t; float t3 = t2 * t; | |||
vector out=( | |||
( (-t3 + (3.*t2) - (3.*t) + 1.) * llList2Vector(v, pIndex(f-1,l,Loop)) ) | |||
+ ( ((3.*t3) - (6.*t2) + 4.) * llList2Vector(v, pIndex(f,l,Loop)) ) | |||
+ ( ((-3.*t3) + (3.*t2) + (3.*t) + 1.) * llList2Vector(v, pIndex(f+1,l,Loop)) ) | |||
+ ( t3 * llList2Vector(v, pIndex(f+2,l,Loop)) ) | |||
) / 6.0; | |||
llSetText( | |||
"time: "+(string)t+"\n"+ | |||
"vector pos: "+(string)out | |||
,<1.0,1.0,1.0>,1.0); | |||
return out; | |||
} | |||
integer pIndex( integer Index, integer Length, integer Loop) { | |||
if(Loop) return Index % Length; | |||
if(Index < 0) return 0; | |||
if(Index > --Length) return Length; | |||
return Index; | |||
} | |||
interpolate() | |||
{ | |||
getPositions(); | |||
float t; | |||
for(t = 0; t < 1; t += 0.001) | |||
{ | |||
llSetLinkPrimitiveParamsFast(LINK_cube, [PRIM_POS_LOCAL,bSpline([pos_1,pos_2,pos_3,pos_4,pos_5,pos_6,pos_7,pos_7,pos_7],t,0)]); | |||
} | |||
} | |||
default | |||
{ | |||
state_entry() | |||
{getlinks();} | |||
touch_start(integer num) | |||
{interpolate();} | |||
} | |||
</source> | |||
|cat1=Examples | |cat1=Examples | ||
}} | }} |
Latest revision as of 15:07, 24 January 2015
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: vector pSpline( list v, float t, integer Loop );
B-Spline Interpolation between four vector points in a list of vectors that define a path.
Returns a vector
• list | v | |||
• float | t | – | Ranges between [0, 1] | |
• integer | Loop | – | Whether the list is a curved line or loops into a closed shape. |
Specification
vector pSpline(list v, float t, integer Loop) {
integer l = llGetListLength(v); t *= l-1;
integer f = llFloor(t); t -= f;
float t2 = t * t; float t3 = t2 * t;
return (
( (-t3 + (3.*t2) - (3.*t) + 1.) * llList2Vector(v, pIndex(f-1,l,Loop)) )
+ ( ((3.*t3) - (6.*t2) + 4.) * llList2Vector(v, pIndex(f,l,Loop)) )
+ ( ((-3.*t3) + (3.*t2) + (3.*t) + 1.) * llList2Vector(v, pIndex(f+1,l,Loop)) )
+ ( t3 * llList2Vector(v, pIndex(f+2,l,Loop)) )
) / 6.0;
}
integer pIndex( integer Index, integer Length, integer Loop) {
if(Loop) return Index % Length;
if(Index < 0) return 0;
if(Index > --Length) return Length;
return Index;
}
// Released into public domain. By Nexii Malthus.
Examples
//Quick Dirty Example By To-mos Codewarrior (tomos.halsey)
integer LINK_cube;integer LINK_1;
integer LINK_2; integer LINK_3;
integer LINK_4; integer LINK_5;
integer LINK_6; integer LINK_7;
vector pos_1;vector pos_2;
vector pos_3;vector pos_4;
vector pos_5;vector pos_6;
vector pos_7;
getlinks()
{
integer total=llGetNumberOfPrims()+1;
string name;
while((total--)-1)
{
name=llGetLinkName(total);
if(name == "Cube")LINK_cube = total;
if(name == "1") LINK_1 = total;
if(name == "2") LINK_2 = total;
if(name == "3") LINK_3 = total;
if(name == "4") LINK_4 = total;
if(name == "5") LINK_5 = total;
if(name == "6") LINK_6 = total;
if(name == "7") LINK_7 = total;
}
}
getPositions()
{
pos_1 = llList2Vector(llGetLinkPrimitiveParams(LINK_1, [PRIM_POS_LOCAL]), 0);
pos_2 = llList2Vector(llGetLinkPrimitiveParams(LINK_2, [PRIM_POS_LOCAL]), 0);
pos_3 = llList2Vector(llGetLinkPrimitiveParams(LINK_3, [PRIM_POS_LOCAL]), 0);
pos_4 = llList2Vector(llGetLinkPrimitiveParams(LINK_4, [PRIM_POS_LOCAL]), 0);
pos_5 = llList2Vector(llGetLinkPrimitiveParams(LINK_5, [PRIM_POS_LOCAL]), 0);
pos_6 = llList2Vector(llGetLinkPrimitiveParams(LINK_6, [PRIM_POS_LOCAL]), 0);
pos_7 = llList2Vector(llGetLinkPrimitiveParams(LINK_7, [PRIM_POS_LOCAL]), 0);
}
vector bSpline(list v, float t, integer Loop) {
integer l = llGetListLength(v); t *= l-1;
integer f = llFloor(t); t -= f;
float t2 = t * t; float t3 = t2 * t;
vector out=(
( (-t3 + (3.*t2) - (3.*t) + 1.) * llList2Vector(v, pIndex(f-1,l,Loop)) )
+ ( ((3.*t3) - (6.*t2) + 4.) * llList2Vector(v, pIndex(f,l,Loop)) )
+ ( ((-3.*t3) + (3.*t2) + (3.*t) + 1.) * llList2Vector(v, pIndex(f+1,l,Loop)) )
+ ( t3 * llList2Vector(v, pIndex(f+2,l,Loop)) )
) / 6.0;
llSetText(
"time: "+(string)t+"\n"+
"vector pos: "+(string)out
,<1.0,1.0,1.0>,1.0);
return out;
}
integer pIndex( integer Index, integer Length, integer Loop) {
if(Loop) return Index % Length;
if(Index < 0) return 0;
if(Index > --Length) return Length;
return Index;
}
interpolate()
{
getPositions();
float t;
for(t = 0; t < 1; t += 0.001)
{
llSetLinkPrimitiveParamsFast(LINK_cube, [PRIM_POS_LOCAL,bSpline([pos_1,pos_2,pos_3,pos_4,pos_5,pos_6,pos_7,pos_7,pos_7],t,0)]);
}
}
default
{
state_entry()
{getlinks();}
touch_start(integer num)
{interpolate();}
}