Objetos y Scripts

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

Objetos

Ventana de construcción

Introducción

Los objetos se crean, editan y eliminan desde el visor. En OpenSim son llamados primitivas, que son formas básicas como: cubos, cilindros, conos...

Cada objeto tiene un inventario en el que puede haber scripts, texturas, sonidos, otros objetos, etc. Los scripts sólo pueden acceder a los elementos de su propio inventario.

Los objetos complejos se crean enlazando varias primitivas, de esta manera podremos moverlas a la vez y que los scripts puedan utilizar métodos de comunicación más optimizados que el chat. Cuando se enlazan varios objetos, el último en ser seleccionado es el "objeto raíz". El inventario de este objeto es el que se muestra cuando se selecciona todo el conjunto.

Construyendo y editando objetos

Como dijimos anteriormente, la construcción dentro del mundo virtual se hace desde el visor. Al pulsar sobre el menú inferior en Construir aparecerá la ventana de construcción. A continuación analizamos detalladamente las diferentes secciones de esta opción: Como se observa en la imagen, disponemos de una serie de pestañas:

  • General: Información del objeto (nombre, dueño...) y permisos del mismo.
  • Objeto: Propiedades del objeto como tamaño, posición, rotación. Aquí también podemos bloquear el objeto o hacer que se pueda atravesar, entre otras cosas.
  • Características: Permite dar flexibilidad o luz al objeto.
  • Textura: Cambiar la imagen que se muestra en las caras del objeto, color, transparencia, brillo, resplandor...
  • Contenido: Aquí es dónde se encuentra el inventario del objeto en el que se alojan los scripts, texturas, sonidos...

Y de secciones:

  • Visión: Acercar o alejar la cámara con respecto al objeto.
  • Mover: Mover objetos horizontal o verticalmente.
  • Editar: Cambiar posición, giro, seleccionar una cara del objeto...
  • Crear: Primero hacer clic sobre la figura que queremos construir en el menú y luego clic en el lugar del mundo en el que queremos que aparezca.
  • Terreno: Modificar las propiedades del terreno (altura, suavizado, escarpado...), dividir en parcelas y cambiar el nombre de las mismas.

Atajos de teclado

Al editar objetos existen algunos atajos de teclado muy útiles que tienen casi todos los visores:

  • Control+Alt: Si se mantiene pulsado cambia el puntero, de manera que si se hace click sobre un objeto, la cámara se centra en él. Y si se mantiene pulsado el botón del ratón y se mueve el ratón la cámara girará alrededor objeto sobre el que se ha fijado la cámara. Tanto en horizontal como en vertical.
  • Alt: Tiene el mismo efecto que el anterior, pero en lugar de girar la cámara verticalmente, hace zoom sobre el objeto
  • Control: Cuando se selecciona para editar un objeto, se puede mantener pulsada esta tecla para, en lugar de mover el objeto, girarlo.
  • Control+Shift: Se usa en la misma situación que el anterior, pero sirve para editar las dimensiones de un objeto, en lugar de su posición.
  • Escape: Cuando la cámara está fijada en un objeto, si se pulsa esta tecla volverá detrás del avatar.
  • Control+L: Si tenemos seleccionados varias primitivas, las une.
  • Control+Shift+L: Si tenemos un objeto formado por varias primitivas, las separa.

Enlaces

Hay sitios web en los que se pueden descargar objetos y demás construcciones, de esta forma podemos ahorrar mucho tiempo a la hora de desarrollar el entorno:

Scripts

Introducción

Una vez conocemos el mecanismo para crear objetos, podemos hacer que ejecuten ciertas acciones e interactúen con el entorno, para ello usaremos los scripts. Estos scripts se programan en el lenguaje LSL (Linden Scripting Language), que se compila a código .NET. Dentro de los scripts podemos usar tanto funciones LSL como funciones propias de OpenSim, OSSL. En el editor de Scripts es muy recomendable tener activada la casilla de verficación "Mono", ya que esto hará que se ejecuten a mucha mayor velocidad que si no estuviera activada.

