import bpy

from pythonosc.dispatcher import Dispatcher

from pythonosc import osc_server

import threading

dispatcher = Dispatcher()

obj_name = "TrackedModel" # Must match object name in Blender

def handle_rotation(addr, *args):

obj = bpy.data.objects.get(obj_name)

if obj:

obj.rotation_euler = args[0], args[1], args[2]

def handle_position(addr, *args):

obj = bpy.data.objects.get(obj_name)

if obj:

obj.location.x = args[0]

obj.location.y = args[1]

def handle_scale(addr, *args):

obj = bpy.data.objects.get(obj_name)

if obj:

obj.scale = (args[0], args[0], args[0])

dispatcher.map("/face/rotation", handle_rotation)

dispatcher.map("/face/position", handle_position)

dispatcher.map("/face/scale", handle_scale)

def start_server():

server = osc_server.ThreadingOSCUDPServer(('127.0.0.1', 9000), dispatcher)

print("🚀 OSC Server started on port 9000")

server.serve_forever()

threading.Thread(target=start_server, daemon=True).start()

blender Python script