====== 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 }}