Ceci est une ancienne révision du document !
Table des matières
OSC avec Blender
Ce tuto a été réalise sur Debian 10, avec Blender 2.79b
oscpy
Pour l'installation, voir la page
Envoyer et recevoir sur une même machine
Pour envoyer et recevoir sur une même machine, il y aura 2 serveurs, le serveur dans Blender et un serveur dans l'application (ou le script externe). Ces 2 serveurs ne peuvent pas utiliser le même port: il faut un serveur et un client pour chaque application.
Un exemple
Lancement du BGE et du script externe
Dans le dossier du projet, ouvrir un terminal:
python3 external_script.py
Dans un autre terminal:
blender blender_osc.blend
puis [P]
ou
blenderplayer blender_osc.blend
Si un script plante, les threads OSC peuvent continuer à tourner, et vous avez un message qui dit que le port est utilisé! Vous êtes obligés de vous déconnecter et reconnecter. Killer le processus qui continue à tourner oblige à trouver le bon processus et là, ce n'est pas évident.
Logic Editor in BGE
Initialisation dans Blender
once.py exécuté une seule fois!
from bge import logic as gl from oscpy.client import OSCClient from oscpy.server import OSCThreadServer def on_action(action): gl.action = 1 if action == 1 else -1 gl.action_new = 1 def on_reset(*args): gl.reset = args gl.num_reset = 0 def osc_server_init(): gl.server = OSCThreadServer() gl.server.listen('localhost', port=8001, default=True) # Les callbacks du serveur gl.server.bind(b'/action', on_action) gl.server.bind(b'/reset', on_reset) def main(): print("Lancement de once.py ...") gl.action = 0 gl.action_new = 0 gl.reset = 0 gl.num_reset = 0 gl.server = None osc_server_init() # Un client pour envoyer sur la même machine gl.client = OSCClient(b'localhost', 8003) main()
Le script en cours dans Blender
always.py exécuté à chaque frame.
def main(): print("gl.reset =", gl.reset) print("gl.action =", gl.action) gl.client.send_message(b'/result', [1]) main()
Un script externe pour communiquer avec le BGE
from oscpy.client import OSCClient from oscpy.server import OSCThreadServer def on_result(arg): print("waouh ...", arg) server = OSCThreadServer() server.listen('localhost', port=8003, default=True) server.bind(b'/result', on_result) client = OSCClient(b'localhost', 8001) toto = 0 while 1: if toto % 2 == 0: client.send_message(b'/action', [toto]) else: client.send_message(b'/reset', [toto]) toto += 1