## SEE COMMENTS AT THE END // VEHA OS COMENTARIOS LA NO FINAL ## #### SCRIPT COMEÇA LÁ EM BAIXO #### ################# INICIO DA BIBLIOTECA ############################# import GameLogic as G import socket import OSC O = G.getCurrentController().getOwner() class MO: def __init__(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.s.settimeout(0.4) self.s.bind(("localhost", 3333)) def tuioLiveAndDie(self,message): #lida com as mensages "alive" tuio_createObject(tuio_ObjectBorn(message)) tuio_killObject(tuio_ObjectDied(message)) def tuio_ObjectBorn(self,message): result = "" scene = GameLogic.getCurrentScene() object = scene.getObjectList() #pega os objetos da cena for alive in message: #checa nos objetos da cena para ver se já existe cada objeto que veio na ensagem for o in object: if (str(o.name) == "dedo" + str(alive)): #se existir break #quebra e vai checar o próximo objeto else: result = "%s,dedo%i" % (result, alive) #se não adiciona esse objeto a lista de resultado dos objetos q nasceram if result=="": return 0 else: result = result.lstrip(",") #print "Objetos nasceram: " + result return result.split(",") #retorna uma lista dos objetos que devem ser criados def tuio_ObjectDied(self,message): result = "" scene = GameLogic.getCurrentScene() object = scene.getObjectList() for o in object: for alive in message: if (str(o.name) == "dedo" + str(alive)): break else: result = "%s,%s" % (result,o.name) #result = result + "," + str(o.name) if result=="": return 0 else: result = result.lstrip(",") #print "Objetos morreram: " + result return result.split(",") def get_osc(self): #s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #s.settimeout(0.4) #s.bind((host, port)) try: if self.s.recvfrom(1024): raw, addr = self.s.recvfrom(1024) if raw: dec = OSC.decodeOSC(raw) if dec: return dec else: return [[0],[0]] except: return [[0],[0]] def tuio_createObject(self,objs): if objs: for obj in objs: cont=GameLogic.getCurrentController() dpl = cont.getActuator("duplicador") dpl.setObject("mae") #cria uma cópia do objeto "mae" dpl.instantAddObject() dpl.getLastCreatedObject().name = obj #renomeia para o id q veio na mensagem #print "Objeto foi criado: " + obj def tuio_killObject(self,objs): if objs: for obj in objs: ListaObjetos = GameLogic.getCurrentScene().getObjectList() if ListaObjetos[obj].name.startswith("dedo"): # se não for um dos objetos q já estavam na cena #print "vida: " + str(ListaObjetos[obj].vida) ListaObjetos[obj].vida = 1 #seta a propriedade pra 1 e mata #print "vida: " + str(ListaObjetos[obj].name) + " : " + str(ListaObjetos[obj].vida) #print "Objeto foi brutalmente assassinado: " + obj def converteCoord(self,coordenadas): #recebe uma lista, item 0 é X, item 1 é Y, item 2 é z #assumindo q 0,0 eh o centro telaX = 62.486 telaY = 44.444 #só precisa mexer nesses dois aí em cima z = coordenadas[2] # não mexe na coordenada Z x = (telaX*coordenadas[0])-(telaX/2) y = ((telaY*coordenadas[1])-(telaY/2))*-1 return [x,y,z] def tuioMove(self,msg): ide = msg[0] x = msg[1] y = msg[2] z = 0 coords = converteCoord([x,y,z]) ListaObjetos = GameLogic.getCurrentScene().getObjectList() #print "posicao anterior de: " "dedo" + str(ide) + " - " + str(ListaObjetos["dedo" + str(ide)].getPosition()) ListaObjetos["dedo" + str(ide)].setPosition(coords) #print "Objeto " + "dedo" + str(ide) + " foi movido para as coordenadas " + str(coords) ############ FIM DA BIBLIOTECA ################# ############## INICIO DO SCRIPT ###################### ## English bellow ## esse script gera copias de um objeto do blender pra cada blob, e acompanha o movimento desses blobls ## esse script pressupõe que sua camera está olhando exatamente pra baixo (para o plano x,y) ## os objetos vão ser movidos somente no eixo x,y, mantendo o z sempre constante (0) ## ele deve estar associado ao objeto q vai ser "copiado" e ligado a um sensor allways e a um controlador Edit Object (Add Object) chamado "duplicador" ## esse objeto deve se chamar "mae" ## esse objeto deve ter uma propriedade do tipo INT, chamada "vida", com o valor 0 (zero) ## esse objeto tb deve ter o script multiObject_killer.py associado a um sensor Property (Prop: vida, Equal, Value 1) e ligada a um controlador Edit Object (End Object) chamado "assassino" ## message se espera uma lista bidimensional, com mensagens no padrão TUIO ## exemplo de mensagem: ## ## [['set',3, 0.88888888888888, 0.99999999999999999, ...],['alive', 1, 2, 3], ['fseq', 10000]] ### ENGLISH ### ## This script is designed to be used with a multitouch table using the TouchLib. It receives OSC signals from the demo software OSC that comes along with touchlib ##It generates copies of an object for each finger found on the table, then each copy of the original object follows the finger ## this object will be moved only on X and Y axis, assuming camera is pointing exaclty down ## this script must be associated with the object you want to be copied. It has to be connected on an Allways Sensor and to a Edit Object (Add Object) Controller called "duplicador" ## the object this is script is associated to must be called "mae" (mother) ## the object this is script is associated to have a property (type INT), called "vida", with value set to 0 (zero) ## this object mus also have the other script "multiObject_killer.py" linked to a sensor Property (Prop: vida, Equal, Valeu 1) and linked to a controller Edit Object (End Object) called "assassino" if not O.Init: G.MOC = MO() #print "teste" else: #print O.Init message = G.MOC.get_osc() if isinstance(message[0], list): msgs = len(message)-1 else : msgs = 0 print message while msgs >=0: # faz um loop ao contrário na lista para rodar as mensagens alive antes das set if isinstance(message[0], list): mensagem = message[msgs] else : mensagem = message if mensagem[0] == "alive" and len(mensagem)>1: #print "mensagem alive: " + str(mensagem[1:]) G.MOC.tuioLiveAndDie(mensagem[1:]) if mensagem[0] == "set" and len(mensagem)>1: #print "mensagem set: " + str(mensagem[1:]) G.MOC.tuioMove(mensagem[1:]) #if message[msgs][0] == "fseq" and len(mensagem)>1: #print "fseq: " + str(mensagem[1]) msgs = msgs-1