Ferris Wheels in Second Life
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");
}
}



