Jump to content

Wobbling vehicle on water surface


Poltergeist Azarov
 Share

You are about to reply to a thread that has been inactive for 3474 days.

Please take a moment to consider if this thread is worth bumping.

Recommended Posts

Today I been working on a wobbling effect which is based on key framed motions. So far, I made something which wobbles my vehicle as desired(at least it looks so inworld) but had to made it by 80 different motions which doesnt seem to be cool to me. Any ideas to make this simpler and better? (Thanks to Dora for main script btw :)

float angle=0.02; 
float steps=20.0;
float step=0.0;
list KFMlist=[];
vector U;
vector V;
float angleU=0.0;
float angleV;
integer swing=TRUE;
vector basePos;
rotation baseRot;


float Random(float min, float max) {
    return llFrand(max - min) + min;
}
 
default
{
    state_entry()
    {
        //llSetMemoryLimit( llGetUsedMemory()+0x1000);
        llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);
        basePos   = llGetPos();
        baseRot   = llGetRot();
        vector v1 = llGetScale();
        float periode = TWO_PI*llSqrt( v1.z/9.81);
        float dT      = periode/steps;
        dT            = llRound(45.0*dT)/45.0; 
        if ( dT < 0.11111111 ) dT = 0.11111111;
        v1.x = 0.0;
        v1.y = 0.0;
        v1   = -0.5*v1*llGetRot();
        U    = v1;
        

        integer inc=-1; float TN;
        while (++inc<4) { 
            while (step < steps) {
                step += 1.0; 
                angleV = angle*llCos( TWO_PI*step/steps + PI_BY_TWO);
                V = v1*llAxisAngle2Rot(llRot2Left(llGetRot()), angleV);
                if (inc==0) TN=(angleV-angleU)+0.002;
                if (inc==1) TN=(angleV-angleU)-0.002;
                if (inc==2) TN=(angleV-angleU)-0.001;
                if (inc==3) TN=(angleV-angleU)+0.001;
                KFMlist += [V-U, llEuler2Rot(<TN, angleV-angleU, 0.0>), 0.15]; 
                angleU = angleV;
                U = V;
            }
            step=0.0;
        }
        llSetKeyframedMotion( [], []);
        llSleep(0.2);
        llSetPrimitiveParams([PRIM_POSITION, basePos, PRIM_ROTATION, baseRot]);
        llSetKeyframedMotion( KFMlist, [ KFM_MODE, KFM_LOOP]);
    }
    touch_start( integer n)
    {
        llSetKeyframedMotion( [], []);
        llSleep(0.2);
        llSetRot(llEuler2Rot(<0,0,0>));
    }
    on_rez( integer n) { llResetScript(); }
}

 

Link to comment
Share on other sites

can maybe try something like

 

list offset = [0.002, -0.002, -0.001, 0.001];list kfm0;list kfm1;list kfm2;list kfm3;for (step = 0; step < steps; steps++){   angleV = angle * llCos(TWO_PI * (float)step / steps + PI_BY_TWO);   V =  v1 * llAxisAngle2Rot(llRot2Left(llGetRot()), angleV);   float TN = angleV - angleU;
float vu = V - U; kfm0 += [vu, llEuler2Rot(<TN + llList2Float(offset, 0), TN, 0.0>), 0.15]; kfm1 += [vu, llEuler2Rot(<TN + llList2Float(offset, 1), TN, 0.0>), 0.15]; kfm2 += [vu, llEuler2Rot(<TN + llList2Float(offset, 2), TN, 0.0>), 0.15]; kfm3 += [vu, llEuler2Rot(<TN + llList2Float(offset, 3), TN, 0.0>), 0.15]; angleU = angleV; U = V;}KFMlist = kfm0 + kfm1 + kfm2 + kfm3;

 

edit: tpyo

Link to comment
Share on other sites

You are about to reply to a thread that has been inactive for 3474 days.

Please take a moment to consider if this thread is worth bumping.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...