Outils pour utilisateurs

Outils du site


osc_avec_blender

Ceci est une ancienne révision du document !


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