Transform Push Pull
Pushing and pulling vertices along their normals — the inflate tool
- BPY_OBJ
- center_override
- BPY_OBJ
Transform Push Pull inflates and deflates. It wraps bpy.ops.transform.push_pull, which moves the selected vertices of a mesh along their own normals - out for positive values, in for negative - so a region swells or caves in relative to the surface around it. It's the tool you'd use to puff a cheek, round a forehead, or push a lip forward while making a morph target for an avatar's expressions.
It sits next to Transform_Bend in the "shape-key builder" corner of the pack. Bend handles curves, Push Pull handles volume. Where a talking avatar's face gets its life - the cheek that bulges on a smile, the pout - is exactly this kind of normal-direction push. And because it's per-vertex with proportional falloff available, you get a soft organic swell instead of a hard spike.
How it works
An EditOps node: deselect all, set your BPY_OBJ active, enter edit mode, run the operator, exit, pass the object back. The value input is a FLOAT with an enormous range (Blender's hard min/max leaked through the generator - realistically you'll stay within a few units). Positive pushes out along normals, negative pulls in. mirror mirrors to the symmetric side, which is gold for faces.
The proportional controls are the difference between "organic" and "lumpy":
- use_proportional_edit - on, and the push tapers off for vertices further from the selection center.
- proportional_edit_falloff - SMOOTH / SPHERE / ROOT / INVERSE_SQUARE / SHARP / LINEAR / CONSTANT / RANDOM. SMOOTH is the friendly default; SPHERE gives a rounder, more localized bulge.
- proportional_size - the radius of influence. Tune this harder than you think you need to.
- use_proportional_connected / use_proportional_projected - limit the falloff to connected geometry or to the projected area. Fine at defaults.
- center_override - a
B_VECTOR3to shift the push's center of influence.
Inputs that matter
BPY_OBJ, value (how much, and which direction), use_proportional_edit + proportional_size (how soft), and center_override when you need the push somewhere other than the mesh center.
Output: BPY_OBJ - the modified mesh for the next node.
Installing it
Part of the Avatar Graph pack. ComfyUI Manager → search "Avatar Graph", or:
cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui && python -m pip install -r requirements.txt
Restart after. Pack gotchas: bpy==3.6.0 requires Python 3.10.x (a 3.11+ env breaks the pack's import), and first launch downloads the SAM ViT-H model (~2.5 GB) to ComfyUI/models/sams plus two MediaPipe landmarker files.
Common issues
- "No module named bpy" → Python 3.10.x. The pack's one repeated chorus.
- Result looks spiky, not smooth → you pushed without proportional editing, so every vertex moved independently. Enable
use_proportional_editand raiseproportional_size. - The push happens in the wrong spot → selection and
center_override. The node acts on the current selection; make sure it covers the region you mean. - Texture stretches when you push hard → big normal pushes distort UVs. Keep pushes modest, or do the deformation before unwrapping.
- Scene resets between runs - shape keys and their source deformations belong in one graph.
If you're sculpting expression shape keys for the avatar editor, this and Bend are the two nodes that do most of the heavy lifting. Push a little, bake a shape key, push a little more.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| valueopt | FLOAT | 0.00-3.402823466385289e+38–3.402823466385289e+38 | — |
| mirroropt | BOOLEAN | false | — |
| use_proportional_editopt | BOOLEAN | false | — |
| proportional_edit_falloffopt | COMBO | 8 options: SMOOTH, SPHERE, ROOT, INVERSE_SQUARE, SHARP, LINEAR, +2 | |
| proportional_sizeopt | FLOAT | 1.009.999999974752427e-7–999999995904 | — |
| use_proportional_connectedopt | BOOLEAN | false | — |
| use_proportional_projectedopt | BOOLEAN | false | — |
| snapopt | BOOLEAN | false | — |
| center_overrideopt | B_VECTOR3 | — | |
| release_confirmopt | BOOLEAN | false | — |
| use_accurateopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |