MiGumi (Millable Gumi) is a library for creating and visualizing tightly coupled integral joints that are manufacturable via CNC milling. This repository contains the code accompanying the paper MiGumi: Making Tightly Coupled Integral Joints Millable.
MiGumi provides:
- Symbolic Geometry Representation: Define millable joints using symbolic expressions with support for polyarcs, height fields, and stateful geometry
- State-Based Animation: Create assembly/disassembly animations showing how joint components fit together
- Shader Compilation: Compile geometry expressions to GLSL shaders for real-time visualization
- Multi-pass Rendering: Generate multi-buffer shader pipelines for advanced rendering effects
Note: The current version supports the node-based visual editor. Optimization routines for joint design are still being integrated.
# Clone the repository
git clone https://github.com/BardOfCodes/migumi.git
cd migumi
# Install in development mode
pip install -e .MiGumi requires the following companion libraries:
# GeoLiPI - Geometric Language for Procedural Images
pip install -e path/to/geolipi
# SySL - Shader Symbolic Language
pip install -e path/to/sysl
# ASMBLR - Node assembly system
pip install -e path/to/asmblrmigumi/
├── migumi/
│ ├── symbolic/ # Symbolic geometry representations
│ │ └── base.py # Core classes (RegisterGeometry, RegisterState, etc.)
│ ├── shader/ # Shader compilation
│ │ ├── compiler.py # Single-pass shader compilation
│ │ ├── compile_multipass.py # Multi-buffer rendering
│ │ ├── transition_evaluate.py # State transition code generation
│ │ └── state_based_converter.py # State-to-motion conversion
│ ├── torch_compute/ # PyTorch-based computation
│ │ ├── evaluate.py # Expression evaluation
│ │ ├── optimize.py # Optimization routines
│ │ └── polyline_utils.py # Polyline geometry utilities
│ └── utils/ # Utility functions
│ ├── converter.py # Format conversion utilities
│ └── vis.py # Visualization helpers
├── notebooks/ # Example notebooks
│ ├── test_basic.ipynb # Basic usage examples
│ └── visualize.ipynb # Visualization examples
└── assets/ # Images and media
import json
from asmblr.base import BaseNode
from migumi.utils.converter import fix_format, get_expr_and_state, fix_expr_dict
from migumi.shader.compile_multipass import compile_set_multipass
# Load a joint design
with open("path/to/joint.json") as f:
data = json.load(f)
# Parse the design
module_data = data['moduleList']['migumi']
corrected_data = fix_format(module_data)
expressions = BaseNode.from_dict(corrected_data)
# Extract geometry and state information
if not isinstance(expressions, list):
expressions = [expressions]
expr_dict, state_map = get_expr_and_state(expressions)
expr_dict = fix_expr_dict(expr_dict, mode="v4", add_bounding=False)
# Compile to shaders
settings = {
"render_mode": "v4",
"variables": {
"resolution": (512, 512),
}
}
shader_bundles = compile_set_multipass(
expr_dict,
state_map,
settings=settings,
post_process_shader=["part_outline_nobg"]
)MiGumi integrates with the ASMBLR Frontend for visual editing:
- Start the backend:
python asmblr_backend/scripts/app.py - Start the frontend:
cd asmblr_frontend && yarn dev - Select "Migumi" mode in the editor
- Load pre-built designs from migumi-dataset
- GeoLiPI - Geometric Language for Procedural Images
- SySL - Shader Symbolic Language
- ASMBLR - Node-based assembly system
If you use MiGumi in your research, please cite:
@article{ganeshan2025migumi,
author={Ganeshan, Aditya and Fleischer, Kurt and Jakob, Wenzel
and Shamir, Ariel and Ritchie, Daniel and Igarashi, Takeo
and Larsson, Maria},
title={MiGumi: Making Tightly Coupled Integral Joints Millable},
year={2025},
publisher={Association for Computing Machinery},
volume={44},
number={6},
url={https://doi.org/10.1145/3763304},
doi={10.1145/3763304},
journal={ACM Trans. Graph.},
articleno={193},
}MIT
