123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- // This is a script designed to orbit its owner.
- vector startPos;
- vector curPos;
- vector offset; // offset from Agent
- integer iteration;
- float rotationRate; // degrees of rotation per iteration
- float sensorInterval; // seconds between sensor scan.
- default
- {
- state_entry()
- {
- llOwnerSay( "Hello, Avatar! Touch to start orbiting." );
- llSetStatus( 1, FALSE ); // turn Physics off.
- offset = < 2, 2, 1 >;
- iteration = 0;
- rotationRate = .5;
- sensorInterval = .3;
- }
- touch_start(integer total_number)
- {
- startPos = llGetPos();
- curPos = startPos;
-
- llSleep( .1 );
- key id = llGetOwner();
- llSensorRepeat( "", id, AGENT, 96, PI, sensorInterval );
- }
- sensor(integer total_number)
- {
- iteration++;
- if( iteration > 300 )
- {
- llResetScript();
- }
- if( llDetectedOwner( 0 ) == llGetOwner() )
- { // the detected Agent is my owner.
- vector position = llDetectedPos(0); // find Owner position.
- // calculate next object position relative both to the Owner's
- // position and the current time interval counter. That is,
- // use the iteration counter to define a rotation, multiply
- // the rotation by the constant offset to get a rotated offset
- // vector, and add that rotated offset to the current position
- // to defne the new position.
-
- float degreeRotation = llRound( rotationRate * iteration ) % 360;
- rotation Rotation =
- llEuler2Rot( < 0, 0, degreeRotation * DEG_TO_RAD > );
- vector rotatedOffset = offset * Rotation;
- position += rotatedOffset;
-
- // change the location of the object and save the current (rotated)
- // offset for use during the next iteration.
- llSetPos( position );
- offset = rotatedOffset;
- }
- }
- }
|