User:Dora Gustafson/universal hinged motion
< User:Dora Gustafson
Jump to navigation
Jump to search
Revision as of 03:23, 26 July 2013 by Dora Gustafson (talk | contribs) (→Universal hinged motion in 8 key frames)
Universal hinged motion in 8 key frames
Using llSetKeyFramedMotion() <lsl> // Universal hinged motion by Dora Gustafson, Studio Dora 2012 // will turn a box prim around one edge parallel to the prim's Y-axis // for any prim orientation // note that the smallest accepted time per frame is 1/9=0.11111111 and NOT 0.1 // v1.03 tuned for wiki // v1.04 time tuning
float angleEnd=PI_BY_TWO; float speed=0.2; // m/S float steps=8.0; // number of Key Frames float step=0.0; list KFMlist=[]; vector V; integer open=TRUE; vector basePos; rotation baseRot;
float motion_time( float mt) {
mt = llRound(45.0*mt)/45.0; if ( mt > 0.11111111 ) return mt; else return 0.11111111;
}
default {
state_entry() { llSetMemoryLimit(0x2000); llOwnerSay((string)llGetFreeMemory()); llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]); basePos = llGetPos(); baseRot = llGetRot(); vector v1 = 0.5*llGetScale()*llGetRot(); rotation deltaRot = llEuler2Rot(< 0.0, angleEnd/steps, 0.0>); while ( step < steps ) { V = v1*llAxisAngle2Rot(llRot2Left(llGetRot()), angleEnd*step/steps); V = v1*llAxisAngle2Rot(llRot2Left(llGetRot()), angleEnd*(step+1.0)/steps) - V; KFMlist += [V, deltaRot, motion_time(llVecMag(V)/speed)]; step += 1.0; } } touch_end( integer n) { llSetKeyframedMotion( [], []); if ( open ) { llSetPrimitiveParams([PRIM_POSITION, basePos, PRIM_ROTATION, baseRot]); llSetKeyframedMotion( KFMlist, []); } else { llSetKeyframedMotion( KFMlist, [KFM_MODE, KFM_REVERSE]); } open = !open; } on_rez( integer n) { llResetScript(); }
} </lsl> After editing prim position, rotation and/or size the script should be reset in order to update the motion