Gracias Gracias:  3
Resultados 1 al 5 de 5

Tema: Game Engine Python y mensajes OSC

  1. #1
    Senior Member Avatar de Azrael^^
    Fecha de ingreso
    Jul 2007
    Ubicación
    Tomelloso y Alicante
    Mensajes
    177

    Blender Game Engine. Python y mensajes OSC

    Hola de nuevo!!

    Traigo algún pseudoproblema nuevo con el game engine y python. Os cuento:

    Basandome en unos archivos que he descargado de aquí, que sirven para interconectar blender y TouchOSC, una aplicación para el móvil, estoy usandolo para mandar mensajes OSC desde Blender a Grasshopper.

    Basicamente de todo lo que ahí viene estoy usando un archivo de configuración donde especifico puertos y direcciones ip de emisor y receptor, un archivo OSC demasiado complejo como para que yo lo entienda o sepa meterle mano y que no sé cómo (ni si se puede) meter dentro del .blend, y por último, para cada objeto que necesito que mande un mensaje, tengo que crear otro script tal que así:

    Código:
    import GameLogic as gl
    from OSC import OSCClient, OSCMessage
    
    # Get controller and owner
    controller = gl.getCurrentController()
    owner = controller.owner
    
    client = OSCClient()
    msg = OSCMessage()
    
    
    
    # gl.client is a tuple in gl with ip and port
    msg.setAddress("/1/toggle1")
    msg.append(owner['Text'])
    client.sendto(msg, gl.client)
    El problema es que si tengo diez objetos que quieran mandar mensajes, o un mismo objeto que quiera mandar varios mensajes diferentes (propiedades), tengo que crear un archivo diferente con esa configuración para cada uno de los mensajes que quiera mandar

    Si quiero mandar dos propiedades de un mismo objeto y pongo algo así...
    Código:
    [...]
    msg.setAddress("/1/fader4")
    msg.append(owner['Text'])
    client.sendto(msg, gl.client)
    
    msg.setAddress("/1/toggle1")
    msg.append(owner['Text2'])
    client.sendto(msg, gl.client)
    ...no funciona. Tengo que crear dos archivos diferentes, uno para cada propiedad, aplicados ambos a ese objeto. Si son objetos diferentes, cada objeto debe tener su script adjunto.

    Por lo tanto mi pregunta es: ¿cómo podría hacerlo usando sólo un archivo? Un script que lo asigne con un always a un empty por ejemplo y que vaya listando: mandar propiedad "Text" del "objeto1" como "/1/fader1", "Text" del "objeto2" como "/1/fader2", "Text" del "objeto3" como "/1/fader3", etc.

    Supongo que habrá que importar la lista de objetos dentro del script y luego cambiar el "owner" del script por el objeto en cuestión, pero no sé muy bien cómo hacerlo, así que os pregunto!

    Ahh, y otra cosa, en vez de mandar propiedades de juego del objeto, ¿sería posible mandar otras cosas, como la posición por ejemplo?

    Gracias de antemano!!
    Última edición por Azrael^^; 11-12-2012 a las 23:12

  2. #2
    reconvertido Avatar de ikerCLoN
    Fecha de ingreso
    Apr 2002
    Ubicación
    Los Angeles, USA
    Mensajes
    14,911

    Re: Game Engine. Python y mensajes OSC

    http://www.local-guru.net/blog/2009/...-as-osc-client

    Tal vez echando mano de Google puedas encontrar alguna cosa. Lo que en visto en alguna ocasión (y yo mismo he intentando) es gente que usa PureData para 'aglutinar' y organizar las órdenes.

    Sé que no te resuelvo el problema, pero igual no conocías estas cosas ;-)
    character TD @ Walt Disney Animation Studios

    mi curso de rigging facial :: https://www.domestika.org/en/courses...je-3d/ikerclon
    blog :: www.somosposmodernos.com
    twitter :: www.twitter.com/soyposmoderno
    linkedIn :: www.linkedin.com/in/ikerj

  3. #3
    Miembro Nuevo Avatar de robertsauri
    Fecha de ingreso
    Jul 2011
    Ubicación
    Catalunya
    Mensajes
    20

    Re: Game Engine. Python y mensajes OSC

    Parte por parte. Para declarar un objeto veo que usas:
    controller = gl.getCurrentController()
    owner = controller.owner

    Prueva con usar esto:
    scene = gl.getCurrentScene()
    objeto = scene.objects["nombre_del_objeto"]
    objeto2 = scene.objects["nombre_del_objeto"]


    Bien. Ahora lo de enviar varios mensajes, tu usas:
    msg.setAddress("/1/fader4")
    msg.append(owner['Text'])
    client.sendto(msg, gl.client)

    msg.setAddress("/1/toggle1")
    msg.append(owner['Text2'])
    client.sendto(msg, gl.client)


    Prueva a usar:
    msg.setAdress("/1/fader4")
    msg.append(objeto["Text"])
    msg.append(objeto["Text2"])
    client.sendto(msg, gl.client)


    Bueno, esto segundo no estoy seguro que funcione, nuna he usado OSC XD

    Saludos!

  4. #4
    Senior Member Avatar de Azrael^^
    Fecha de ingreso
    Jul 2007
    Ubicación
    Tomelloso y Alicante
    Mensajes
    177

    Re: Game Engine. Python y mensajes OSC

    Perfecto!! Muchas gracias! Tan sencillo como eso! (esto es lo que tiene no haberme sentado aún a aprender python decentemente...)

    Revisando el archivo OSC.py, imprescindible para todo esto, he terminado de construir como sería el script. Hay dos posibilidades:

    Código:
    msg.setAddress("/1/fader4")
    msg.append(objeto['Text])
    client.sendto(msg, gl.client)
    
    msg.clearData()
    msg.setAddress("/1/toggle1")
    msg.append(objeto2['Text2'])
    client.sendto(msg, gl.client)
    Código:
    msg.setAddress("/1/fader4")
    msg.append(objeto['Text'])
    client.sendto(msg, gl.client)
    
    msg.clear(address="/1/toggle1")
    msg.append(objeto2['Text2'])
    client.sendto(msg, gl.client)
    Cualquiera de las dos funciona bien.
    Una vez conseguido esto, ¿crees que sería posible mandar otro tipo de información del objeto como por ejemplo su localización?

  5. #5
    Miembro Nuevo Avatar de robertsauri
    Fecha de ingreso
    Jul 2011
    Ubicación
    Catalunya
    Mensajes
    20

    Re: Game Engine. Python y mensajes OSC

    Lo de enviar otro tipo de datos es perfectamente posible y muy fácil. Tu en msg.append(dato) substituyes dato por lo que quieras. Cuidado al mandar variables que no sean string, puede que OSC lo soporte, o puede que no. Para ello es mejor que conviertas las variables a string (texto) con str(dato), y al recibirlas las vuelves a convertir con, por ejemplo int(dato).

    Para posicionar objetos en bge usa: objeto.localPosition = [x,y,z]. Si solo quieres variar la posición de un eje usa objeto.localPosition.y = valor. Si usas físicas no muevas los objetos con este método, pues no se llevan bien (para así decirlo) con las físicas. Para ello puedes usar applyForce() y demás. Aquí te dejo una lista completa de las funciones de bge http://www.blender.org/documentation...bge.types.html, mírate las del apartado KX_GameObject.

    Bueno con esto supongo que ya podrás enviar lo que quieras, para enviar la posición, por ejemplo, seria: msg.append(objeto.localPosition), si quieres codificarlo (puede que sea necesario, o puede que no, todo depende de OSC) seria msg.append(str(objeto.localPosition.x) + ", " + str(objeto.localPosition.y) + "," + str(objeto.localPosition.z))

    Luego para quitar las "," y ponerlo todo en una lista podrías usar myposition = datosrecividos.split(",") y luego para acceder a x: x = myposition[0]

    Bueno, creo que me he pasado un poco con la información, pero seguro que te será útil, saludos! Si necesitas que te ayude en algo mandame un MP.

    Plus: objeto.position, objeto.localPosition y objeto.globalPosition son lo mismo a efectos practicos, yo por lo menos no les he encontrado ninguna diferencia, todos son globales.

Temas similares

  1. Respuestas: 4
    Último mensaje: 05-04-2013, 14:00
  2. Game engine
    Por Metalyang en el foro Videojuegos
    Respuestas: 1
    Último mensaje: 27-05-2011, 15:14
  3. Blender El Game Engine
    Por 3dpoder en el foro Blender Art Magazine nº 6
    Respuestas: 0
    Último mensaje: 08-05-2009, 21:43
  4. Game Engine - Texto en el Game Engine - Tutorial
    Por 3dpoder en el foro Blender
    Respuestas: 1
    Último mensaje: 11-01-2009, 19:38
  5. Game engine
    Por PERIK en el foro Infografía General
    Respuestas: 11
    Último mensaje: 04-04-2007, 08:56

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •