LlSetKeyframedMotion
De DigiWiki.
// If your client is not mesh-aware use the following line: llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);
llSetKeyframedMotion( [<0.0, 0.0, 10.0>, ZERO_VECTOR, 5, <0.0, 0.0, -10.0>, ZERO_VECTOR, 5], [KFM_DATA, KFM_TRANSLATION, KFM_MODE, KFM_PING_PONG]);
llSetKeyframedMotion( [<0.0, 0.0, 10.0>, llEuler2Rot(<90, 45, 180> * DEG_TO_RAD), 5, <0.0, 0.0, -10.0>, llEuler2Rot(<270, 225, 360> * DEG_TO_RAD), 5], [KFM_MODE, KFM_REVERSE]);
Sample Script
Under some circumstances, rotations will generate a run-time error unless they are normalized. This script illustrates a way to use llKeyframedMotion to create a follower -- think, for example, of a cart behind a vehicle -- using normalized target rotation.
rotation NormRot(rotation Q) { float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s); return <Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ>; } integer gON; default { state_entry() { llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]); } touch_start(integer total_number) { gON = !gON; //Toggle device on/off if (gON) { llSay(0,"Switch ON!"); llSensorRepeat("","91b39b5b-13b1-2517-273a-67360b842c02",SCRIPTED,10.0,PI,0.1); //Following my scripted vehicle } else { llSensorRemove(); } } sensor(integer num) { llSetKeyframedMotion([(llDetectedPos(0) - llGetPos()) + <-1.0,0.0,0.2>*llDetectedRot(0), NormRot(llDetectedRot(0)/llGetRot()),0.12],[]); } }
Universal Hinged Motion in 8 Key Frames
The script will turn a box prim around one edge parallel to the prim's Y-axis
The script will work for any prim orientation
Note that the smallest accepted time per frame is 1/9S=0.11111111S and NOT 0.1S
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); 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(); } }
After editing prim position, rotation and/or size the script should be reset in order to update the motion.
More Examples
- Pendulum motion Simple Pendulum Motion in 24 Key Frames, a good motion for a swing.
- Oscillator motion Motion in 12 Key Frames.