Ferris Wheels in Second Life

jeffheaton's picture

I am not as active in Second Life as I used to be. However, the one project I created that I am always asked about is my Ferris Wheel. You can see the ferris wheel here.

Well, here are all the scripts you need. There are three main scripts, the base, wheel and cars. A little trig, and your cars will move properly.

Ferris Wheel Base

integer ca=0;
integer start = FALSE;
integer CHANNEL = 40;
integer spins = 5;
rotation lastRotation;

toggle()
{
    if( start )
    {
        start = FALSE;
        llSay(0,"Ferris Wheel Stopping");
    }
    else
    {
        start = TRUE;
        llSay(0,"Ferris Wheel Starting");
        spins = 5;
    }
}

resetPosition()
{
    vector baseRot = llRot2Euler(llGetRot());
    float zRot = baseRot.z*RAD_TO_DEG;
    rotation wheelRot;
    vector pos;
            
    if( zRot<0 )
        zRot+=360;
            
    if( zRot>=315 || zRot<=45 )
    {
        zRot = 0;
        wheelRot = llEuler2Rot(<0,270,0>*DEG_TO_RAD);
        pos = llGetPos()+<3,1,11>;
    }
    else if( zRot>=45 && zRot<=135 )
    {
        zRot = 90;
        wheelRot = llEuler2Rot(<90,0,0>*DEG_TO_RAD);
        pos = llGetPos()+<-1,3,11>;
    }
    else if( zRot>=135 && zRot<=225 )
    {
        zRot = 180;
        wheelRot = llEuler2Rot(<0,90,0>*DEG_TO_RAD);
        pos = llGetPos()+<-3,-1,11>;
    }
    else if( zRot>=225 && zRot<=315 )
    {
        zRot = 270;
        wheelRot = llEuler2Rot(<270,0,0>*DEG_TO_RAD);
        pos = llGetPos()+<1,-3,11>;
    }
           
    rotation baseRot2 = llEuler2Rot( <0,0,zRot> * DEG_TO_RAD);
    llSetRot( baseRot2 );

             
    llRezObject("Ferris Wheel Car",pos, ZERO_VECTOR, baseRot2,0);
    llRezObject("Ferris Wheel Car",pos, ZERO_VECTOR, baseRot2,90);
    llRezObject("Ferris Wheel Car",pos, ZERO_VECTOR, baseRot2,180);
    llRezObject("Ferris Wheel Car",pos, ZERO_VECTOR, baseRot2,270);
    llRezObject("Wheel", pos, ZERO_VECTOR, wheelRot, 0);
}
    
    
default
{
    state_entry()
    {
        llSetTimerEvent(0.5);
        llSetText("Touch to Start",<255,255,255>,1.0);
        llListen(CHANNEL,"",NULL_KEY,"");
    }
    
    listen(integer channel,string name,key id,string message )
    {
        if( message=="go" )
        {
            if( !start )
                toggle();
        }
    }
    
    on_rez(integer i)
    {
        resetPosition();
        lastRotation = llGetRot();
    }
    
    touch_start(integer total_number)
    {
        if( !start )
            toggle();
        
    }
    
    moving_start( )
    { 
        if( start ) 
            toggle();
        llSay(CHANNEL,"die"); 
    }
     
    moving_end( )
    { 
        resetPosition();    
    }
    

    timer()
    {

        
        if( start )
        {
            ca+=5;
        
            list l = [ "spin", ca ];
            string s = llList2CSV(l);
        
            llShout(40,s);
            if(ca>360)
            {
                spins--;
                if( spins<1 )
                {
                    toggle();
                }
                else
                {
                    llSay(0,(string)spins+" spins left.");
                }
                ca=0;
            }
        }    
    }
}

"Ferris Wheel" Wheel

integer CHANNEL = 40;

default
{  

    state_entry()
    {
        llListen(CHANNEL, "", NULL_KEY, "");
    }
    
    touch_start(integer total_number)
    {
        llSay(CHANNEL,"go");
        
    }
    
    listen(integer channel, string name, key id, string message) 
    {
        list l = llCSV2List(message);
        string cmd = llList2String(l,0);
        
        if( cmd=="die")
        {
            llDie();
        }
        else
        {
            rotation r1 = llGetRot();
            vector r2 = llRot2Euler(r1);
            float ca = llList2Float(l,1);
            vector vec = <r2.x*RAD_TO_DEG,r2.y*RAD_TO_DEG,-ca> *  DEG_TO_RAD;
            rotation delta = llEuler2Rot(vec);
            llSetRot(delta);
        }
    }  
}

Ferris Wheel Car

integer CHANNEL = 40;
vector centerPos; 
integer carAngle = 0;
integer reverseAngle = FALSE;
integer reverseAxis = FALSE;

moveCar(float ca)
{
    if( reverseAngle )
        ca=-ca;
        
    ca+=carAngle;
        
    vector pos = centerPos;
        
    float a = ca*(PI/180);
    if( reverseAxis )
    {
        pos.x = (llSin(a)*10)+centerPos.x;
        pos.z = (llCos(a)*10)+centerPos.z;
    }
    else
    {
        pos.y = (llCos(a)*10)+centerPos.y;
        pos.z = (llSin(a)*10)+centerPos.z;
    }
    llSetPos(pos);
}

default
{
    
    on_rez(integer i)
    {
        carAngle = i;
        centerPos=llGetPos();
        
        // determine direction
        rotation rot = llGetRot();
        vector v = llRot2Euler(rot);
        float zRot = v.z * RAD_TO_DEG;
        
        if( zRot<0 )
                zRot+=360;
            
            if( zRot>=315 || zRot<=45 )
            {
                reverseAngle = FALSE;
                reverseAxis = FALSE;
            }
            else if( zRot>=45 && zRot<=135 )
            {
                reverseAngle = FALSE;
                reverseAxis = TRUE;
            }
            else if( zRot>=135 && zRot<=225 )
            {
                reverseAngle = TRUE;
                reverseAxis = FALSE;
            }
            else if( zRot>=225 && zRot<=315 )
            {
                reverseAngle = TRUE;
                reverseAxis = TRUE;
            }
            
            moveCar(0);
    }
    
    state_entry()
    {
        llListen(CHANNEL, "", NULL_KEY, "");
        llSetText("Touch to Start",<0,0,0>,1.0);
        
    }
    
    listen(integer channel, string name, key id, string message) 
    {
        list l = llCSV2List(message);
        string cmd = llList2String(l,0);
        
        
        if( cmd=="spin" )
        {
            float ca = llList2Float(l,1);
            moveCar(ca);
            
        }
        else if( cmd=="die" )
        {
            llDie();
        }

    }
    
    touch_start(integer total_number)
    {
        llSay(CHANNEL,"go");
        
    }
    
}


Copyright 2005 - 2012 by Heaton Research, Inc.. Heaton Research™ and Encog™ are trademarks of Heaton Research. Click here for copyright, license and trademark information.