Game engine python y mensajes osc
Hola de nuevo. Traigo algún pseudoproblema nuevo con el Game Engine y Python. Os cuento: Basándome en unos archivos que he descargado de aquí, que sirven para interconectar Blender y touchosc, una aplicación para el móvil, estoy usándolo para mandar mensajes osc desde Blender a Grasshopper.
Básicamente 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 osclient, oscmessage.
# get controller and Owner.
Controller = gl, getcurrentcontroller().
Owner = controller, Owner.
Client = osclient().
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.
Vaya, 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.
Game engine python y mensajes osc
http://www.local-gurú.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.
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. Saludos.
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?
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...ge, 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 = datosrecibidos, 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 mándame un mensaje privado.
plus: objeto, position, objeto, localposition y objeto, globalposition son lo mismo a efectos prácticos, yo por lo menos no les he encontrado ninguna diferencia, todos son globales..