Difference between revisions of "User:Dora Gustafson/Harmonic Oscillator motion"
Jump to navigation
Jump to search
(How to use llSetKeyframedMotion, an example) |
|||
(3 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
==Harmonic oscillator motion in 12 Key Frames== | ==Harmonic oscillator motion in 12 Key Frames== | ||
Will oscillate a prim along a straight line in space<br> | Will oscillate a prim along a straight line in space<br> | ||
Only the first half | Only the first half period is computed, the second is the first in reverse<br> | ||
< | If the prim is moved or scaled the script must be reset to update the motion<br> | ||
<source lang="lsl2"> | |||
// Harmonic oscillator motion by Dora Gustafson, Studio Dora 2012 | // Harmonic oscillator motion by Dora Gustafson, Studio Dora 2012 | ||
// will oscillate a prim along a straight line in space | // will oscillate a prim along a straight line in space | ||
// only the first half | // only the first half period is computed, the second is the first in reverse | ||
float phase=PI; | float phase=PI; | ||
Line 49: | Line 50: | ||
on_rez( integer n) { llResetScript(); } | on_rez( integer n) { llResetScript(); } | ||
} | } | ||
</ | </source> | ||
</div> | </div> | ||
{{LSLC|Library}} | {{LSLC|Library}} |
Latest revision as of 12:49, 22 January 2015
Harmonic oscillator motion in 12 Key Frames
Will oscillate a prim along a straight line in space
Only the first half period is computed, the second is the first in reverse
If the prim is moved or scaled the script must be reset to update the motion
// Harmonic oscillator motion by Dora Gustafson, Studio Dora 2012
// will oscillate a prim along a straight line in space
// only the first half period 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(); }
}