Una forma para realizar comunicación entre los prims internos de OpenSimulator o Second Life y el mundo externo es a través del uso de XML-RPC el cual permite enviar mensajes a un objeto dentro de una región, siempre y cuando este se haya registrado para recibir dicha comunicación.
Crear Script para Recibir Datos :
default { state_entry() { llOpenRemoteDataChannel(); } remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) { if(type == REMOTE_DATA_CHANNEL) { llOwnerSay("Canal : " + (string) channel + ""); } else if(type == REMOTE_DATA_REQUEST) { llRemoteDataReply(channel,NULL_KEY,"Exito",1221); llOwnerSay("Cadena : " + sval + "nNumero: " + (string) ival); } else { llOwnerSay("Error"); } } }
Enviar Datos con C# :
Se utilizara la libreria XmlRpcCS para realizar la comunicación entre la aplicación y el objeto en OpenSimulator o SecondLife.
using System.Collections; using Nwc.XmlRpc; public class Client { public static void Main() { // Informacion del Servidor de Second Life // Canal por donde escucha el cliente string server = "http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi"; string channel = "eafc58de-5d8a-364e-d6d8-4c4cab0129f4"; // Parametros Hashtable args = new Hashtable(); args.Add("Channel",channel); args.Add("IntValue",12345); args.Add("StringValue","Hello World!"); // Cliente XMLRPC XmlRpcRequest request = new XmlRpcRequest(); request.MethodName = "llRemoteData"; request.Params.Add(args); // Invocacion y Resultado Hashtable ret = (Hashtable) request.Invoke(server); System.Console.WriteLine(ret["StringValue"]); System.Console.WriteLine(ret["IntValue"]); } }
Para usar el mismo codigo con OpenSimulator la cadena server debe tener la direccion de nuestro servidor : http://<ipServidor>:<puerto>/cgi-bin/xmlrpc.cgi
Enlaces :
Actualmente algunos sistemas como OpenSimulator o Second Life utilizan servicios remotos basados en XML-RPC, por tal motivo es necesario utilizar una libreria para realizar los llamados a estos servicios, actualmente para Microsoft .NET podemos encontrar dos librerias :
Utilizaremos la libreria XmlRpcCS, la cual es utilizada por el proyecto OpenSimulator para implementar el servicio de XMLRPC que permite realizar llamados remotos a objetos en este mundo virtual.
Requerimientos :
Construcción de la Libreria :
Enlaces :
Pruebas iniciales del desempeño y ejecucion de la version 0.1 de la aplicacion MMetaverseSurface que permite controlar un avatar a traves de una superficie. En esta primera prueba se utilizo la plataforma Windows, una camara Genius Slim 1322AF, Second Life y MMetaverseSurface 0.1
Evaluacion :
https://login.agni.lindenlab.com/cgi-bin/login.cgi
En terminos generales funciono como debia, solo se presento el problema inesperado de la apariencia del avatar. Las recomendaciones despues de la prueba se tendran en cuenta para la version 0.2 de la aplicacion.
Enlaces :
Siguiendo con los desarrollos para los metaversos, llega la primera version de la superficie para mundos virtuales MMetaverseSurface que permite controlar uno a mas avatars y objetos desde una superficie interactiva en la cual se colocan marcadores que representan dichos elementos.
Esta primera version es una prueba de concepto que busca identificar los elementos necesarios para crear este tipo de aplicaciones, por ejemplo para la creacion de la superficie se utilizara la aplicacion reacTIVision que permite capturar la posicion y angulo de marcadores, los cuales representaran los objetos y avatars; esta aplicacion utiliza una camara de video con soporte de firewire o una camara USB para capturar la imagen de la superficie e identificar cada uno de los marcadores, enviando la informacion de posicion y angulo de cada uno de estos. Para la comunicacion con los mundos virtuales se utiliza LibOpenMetaverse que permite interactuar con mundos virtuales como Second Life y OpenSimulator, esta libreria esta desarrollada en C# lo que hace necesario utilizar un cliente de reacTIVision para dicha plataforma, como tambien hacer el desarrollo de la aplicacion MMetaverseSurface es esta plataforma. Adicionalmente para el desarrollo se utiliza una plataforma Ubuntu Linux con la version de codigo abierto de la plataforma .NET llamada Mono y utilizando la herramienta NAnt para automatizar la construccion del software.
Actualmente la version 0.1 de la aplicacion permite controlar uno o mas avatars a los cuales se les ha asignado un marcador y que permite utilizando el simulador o el reacTIVision controlar el avatar dentro de la region en la que se encuentra, permitiendo cambiar la posicion y angulo en el que mira el avatar. Actualmente existen algunos problemas con el movimiento que hacen que el avatar no se quede estatico en una posicion, si no que opsilar entre dos posiciones.
Para las pruebas iniciales se utilizo como servidor OpenSimulator instalado en la misma maquina que la aplicacion lo que permite tener una respuesta muy rapida de los movimientos del avatar, tambien se utilizo el simulador de reacTIVision para tener el control preciso sobre la aplicacion.
Requerimientos :
Instalacion :
Ejecutar :
Enlaces :
Despues de compilar la libreria de linopenmetaverse me dedique hacer el primer programa con la libreria, donde un avatar se autentique con el servidor y permanezca en el mundo un determinado tiempo y despues salga de este, esto con el fin de conocer el uso de la libreria y los pasos requeridos para compilar el programa.
Al principio solo dejaba al avatar cinco segundos en el mundo, pero al tratar de entrar de nuevo el servidor me sacaba diciendo que el avatar ya estaba logueado, entonces probe con 60 segundos, 30 segundos, al final me quede con 15 segundos asegurando asi que el proceso de autenticacion y loqueo se cumpla totalmente, para luego proceder a cerrar la conexion.
using System; using System.Threading; using OpenMetaverse; // Libreria de Acceso OpenSimulator public class MyBot { public static void Main() { // Crear cliente GridClient client = new GridClient(); // Informacion acerca del avatar y la aplicacion LoginParams loginParams = client.Network.DefaultLoginParams( "Juan","Perez","1234","MyBot","0.1"); // Colocamos la direccion de nuestro simulador loginParams.URI = "http://192.168.1.3:9000/"; // Tratamos de entrar if(client.Network.Login(loginParams)) { // Si entramos sacamos un mensaje, // esperamos 15 segundos // y salimos del mundo Console.WriteLine("Entrando ..."); Thread.Sleep(15000); client.Network.Logout(); } else // Si no fue posible loguearse, mostrar error Console.WriteLine(client.Network.LoginMessage); } }
Para verificar que esto esta funcionando puede abrir el visor y entrar con un usuario a la zona inicial de la region, cuando ejecute el programa Juan Perez aparecera por unos momentos.