osc_avec_blender
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
osc_avec_blender.txt · Dernière modification : 2021/03/04 16:19 de serge