Difference between revisions of "Slerp"
Jump to navigation
Jump to search
Frionil Fang (talk | contribs) |
Frionil Fang (talk | contribs) (a faster implementation, though not by much (about 10% by my testing, one extra function call but less demanding functions)) |
||
Line 6: | Line 6: | ||
To continue the rotation past the ends use a value for '''t''' outside the range '''{{interval|gte=0|lte=1|center=t}}'''. | To continue the rotation past the ends use a value for '''t''' outside the range '''{{interval|gte=0|lte=1|center=t}}'''. | ||
<syntaxhighlight lang="lsl2">rotation slerp( rotation a, rotation b, float t ) { | <syntaxhighlight lang="lsl2"> | ||
rotation slerp( rotation a, rotation b, float t ) { | |||
return llAxisAngle2Rot( llRot2Axis(b /= a), t * llRot2Angle(b)) * a; | return llAxisAngle2Rot( llRot2Axis(b /= a), t * llRot2Angle(b)) * a; | ||
}//Written collectively, Taken from http://forums-archive.secondlife.com/54/3b/50692/1.html</syntaxhighlight> | }//Written collectively, Taken from http://forums-archive.secondlife.com/54/3b/50692/1.html | ||
</syntaxhighlight> | |||
Source: http://forums-archive.secondlife.com/54/3b/50692/1.html | Source: http://forums-archive.secondlife.com/54/3b/50692/1.html | ||
A slightly faster, but less concise implementation: | |||
<syntaxhighlight lang="lsl2"> | |||
// formula: slerp = (qa*sin((1-t)*theta)+qb*sin(t*theta))/sin(theta) | |||
// where qa, qb are the rotations and theta is half the angle between them | |||
rotation slerp(rotation a, rotation b, float t) { | |||
float theta = llAngleBetween(a, b)*0.5; | |||
float is = 1/llSin(theta); | |||
float st = llSin(t*theta)*is; | |||
float sti = llSin((1-t)*theta)*is; | |||
return <a.x*sti, a.y*sti, a.z*sti, a.s*sti>+<b.x*st, b.y*st, b.z*st, b.s*st>; | |||
} | |||
</syntaxhighlight> | |||
See also: [[Nlerp]] | See also: [[Nlerp]] |
Revision as of 05:41, 28 March 2024
Slerp is shorthand for spherical linear interpolation, introduced by Ken Shoemake in the context of quaternion interpolation for the purpose of animating 3D rotation. It refers to constant speed motion along a unit radius great circle arc, given the ends and an interpolation parameter between 0 and 1.
More detail: Slerp.
The following slerp algorithm uses a and b for ends and t for the interpolation parameter.
To continue the rotation past the ends use a value for t outside the range [0, 1].
rotation slerp( rotation a, rotation b, float t ) {
return llAxisAngle2Rot( llRot2Axis(b /= a), t * llRot2Angle(b)) * a;
}//Written collectively, Taken from http://forums-archive.secondlife.com/54/3b/50692/1.html
Source: http://forums-archive.secondlife.com/54/3b/50692/1.html
A slightly faster, but less concise implementation:
// formula: slerp = (qa*sin((1-t)*theta)+qb*sin(t*theta))/sin(theta)
// where qa, qb are the rotations and theta is half the angle between them
rotation slerp(rotation a, rotation b, float t) {
float theta = llAngleBetween(a, b)*0.5;
float is = 1/llSin(theta);
float st = llSin(t*theta)*is;
float sti = llSin((1-t)*theta)*is;
return <a.x*sti, a.y*sti, a.z*sti, a.s*sti>+<b.x*st, b.y*st, b.z*st, b.s*st>;
}
See also: Nlerp