User:Rolig Loon/Elliptical Orbit
Jump to navigation
Jump to search
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Features
Moves an object along a smooth, continuous elliptical path.
Script
<lsl> float a; //Semi-minor axis float b; // Semi-major axis vector orig; //Center of ellipse integer count; vector NewPos; integer targetID;
vector calcPos (integer num){
float t = num * 2 * PI/120; vector where = orig + <a * llCos(t), b* llSin(t),0>; return where;
}
default {
on_rez(integer start) { llResetScript(); } state_entry() { a = 2.0; // Set the semi-minor axis length here b = 3.0; // Set the semi-major axis length here orig = llGetPos(); llListen(9998,"","",""); } listen(integer channel, string name , key id, string msg) { if (llToLower(msg) == "stop") { llStopMoveToTarget(); llTargetRemove(targetID); llSetStatus(STATUS_PHYSICS | STATUS_PHANTOM, FALSE); llOwnerSay("I am at " + (string)llGetPos() + " in " + llGetRegionName()); } else if (llToLower(msg) == "go") { if (count == 0) { NewPos = calcPos(count); llSetPos(NewPos); // Object's first move is from the center of the ellipse to a point on the path } llSetStatus(STATUS_PHYSICS | STATUS_PHANTOM, TRUE); llSetBuoyancy (1.0); ++count; NewPos = calcPos(count); targetID = llTarget(NewPos,0.5); llMoveToTarget(NewPos,0.5); } else { llOwnerSay("What?"); } } at_target(integer tnum, vector targetpos, vector ourpos) { llStopMoveToTarget(); llTargetRemove(targetID); ++count; NewPos = calcPos(count); targetID = llTarget(NewPos, 0.5); llMoveToTarget(NewPos,0.5); } }
</lsl>