ZOZO's Contact Solver 🫢
/

Overview

  • πŸ’‘ Overview
  • πŸ–ΌοΈ Gallery
  • 🎬 Video Tutorials
  • βœ‰οΈ Reaching the Author
  • πŸ” LLM Transparency

First steps

  • πŸ‘‹ Getting Started
    • πŸ› οΈ Install
    • 🧭 Tour of the UI
    • 🎬 Your First Simulation
  • πŸ› οΈ Install
  • 🧭 Tour of the UI
  • 🎬 Your First Simulation

Connecting to a solver

  • πŸ”Œ Connections
  • 🐳 Docker over SSH
  • 🐳 Docker (Local)
  • πŸͺŸ Windows Native
  • 🌐 SSH (Direct)
  • πŸ–₯️ Local
  • πŸ“‡ Connection Profiles
  • πŸ”’ Security

Simulation workflow

  • πŸ”„ Workflow
  • 🎭 Scene
    • πŸ“¦ Object Groups
    • πŸ—Ώ Static Objects
  • πŸŽ›οΈ Parameters
    • πŸ§ͺ Material Parameters
    • 🌐 Scene Parameters
    • ⏱️ Dynamic Parameters
  • πŸ”’ Constraints
    • πŸ“Œ Pins and Operations
    • πŸ‘» Invisible Colliders
    • 🧲 Snap and Merge
  • ▢️ Simulation and Output
    • πŸš€ Running the Simulation
    • πŸ““ JupyterLab
    • 🍰 Baking Animation
  • 🐍 Blender Python API

MCP Tool

  • πŸ€– MCP Server
  • 🎨 Scene Setup via MCP

Reference

  • 🩹 Troubleshooting
  • πŸ“– Glossary

API References

  • 🐍 Blender Python API Reference
  • πŸ€– MCP Tool Reference
  • πŸ““ JupyterLab Python API
    • 🧩 Module Reference
    • βš™οΈ Simulation Parameters
    • πŸ§ͺ Material Parameters
    • πŸ“‘ Log Channels

On this page

  • UI Look
  • The Add-on in Action
  • From a Python Script to Simulation
  • From Prompt to Simulation (via MCP)
ppf-contact-solver 0 0
Edit this page
  1. ZOZO's Contact Solver 🫢 /
  2. πŸ–ΌοΈ Gallery
View as Markdown Open in ChatGPT Open in Claude

πŸ–ΌοΈ GalleryΒΆ

These clips are small examples produced with the Blender add-on, covering a range of motion types: drape, compression, inflation, and contact-driven shape change. If you want the setup steps behind them, start with Getting Started and Workflow.

Animated pieces of paper crumpling under compression.
Crumple Compressed pieces of paper crumpling into a tight stack. crumple.blend · video
Animated curtains waving in a breeze.
Curtain Curtains waving in a breeze. curtain.blend · video
Animated kite blown by the wind and caught on tree branches.
Kite A kite blown by the wind and caught on tree branches. kite.blend · video
Animated prawn and flower ball pressed together into a cracker.
Press A prawn pressed permanently together with a flower ball to form a cracker. press.blend · video
Animated inflated cushion with multiple monkey heads resting on top.
Puff An inflated cushion with multiple monkey heads resting on top. puff.blend · video
Animated striped zebra car sweeping through a grass field.
Zebra A striped zebra car sweeping through a grass field. zebra.blend · video

UI LookΒΆ

A couple of static screenshots of the add-on running inside Blender. The full-size versions are linked under each thumbnail.

The kite scene set up inside Blender using the add-on. The zebra scene set up inside Blender using the add-on.
Kite scene set up in Blender. (full-size) Zebra scene set up in Blender. (full-size)

The Add-on in ActionΒΆ

The clip below shows the add-on running inside Blender. Geometry and constraints are authored locally, the simulation runs on a remote solver, and the resulting frames are fetched back and played in the viewport.

A screencast of the Blender add-on dispatching a scene to a remote solver and playing the fetched results in the Blender viewport.

The add-on dispatching a scene to a remote solver and playing the fetched results in the viewport.ΒΆ

From a Python Script to SimulationΒΆ

You can also drive the entire pipeline from a Python script inside Blender’s scripting editor. This is handy for procedural scene setup and batch variant generation. Below is a full example that drapes a sheet over a sphere:

import bpy
from zozo_contact_solver import solver

# Reset any prior state.
solver.clear()

# Create a sphere (the static collider) at the origin.
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4, radius=0.5, location=(0, 0, 0))
bpy.context.object.name = "Sphere"

# Create a 2x2 sheet just above the sphere as a 64x64 grid.
bpy.ops.mesh.primitive_grid_add(x_subdivisions=64, y_subdivisions=64, size=2, location=(0, 0, 0.6))
sheet = bpy.context.object
sheet.name = "Sheet"

# Pin the two corners on the -x edge via a vertex group.
vg = sheet.vertex_groups.new(name="Corners")
corner_indices = [
    i for i, v in enumerate(sheet.data.vertices)
    if v.co.x < -0.99 and abs(abs(v.co.y) - 1.0) < 0.01
]
vg.add(corner_indices, 1.0, "REPLACE")

# Build solver groups.
cloth = solver.create_group("Cloth", type="SHELL")
cloth.add("Sheet")
cloth.param.enable_strain_limit = True
cloth.param.strain_limit = 0.05
cloth.param.bend = 1

ball = solver.create_group("Ball", type="STATIC")
ball.add("Sphere")

# Pin the two sheet corners.
cloth.create_pin("Sheet", "Corners")

# Scene parameters.
solver.param.frame_count = 100
solver.param.step_size = 0.01
The drape script running inside Blender's Scripting workspace, with the simulated sheet draped over the sphere in the viewport on the left and the script in the text editor on the right.

The script above running inside Blender’s Scripting workspace. (full-size)ΒΆ

From Prompt to Simulation (via MCP)ΒΆ

The add-on also exposes an MCP server so an external agent can drive Blender and the solver directly. The clip below shows a natural language prompt building a bowl-and-spheres scene end to end, with no UI clicks. See MCP Server for the full setup.

Codex terminal on the left driving Blender on the right through the MCP server, building a bowl-and-spheres scene from a natural language prompt.

Codex (left) driving Blender (right) through the add-on’s MCP server. See the exact prompt used to produce this clip.ΒΆ

A cloth sheet draped over a sphere, produced from a single natural language prompt through the MCP server.

A prompt: drape a sheet over a sphere and make an animation video mp4 render 300 frames.ΒΆ

Previous
πŸ’‘ Overview
Next
🎬 Video Tutorials

Made with Sphinx and Shibuya theme.