Files
Syoyo Fujita 73def407a8 Add event-driven Blender bridge with remote support
Replace polling with lightweight event-driven mechanisms:
- bpy.msgbus subscriptions for material/light property changes
- depsgraph_update_post handler for transform changes
- Timer only for viewport camera (100ms, unavoidable)

Add remote Blender support via HTTP endpoints:
- GET /blender/bridge.py - Full Python script
- GET /blender/bootstrap - Auto-connect one-liner

Remote Blender can now connect with single command:
  import urllib.request; exec(urllib.request.urlopen("http://SERVER:8090/blender/bootstrap").read().decode())

Files:
- blender/bridge_simple.py - Standalone script (MCP compatible)
- blender/bridge_addon.py - Full Blender addon with UI panel
- server.js - Added HTTP endpoints for script serving
- SETUP.md - Updated with event architecture and remote setup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 02:13:08 +09:00
..

Blender Bridge

WebSocket bridge for streaming Blender scenes to a browser viewer with real-time parameter synchronization.

Architecture

Blender (MCP) ──WebSocket──> Node.js Server ──WebSocket──> Browser Viewer
                (8090)                         (TinyUSDZ WASM + Three.js)

Quick Start

1. Install Dependencies

cd web/blender-bridge
npm install

2. Start the WebSocket Server

npm run server
# Server runs at ws://localhost:8090

3. Start the Browser Viewer

npm run dev
# Opens http://localhost:5174

4. Connect from Blender

Using Blender MCP, execute:

import bpy
import websocket
import os
import tempfile

# Export scene to USDZ
export_path = os.path.join(tempfile.gettempdir(), 'bridge_scene.usdz')
bpy.ops.wm.usd_export(
    filepath=export_path,
    export_materials=True,
    generate_materialx_network=True
)

# Read binary data
with open(export_path, 'rb') as f:
    usdz_data = f.read()

# Connect and send
ws = websocket.create_connection('ws://localhost:8090?type=blender')
# Session ID is returned in response
# Use session ID to connect browser viewers

Message Protocol

Scene Upload (Blender → Browser)

{
  "type": "scene_upload",
  "messageId": "uuid",
  "scene": {
    "name": "SceneName",
    "format": "usdz",
    "byteLength": 1048576
  }
}
// + Binary payload: USDZ data

Parameter Update (Blender → Browser)

{
  "type": "parameter_update",
  "target": {
    "type": "material",  // or "light", "camera", "transform"
    "path": "/World/Sphere/Material"
  },
  "changes": {
    "base_color": [0.9, 0.7, 0.3],
    "base_metalness": 0.85
  }
}

Acknowledgment (Browser → Blender)

{
  "type": "ack",
  "refMessageId": "uuid",
  "status": "success"
}

HTTP Endpoints

Endpoint Method Description
/status GET Server status and stats
/sessions GET List active sessions
/upload/:sessionId POST Upload scene via HTTP (base64)

Supported Parameters

Materials (OpenPBR / USD Preview Surface)

Parameter Three.js Mapping
base_color material.color
base_metalness material.metalness
specular_roughness material.roughness
specular_ior material.ior
coat_weight material.clearcoat
transmission_weight material.transmission
emission_color material.emissive

Lights

Parameter Three.js Mapping
color light.color
intensity light.intensity
position light.position
angle light.angle (SpotLight)
width/height light.width/height (RectAreaLight)

Camera

Parameter Three.js Mapping
position camera.position
target controls.target
fov camera.fov

Transform

Parameter Three.js Mapping
position object.position
rotation object.rotation
scale object.scale
matrix object.matrix

File Structure

blender-bridge/
├── package.json
├── server.js                 # WebSocket server
├── vite.config.js            # Viewer dev config
├── lib/
│   ├── connection-manager.js # Session management
│   ├── message-protocol.js   # Message encode/decode
│   └── scene-state.js        # Server-side state
├── client/
│   ├── bridge-client.js      # Browser WebSocket client
│   └── parameter-sync.js     # Parameter mapping
└── viewer/
    ├── index.html
    ├── viewer.js
    └── viewer.css

Development

Testing Server

# Check server status
curl http://localhost:8090/status

# List sessions
curl http://localhost:8090/sessions

Debugging

Enable verbose logging by checking the browser console and the message log panel in the viewer UI.