User:Dora Gustafson/Harmonic Oscillator motion

From Second Life Wiki
< User:Dora Gustafson
Revision as of 15:32, 11 March 2012 by Dora Gustafson (talk | contribs) (How to use llSetKeyframedMotion, an example)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Harmonic oscillator motion in 12 Key Frames

Will oscillate a prim along a straight line in space
Only the first half periode is computed, the second is the first in reverse
<lsl> // Harmonic oscillator motion by Dora Gustafson, Studio Dora 2012 // will oscillate a prim along a straight line in space // only the first half periode is computed, the second is the first in reverse

float phase=PI; vector amplitude=< 0.0, 0.0, 2.0>; // amplitude and direction for oscillation float Hperiode=2.0; // half periode time S float steps=12; // number of Key Frames for a half periode float step=0.0; list KFMlist=[]; vector U; vector V; integer osc=TRUE; vector basePos;

default {

   state_entry()
   {
       llSetMemoryLimit( llGetUsedMemory()+0x1000);
       llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);
       basePos = llGetPos();
       float dT = Hperiode/steps;
       dT = llRound(45.0*dT)/45.0;
       if ( dT < 0.11111111 ) dT = 0.11111111;
       U = amplitude*llCos( phase);
       while ( step < steps )
       {
           step += 1.0;
           V = amplitude*llCos( PI*step/steps + phase);
           KFMlist += [V-U, dT];
           U = V;
       }
   }
   touch_start( integer n)
   {
       llSetKeyframedMotion( [], []);
       llSleep(0.2);
       llSetRegionPos( basePos);
       llSetPos( basePos);
       if ( osc ) llSetKeyframedMotion( KFMlist, [KFM_DATA, KFM_TRANSLATION, KFM_MODE, KFM_PING_PONG]);
       osc = !osc;
   }
   on_rez( integer n) { llResetScript(); }

} </lsl>