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()