Linden Scripting Language (LSL)

LSL es un lenguaje de programación usado primeramente para los mundos virtuales de Second Life (SL). Tiene una sintaxis similar a C y permite dotar a los objetos de un cierto comportamiento.
Es un lenguaje basado en estados, eventos y funciones.
Los scripts están compuestos de uno o varios estados, con los que podemos controlar los diferentes eventos (tocar, escuchar, temporizador…). Dentro de cada evento utilizamos las funciones (enviar un mensaje, detectar el avatar que ha tocado el objeto…), las cuales pueden ser tanto las que nos ofrece el lenguaje de programación como las que nosotros mismos podemos definir.
<source lang="lsl2"> // Estado por defecto. default {

       // Evento inicial que se ejecuta al compilar el script.
       state_entry()
       {
               // Función que comunica por el chat público (canal 0) un mensaje.
               llSay(0, "Hola!");
       }
       // Evento que se lanza cuando el objeto es tocado.
       touch_start(integer total_number)
       {
               // Dice por chat el nombre del avatar que le ha tocado.
               llSay(0, "He sido tocado por " + llDetectedName(0));
       }

} </source>

40px  Para conocer a fondo este lenguaje (eventos, funciones ...) visita la wiki de LSL 


Funciones OS

Las funciones OS son algunas funciones específicas de OpenSim que pueden utilizar los scripts. No funcionan en Second Life. Es necesario configurar el servidor para poder usar este tipo de funciones.

En el fichero de configuración OpenSim.ini, nos dirigimos a la sección [XEngine] y nos fijamos en las variables:

  • AllowOSFunctions: Determina si se pueden usar las funciones OS (true) o por el contrario, si están desactivadas (false).
  • OSFunctionThreatLevel: Las funciones OS se agrupan por niveles de riesgo, por ello hay que poner el nivel máximo de riesgo de las funciones que usamos en el simulador. En nuestro caso usamos Severe puesto que para realizar teleports (una de las funciones más usada) es necesario dicho nivel.

<source lang="ini"> [XEngine]

   ;# {AllowOSFunctions} {Enabled:true} {Allow OSFunctions? (DANGEROUS!)} {true false} false
   ;; Allow the use of os* functions (some are dangerous)
    AllowOSFunctions = true
   ;# {OSFunctionThreatLevel} {Enabled:true AllowOSFunctions:true} {OSFunction threat level? (DANGEROUS!)} {None VeryLow Low Moderate High VeryHigh Severe} VeryLow
   ;; Threat level to allow, one of None, VeryLow, Low, Moderate, High,
   ;; VeryHigh, Severe
   OSFunctionThreatLevel = Severe

</source>

40px  Puedes obtener una lista y descripción completa de todas las funciones OS desde la wiki de OpenSim.


Programación de scripts

Ya conocemos las herramientas a utilizar en la programación de scripts, ahora conozcamos algunos aspectos básicos.

Comunicación entre scripts

Existen dos maneras de comunicar dos scripts en dos objetos diferentes, mediante llSay() y mediante llLinkMessage().

  • Comunicación mediante llSay(): Esta función envía un mensaje por el chat. El chat tiene muchos canales y los usuarios sólo pueden leer el canal 0, los mensajes que se envíen por el resto de canales son invisibles para ellos.
    Para que un avatar pueda enviar por un canal distinto del 0 un mensaje, hay que escribir en en el chat una barra '/' seguida del número del canal, dejar un espacio y a continuación, escribir el mensaje a enviar; por ejemplo: '/40 Hola', de esta forma enviaremos por el canal 40 el texto 'Hola'.
    Este método es útil para enviar mensajes entre objetos independientes.

Para enviar un mensaje por chat desde un script, basta con seguir la siguiente estructura. <source lang="lsl2"> llSay(40, "Esto es un mensaje por el canal 40"); </source> Para que desde un script se puedan tratar los mensajes de chat por los diversos canales de comunicación, hay que abrir la escucha con la función llListen(), esta función cuando recibe un mensaje hace que se ejecuten las instrucciones del evento listen. Uno de los inconvenientes de esta función es que, si se utiliza en masa, consume muchos recursos. <source lang="lsl2"> // Canal por el que escucharemos, lo establecemos como constante por si hay que modificarlo. integer CANAL_COMUNICACION = 40;

