Outils pour utilisateurs

Outils du site


osc_avec_blender

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

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 17:19 de serge