====== OSC avec Blender ====== **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Fosc_avec_blender|English Version]]** Ce tuto a été réalise sur Debian 10, avec Blender 2.79b =====oscpy===== Pour l'installation, voir la page * **[[kivy_oscpy|]]** =====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==== * **[[https://github.com/sergeLabo/blender_osc|blender_osc]]** ===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=== {{ :media_14:blender_osc_1.png?800 |}} {{ :media_14:blender_osc_2.png?800 |}} =====Initialisation dans Blender===== * [[https://github.com/sergeLabo/blender_osc/blob/main/once.py|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===== * [[https://github.com/sergeLabo/blender_osc/blob/main/always.py|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===== * [[https://github.com/sergeLabo/blender_osc/blob/main/external_script.py|external_script.py]] 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 {{tag> blender logiciels_de_communication osc }}