default {

   state_entry()
   {
       // Abrimos la escucha por dicho canal, cuando reciba algún mensaje, se lanza el evento 'listen'.
       llListen (CANAL_COMUNICACION, "", "", "");
   }
   listen(integer channel, string name, key id, string message)
   {
       // En este evento generamos las respuestas a los mensajes recibidos por el canal de escucha abierto.
       llSay(0, "El usuario " + name + " me ha dicho " + message + " por el canal " + channel);
   }

} </source>

  • Comunicación mediante llLinkMessage(): Este método es más recomendable en objetos unidos/dependientes, como la comunicación entre los diferentes botones de un panel, que son objetos diferentes.
    Llamando a la función llLinkMessage() se lanzará un evento link_message en los demás objetos del grupo enlazado. Esto consume muchos menos recursos. Veamos un ejemplo:

<source lang="lsl2"> default {

   state_entry()
   {
       // Con esta función podemos envíar tres tipos de datos: un entero, un string y un tipo key.
       llMessageLinked(LINK_ALL_OTHERS, 40, "Script ejecutándose", llGetKey());
   }
   link_message(integer sender_num, integer num, string str, key id)
   {
       // Cuando recibimos un mensaje de otro objeto linkado se lanza este evento.
       llSay(0, "El objeto con índice " + sender_num + " y con UUID " + id +
                "ha enviado el número " + num + " y el mensaje " + str);
   }

} </source>

Distancia de efecto de los scripts

Hay varias funciones, como llRezObject() (para que el objeto cree otro objeto) o llMoveToTarget() (para mover el objeto) que tienen un límite a la distancia que tienen efecto. Este límite está definido en el fichero OpenSim.ini en la variable ScriptDistanceLimitFactor y, por defecto, es 10.

Si se intenta mover un objeto a una distancia mayor de esa, se moverá sólo hasta llegar al límite. Y si se intenta crear un objeto a más de esa distancia del objeto creador, no se creará.

Comunicación con el usuario

La manera más simple de comunicarse con el usuario es mediante el chat. Los mensajes que escriba éste se envían por defecto por el canal 0, así que bastará con escuchar ese canal con llListen() para recibir todo lo que diga. También se le puede hacer llegar un mensaje con llSay() si se envía por el canal 0.

Si lo que se quiere es hacer llegar un mensaje a un usuario en concreto sin que lo reciban los demás, se puede utilizar llInstantMessage(). Sin embargo, para utilizar esta función, es necesario conocer el UUID del usuario al que se le quiere hacer llegar.

El UUID de un avatar se puede obtener a partir del nombre mediante la función osAvatarName2Key().

También se puede hacer aparecer diálogos en la ventana del usuario, mediante la función llDialog(). Estos diálogos contienen un mensaje y una serie de botones que el usuario puede pulsar.

Reproducción de sonidos

El mundo virtual también tiene la capacidad de reproducir audio. Esta operación se puede realizar de dos formas distintas:

  • En objetos (llPlaySound o llTriggerSound): Un prim puede contener un script que ejecute la orden de reproducción de un determinado sonido. La intensidad de sonido será proporcional a la distancia del objeto. El formato del sonido debe ser wav.
  • En parcela (SetParcelMusicURL): Podemos asignar una música a una determinada zona, en este caso la intensidad del sonido será la misma para toda la parcela y lo definiremos mediante una dirección web con un sonido en formato mp3 (10 veces menos pesados que los sonidos en formato wav de los objetos, lo que hace que cargue mucho más rápido). Para ello es necesario tener instalado QuickTime Player en cada cliente.

Para que el sonido se reproduzca hay que pulsar el botón Play que hay en el menú inferior derecho, al menos, la primera vez.