Difference between revisions of "LlDetectedRot"

From Second Life Wiki
Jump to navigation Jump to search
m (Added Example)
m
 
(16 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{LSL_Function/negative_index|false|number}}{{LSL_Function
{{LSL_Function
|inject-2={{LSL_Function/detected|number|rot|error=[[ZERO_VECTOR|<0.0, 0.0, 0.0, 1.0>]]}}
|func_id=38|func_sleep=0.0|func_energy=10.0
|func_id=38|func_sleep=0.0|func_energy=10.0
|sort=DetectedRot
|sort=DetectedRot
|func=llDetectedRot|return_type=rotation|p1_type=integer|p1_name=number
|func=llDetectedRot|return_type=rotation|p1_type=integer|p1_name=number
|func_footnote=Returns {{LSLG|ZERO_ROTATION|<0.0, 0.0, 0.0, 1.0>}} if '''number''' is not valid sensed object.
|func_footnote=Returns {{LSLG|ZERO_ROTATION|<0.0, 0.0, 0.0, 1.0>}} if {{LSLP|number}} is not valid sensed object.
|func_desc
|func_desc
|return_text=that is the rotation of detected object '''number'''.
|Return_text=of detected object {{LSLP|number}}.
|spec
|spec
|caveats
|caveats
|constants
|constants
|examples=
|examples=
<pre>
<source lang="lsl2">//--// get compass facing of Avatar that touches this object //--//
//--// get compass facing of Avatar that touches this object //--//


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


  //-- convert rotation to z-axis compass direction
  //-- convert rotation to z-axis compass direction
string vfCompassDirection( rotation vRotBase ){
string CompassDirection( rotation rRotBase )
   //-- convert rotation to dgrees
{
   vector vVecBase = llRot2Euler( vRotBase ) * RAD_TO_DEG;
  integer iCountCompassPoints = llGetListLength(gLstCompassPoints);
   //-- covert to range 0-159
   //-- convert rotation to a direction
   vVecBase.z += 180;
   vector vDirection = <0.0, 1.0, 0.0> / rRotBase;
  if ( vVecBase.z < 22.5 || vVecBase.z > 337.5){
   //-- take the direction and determine the z rotation
    return "West";
   float fAngle = llAtan2(vDirection.x, vDirection.y);
  }
  //-- take the angle and find the compass point
  else{
  integer iCompassPoint = llRound(fAngle * iCountCompassPoints / TWO_PI);
    //--ofset to the end or west range
  //-- convert to string
    vVecBase.z -= 22.5;
  return llList2String( gLstCompassPoints, iCompassPoint );
    //-- divide by range (45 deg) and round to get index of direction
    return llList2String( gLstCompassPoints, llRound( vVecBase.z - 11.25 ) / 45 );
  }
}
}


default{
default{
   state_entry(){
   state_entry()
  {
     llSay( 0, "Touch me to get your compass facing" );
     llSay( 0, "Touch me to get your compass facing" );
   }
   }


   touch_start( integer vIntTouchCount ){
   touch_start( integer vIntTouchCount )
  {
     integer vIntCounter = 0;
     integer vIntCounter = 0;
     do{
     do
    {
       llSay( 0,
       llSay( 0,
             llDetectedName( vIntCounter )
             llDetectedName( vIntCounter )
             + " is facing "
             + " is facing "
               //-- next line gets avatar rotation and converts to compass direction
               //-- next line gets avatar rotation and converts to compass direction
             + vfCompassDirection( llDetectedRot( vIntCounter ) ) );
             + CompassDirection( llDetectedRot( vIntCounter ) ) );
     }while ( ++vIntCounter < vIntTouchCount );
     } while ( ++vIntCounter < vIntTouchCount );
   }
   }
}
}</source>
</pre>[[User:Void Singer|Void Singer]] 00:58, 15 October 2007 (PDT)
|helpers
|helpers
|also_functions
|also_functions
|also_events
|also_events
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}|}}
|also_articles
|notes
|notes
|permission
|permission
Line 60: Line 59:
|cat3
|cat3
|cat4
|cat4
}}{{LSLC|Detected|rot}}
}}

Latest revision as of 00:57, 22 January 2015

Summary

Function: rotation llDetectedRot( integer number );

Returns 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 this function returns <0.0, 0.0, 0.0, 1.0> and 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

//--// get compass facing of Avatar that touches this object //--//

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

 //-- convert rotation to z-axis compass direction
string CompassDirection( rotation rRotBase )
{
  integer iCountCompassPoints = llGetListLength(gLstCompassPoints);
   //-- convert rotation to a direction
  vector vDirection = <0.0, 1.0, 0.0> / rRotBase;
   //-- take the direction and determine the z rotation
  float fAngle = llAtan2(vDirection.x, vDirection.y);
   //-- take the angle and find the compass point
  integer iCompassPoint = llRound(fAngle * iCountCompassPoints / TWO_PI);
   //-- convert to string
  return llList2String( gLstCompassPoints, iCompassPoint );
}

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
             + CompassDirection( llDetectedRot( vIntCounter ) ) );
    } while ( ++vIntCounter < vIntTouchCount );
  }
}

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 );