Sensores

De VirtUAM-wiki
Saltar a: navegación, buscar
40x40px Esta página está actualizada a la versión OpenSim 0.7.5


Mediante el uso de sensores podemos detectar todos los elementos del entorno en un cierto radio y a una cierta distancia.

llSensor

Ejecuta un sensor simple que escanea por nombre e id con el tipo (AGENT, ACTIVE, PASSIVE, y/o SCRIPTED), con un rango en metros y un arco en radianes (PI radianes buscará en todas las direcciones).

<source lang="lsl2"> llSensor( string nombre, key id, integer tipo, float rango, float arco) </source>

Nombre e id no necesitan filtro y el limite de rango es 96 metros, un valor superior será tomado como 96 y un valor de 0 no ejecutará el sensor.


Ejecuta el evento sensor cuando encuentra alguna coincidencia y el evento no_sensor cuando no detecta nada.


El siguiente ejemplo ejecuta un sensor cuando se toca el objeto que busca a usuarios (AGENT) en un rango de 30 metros y en todas las direcciones e imprime su nombre.

<source lang="lsl2"> default {

   touch_start(integer total_number)
   {
       llSensor("", NULL_KEY, AGENT, 30.0, PI);
   }

   sensor( integer detected )
   {
       while(detected--)
       {
           llOwnerSay(llDetectedName(detected));
       }
   }

} </source>

Entendiendo el concepto de arco

El arco viene determinado por los radianes a lo largo del eje x. En la siguiente imagen se pueden observar tres arcos distintos.

  1. arco = PI / 4 (45º alrededor del eje x)
  2. arco = PI_BY_TWO (90º)
  3. arco = PI (180º, lo que sería una esfera)
Sensor arc.jpg

llSensorRepeat

Esta función ejecuta un sensor de forma recurrente. Como se puede ver, añade un nuevo parámetro que indica la frecuencia con la que se ejecuta el sensor. <source lang="lsl2"> llSensorRepeat( string nombre, key id, integer tipo, float rango, float arco, float frecuencia); </source>

El siguiente ejemplo ejecuta un sensor cada 30 segundos, en todas las direcciones y a lo largo de 10 metros en el que muestra por chat el nombre del primer avatar que detecta.

<source lang="lsl2"> default {

   touch_start(integer x) {
       llSensorRepeat("", NULL_KEY, AGENT, 10.0, PI, 30.0);
   }

   sensor(integer x) {
       key id = llDetectedKey(0);
       string name = llGetDisplayName(id);
       if (("" == name) || ("???" == name)) name = llDetectedName(0);

       llSay(PUBLIC_CHANNEL, name + " was found first!");
       llSensorRemove();
   }

} </source>

A continuación se encuentra un ejemplo más complejo en el que se muestra el nombre del avatar y su distancia al objeto:

<source lang="lsl2"> integer scanning = FALSE; default {

   touch_start(integer x) {
       llSensor("", NULL_KEY, AGENT, 10.0, PI); // Start the scan
   }

   sensor(integer x) {
       string text = ""; vector myPos = llGetPos();
       // Loop through avatars from furthest to nearest
       while ((--x) >= 0) {
           key id = llDetectedKey(x);

           // Get display name, or use legacy name as a fallback
           string name = llGetDisplayName(id);
           if (("" == name) || ("???" == name)) name = llDetectedName(x);

           // Add distance to the name
           name += " (" + (string)((integer)llVecDist(myPos, llDetectedPos(x))) + "m)";
           if (text) name = "\n" + name;
           text += name;
       }
       llSetText(text, <1.0, 1.0, 1.0>, 1.0);

       if (!scanning) {
           // Repeat the scan every 30 seconds
           llSensorRepeat("", NULL_KEY, AGENT, 10.0, PI, 30.0);
           scanning = TRUE;
       }
   } no_sensor() {
       // No avatars nearby, lets turn off the scan
       llSetText("", ZERO_VECTOR, 0.0);
       llSensorRemove();
       scanning = FALSE;
   }

} </source>

llSensorRemove

Esta función elimina el sensor establecido por llSensorRepeat.