Difference between revisions of "LlDetectedRot"

From Second Life Wiki
Jump to navigation Jump to search
m (updated example)
(Shorter and simpler script)
Line 16: Line 16:
//-- wiki.secondlife.com/wiki/User:Void_Singer/Optimizations
//-- wiki.secondlife.com/wiki/User:Void_Singer/Optimizations


  //-- list of compass directions starting after West, rotated counterclockwise
  //-- list of compass directions starting at West, rotated counterclockwise
list gLstCompassPoints = ["SouthWest","South","SouthEast","East","NorthEast","North","NorthWest"];
list gLstCompassPoints = [ "West", "SouthWest", "South", "SouthEast", "East", "NorthEast", "North", "NorthWest" ];


  //-- convert rotation to z-axis compass direction
  //-- convert rotation to z-axis compass direction
Line 24: Line 24:
   //-- convert rotation to dgrees
   //-- convert rotation to dgrees
   vector vVecBase = llRot2Euler( vRotBase ) * RAD_TO_DEG;
   vector vVecBase = llRot2Euler( vRotBase ) * RAD_TO_DEG;
   //-- covert to range [0, 360)
   //-- convert to range [0, 360)
   vVecBase.z += 180;
   integer vIntDirection = ((integer) (vVecBase.z + 202.5)) % 360;
  if ( vVecBase.z < 22.5 || vVecBase.z > 337.5)
   // -- convert to string
  {
  return llList2String( gLstCompassPoints, vIntDirection / 45 );
    return "West";
   }
  else
  {
    //--ofset to the end or west range
    vVecBase.z -= 22.5;
    //-- divide by range (45 deg) and round to get index of direction
    return llList2String( gLstCompassPoints, llRound( vVecBase.z - 11.25 ) / 45 );
  }
}
}


Line 55: Line 46:
               //-- next line gets avatar rotation and converts to compass direction
               //-- next line gets avatar rotation and converts to compass direction
             + vfCompassDirection( llDetectedRot( vIntCounter ) ) );
             + vfCompassDirection( llDetectedRot( vIntCounter ) ) );
     }while ( ++vIntCounter < vIntTouchCount ); //-- @@
     } while ( ++vIntCounter < vIntTouchCount ); //-- @@
   }
   }
}
}

Revision as of 04:17, 30 April 2008

Summary

Function: rotation llDetectedRot( integer number );

Returns a rotation that is the rotation of detected object number.

• integer number Index of detection information

number does not support negative indexes. Returns <0.0, 0.0, 0.0, 1.0> if number is not valid sensed object.

Specification

llDetected* functions only work if called from within Detection events (collision, collision_start, collision_end, sensor, touch, touch_start, touch_end) or in functions called by Detection events. They will fail silently and return unusable values if called during other events.

Caveats

  • If number is out of bounds the script continues to execute without an error message.
  • Events that enable the llDetected* functions always return at least one detected item.
    • Detection events are not raised if there is nothing detected.[1]
    • The detection event's items detected parameter is initially never less than 1.[2]
All Issues ~ Search JIRA for related Bugs

Examples

<lsl> //--// get compass facing of Avatar that touches this object //--//

//-- @@ = Contains code optimizations, see the following page for details //-- wiki.secondlife.com/wiki/User:Void_Singer/Optimizations

//-- list of compass directions starting at West, rotated counterclockwise

list gLstCompassPoints = [ "West", "SouthWest", "South", "SouthEast", "East", "NorthEast", "North", "NorthWest" ];

//-- convert rotation to z-axis compass direction

string vfCompassDirection( rotation vRotBase ) {

  //-- convert rotation to dgrees
 vector vVecBase = llRot2Euler( vRotBase ) * RAD_TO_DEG;
  //-- convert to range [0, 360)
 integer vIntDirection = ((integer) (vVecBase.z + 202.5)) % 360;
 // -- convert to string
 return llList2String( gLstCompassPoints, vIntDirection / 45 );

}

default{

 state_entry()
 {
   llSay( 0, "Touch me to get your compass facing" );
 }
 touch_start( integer vIntTouchCount )
 {
   integer vIntCounter = 0;
   do
   {
     llSay( 0,
            llDetectedName( vIntCounter )
            + " is facing "
             //-- next line gets avatar rotation and converts to compass direction
            + vfCompassDirection( llDetectedRot( vIntCounter ) ) );
   } while ( ++vIntCounter < vIntTouchCount ); //-- @@
 }

}

</lsl>

See Also

Articles

•  Detected

Deep Notes

Search JIRA for related Issues

Footnotes

  1. ^ The exception is no_sensor but it doesn't enable llDetected* functions.
  2. ^ Like all event parameters, the user can overwrite the initial value.

Signature

function rotation llDetectedRot( integer number );