Skip to content

gaoypeng/LAM

Repository files navigation

LAM: Language Articulated Object Modelers

Official implementation of LAM: Language Articulated Object Modelers (CVPR 2026).

LAM generates articulated 3D objects (objects with moving parts — drawers, hinges, wheels, …) directly from natural-language descriptions. Instead of relying on a visual prior or pre-built 3D assets, LAM formulates articulated-object generation as a unified code-generation task: a team of LLM/VLM agents write, compile, debug, and self-correct code that defines both the geometry and the articulation of each object, which is then compiled into a standard URDF model.

🔗 Project page: https://gaoypeng.github.io/LAM

            "a cabinet with five drawers"
                       │
   ┌───────────────────┴───────────────────────────────────────┐
   │  Link Designer      →  hierarchical link structure (JSON)  │
   │  Geometry Coder     →  Three.js geometry code → OBJ meshes │
   │  Articulation Coder →  joint specifications (JSON)         │
   │  URDF Compiler      →  generated.urdf                      │
   └───────────────────┬───────────────────────────────────────┘
                       │  (each stage runs a 2D/3D VLM feedback loop:
                       │   render → critique → fix, iteratively)
                       ▼
                articulated 3D object (URDF + meshes)

Repository structure

LAM/
├── run_pipeline.py            # entry point — text → articulated object
├── agents/                    # LLM/VLM agents (Link Designer, Coders, Checkers, Fixers)
├── providers/                 # provider backends (OpenAI / Anthropic / Google / PointLLM)
├── prompt/                    # prompt templates + few-shot examples
├── utils/                     # config, mesh export, URDF generation, rendering helpers
├── data/                      # example text captions / evaluation prompt lists
├── tests/                     # unit tests
├── urdf_grid_visualizer/      # standalone web viewer for inspecting generated URDFs
├── config.example.yaml        # configuration template (copy to config.yaml)
├── requirements.txt           # Python dependencies
└── package.json               # Node dependencies (Three.js → mesh export)

Prerequisites

  • Python 3.9+
  • Node.js 18+ (used to execute the generated Three.js geometry code and export meshes)
  • API keys for the LLM/VLM providers you intend to use (OpenAI, Anthropic, and/or Google)
  • (Optional) PointLLM + a CUDA GPU, if you want to enable the 3D point-cloud critic (disabled by default)

Installation

1. Clone

git clone https://github.com/gaoypeng/LAM.git
cd LAM

2. Python dependencies

pip install -r requirements.txt

3. Node dependencies (for Three.js → mesh export)

npm ci    # or: npm install

4. Configure API keys

cp config.example.yaml config.yaml

Then edit config.yaml and fill in the keys for the providers you use:

api:
  keys:
    openai:    "YOUR_OPENAI_API_KEY"
    google:    "YOUR_GOOGLE_API_KEY"
    anthropic: "YOUR_ANTHROPIC_API_KEY"

⚠️ config.yaml holds your secret keys and is git-ignored — never commit it.

config.yaml also assigns a model to each agent (the provider is auto-detected from the model name). The defaults mirror the paper's setup:

Agent Default model
Link Designer (linker_generator) gpt-4o
Geometry Coder (shape_generator) gpt-5
Articulation Coder (articulation_generator) o3
Geometry / Articulation Checkers (vlm_critic, articulation_vlm_critic) gemini-2.5-flash
Fixers (shape_fixer, articulation_fixer) gemini-2.5-pro

Usage

Generate a single object:

python run_pipeline.py --description "a cabinet with five drawers" --output-dir output

Batch generation from a captions file (one description per line):

python run_pipeline.py --captions-file data/text_captions_short.txt --output-dir output --parallel 4

Useful flags:

Flag Description
--linker-model / --shape-model / --articulation-model Override the model for a stage
--num-executions N Number of generation attempts per description
--parallel N Number of parallel workers (0 = sequential)
--no-vlm-critic Disable the geometry VLM feedback loop
--no-articulation Shape only — skip articulation + URDF
--no-articulation-feedback Skip the articulation VLM feedback loop
--temperature / --max-retries / --log-level Misc. overrides

Output

Each generated object lands in its own folder under --output-dir:

output/<object_name>/
├── generated.urdf          # the articulated model
├── part_meshes/            # per-link OBJ meshes
├── links.json              # link hierarchy
└── articulation.json       # joint specifications

Visualizing results

urdf_grid_visualizer/ is a standalone Node web viewer for browsing generated objects and interacting with their joints. It is independent of the Python pipeline.

cd urdf_grid_visualizer/server
npm install
URDF_BASE_PATH=/path/to/output PORT=3001 node server.js
# or, from urdf_grid_visualizer/:  ./start.sh /path/to/output 3001
  • Batch grid preview: http://localhost:3001/preview
  • Interactive single-object viewer: http://localhost:3001/viewer/<category>/<instance>

Citation

@inproceedings{gao2026lam,
  title     = {LAM: Language Articulated Object Modelers},
  author    = {Gao, Yipeng and Ge, Yunhao and Cai, Peilin and Seita, Daniel and Itti, Laurent},
  booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
  year      = {2026}
}

License

See LICENSE.

About

The official implementation of LAM: Language Articulated Object Modelers

Resources

License

Stars

3 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors