OsSlerp
From OpenSimulator
(Difference between revisions)
m (Adding a sample LSL script to call osSlerp) |
|||
Line 6: | Line 6: | ||
|ossl_example= | |ossl_example= | ||
|description=Returns a rotation that is the spherical interpolation of a and b, acording to ratio that can be from 0 (result is a) to 1 (result is b) | |description=Returns a rotation that is the spherical interpolation of a and b, acording to ratio that can be from 0 (result is a) to 1 (result is b) | ||
+ | |ossl_example=<source lang="lsl"> | ||
+ | //Test osSlerp. Kayaker Mangic Sept 2019 | ||
+ | //This isn't the right way to wiggle a stick (llSetKeyframedMotion is better) | ||
+ | //but it does demostrate osSlerp working! | ||
+ | //Put this script in a prim that is long in the X direction, | ||
+ | //it will wave it's tip around in a figure 8 (infinity) pattern. | ||
+ | |||
+ | rotation lastrot=ZERO_ROTATION; //slerp between these two rotations | ||
+ | rotation nextrot=ZERO_ROTATION; | ||
+ | float t=0.0; //parameter for calculating angles to slerp between | ||
+ | float ratio=1.0; //does 10 slerp steps of 0.1 between last and next | ||
+ | default | ||
+ | { | ||
+ | state_entry() | ||
+ | { | ||
+ | llSetTimerEvent(0.1); | ||
+ | } | ||
+ | |||
+ | timer() | ||
+ | { | ||
+ | ratio += 0.1; //step in 0.1 incriments | ||
+ | if (ratio>1.0) //between 0 and 1 | ||
+ | { | ||
+ | ratio = 0.1; //start over | ||
+ | lastrot=nextrot; //save the last rotation | ||
+ | t += PI/10.0; //bump t to generate points on a Lissajous curve | ||
+ | float y=llSin(t); //this will generate points around an | ||
+ | float z=llSin(2.0*t); //infinity sympol | ||
+ | vector fwd=llVecNorm(<2.0,y,z>); //tip of this vector carves out the shape | ||
+ | vector lft=llVecNorm(<0,0,1>%fwd); //convert that into a rotation | ||
+ | nextrot = llAxes2Rot(fwd,lft,fwd%lft); //this will be the next rotation to slerp to | ||
+ | } | ||
+ | rotation rot=osSlerp(lastrot,nextrot,ratio); //slerp generates rotations between these | ||
+ | llSetRot(rot); //rotate to that. | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
|additional_info=Implemented Set, 2019 by Ubit Umarov | |additional_info=Implemented Set, 2019 by Ubit Umarov | ||
}} | }} |
Revision as of 20:43, 16 September 2019
rotation osSlerp(rotation a, rotation b, float ratio);
| |
Returns a rotation that is the spherical interpolation of a and b, acording to ratio that can be from 0 (result is a) to 1 (result is b) | |
Threat Level | None |
Permissions | Use of this function is always allowed by default |
Extra Delay | 0 seconds |
Example(s) | |
//Test osSlerp. Kayaker Mangic Sept 2019 //This isn't the right way to wiggle a stick (llSetKeyframedMotion is better) //but it does demostrate osSlerp working! //Put this script in a prim that is long in the X direction, //it will wave it's tip around in a figure 8 (infinity) pattern. rotation lastrot=ZERO_ROTATION; //slerp between these two rotations rotation nextrot=ZERO_ROTATION; float t=0.0; //parameter for calculating angles to slerp between float ratio=1.0; //does 10 slerp steps of 0.1 between last and next default { state_entry() { llSetTimerEvent(0.1); } timer() { ratio += 0.1; //step in 0.1 incriments if (ratio>1.0) //between 0 and 1 { ratio = 0.1; //start over lastrot=nextrot; //save the last rotation t += PI/10.0; //bump t to generate points on a Lissajous curve float y=llSin(t); //this will generate points around an float z=llSin(2.0*t); //infinity sympol vector fwd=llVecNorm(<2.0,y,z>); //tip of this vector carves out the shape vector lft=llVecNorm(<0,0,1>%fwd); //convert that into a rotation nextrot = llAxes2Rot(fwd,lft,fwd%lft); //this will be the next rotation to slerp to } rotation rot=osSlerp(lastrot,nextrot,ratio); //slerp generates rotations between these llSetRot(rot); //rotate to that. } } | |
Notes | |
Implemented Set, 2019 by Ubit Umarov |