Transform Tilt
Twisting Geometry Around Its Own Axis
- BPY_OBJ
- BPY_OBJ
Transform Tilt wraps Blender's transform.tilt, and it's the node to reach for when you want geometry that rotates around its own path rather than sliding along an axis. In Blender, tilt is the operator that twists a curve or a line of extruded edges around the tangent direction - think of a ribbon twisting into a spiral, or a tube of edges corkscrewing. It's one of the more specialized transform tools, and in the flat, image-textured world of avatar mesh layers it's niche - but for hair, horns, tails, or any tube-like part you extrude yourself, it's exactly the tool.
How it works
Like every Transform_ node here, this one is generated from Blender's operator API. Feed it a BPY_OBJ, it drops into edit mode and runs bpy.ops.transform.tilt(value=...). The value float is the twist amount in degrees - crank it up and the selected geometry rotates around the first (tangent) axis of the selection. mirror flips the twist direction so both sides of a symmetric part twist symmetrically, which matters when you're doing a pair of horns or a parted hairstyle.
The proportional-editing trio (use_proportional_edit, proportional_edit_falloff, proportional_size) is where this node gets interesting. With proportional editing on and a decent falloff radius, the twist rolls out gradually from the pivot instead of hitting everything uniformly - that's how you get a natural curl instead of a hard spiral.
Honest caveat: on a flat, single-plane mesh (which is what Create Mesh Layer gives you), tilt doesn't have much to grab. It needs extruded or curve-like geometry to be visible. If your avatar is pure flat layers, skip this node; if you're adding extruded detail, it's a sleeper hit.
Inputs worth knowing
The full input list is value, mirror, the proportional-editing set, snap, release_confirm, and use_accurate. For a beginner the only ones to touch are value and the proportional trio. Output is BPY_OBJ - same mesh object, chained to the next node.
Installing
Tilt ships in the Avatar Graph pack (avatechai/avatar-graph-comfyui), which pins bpy==3.6.0 and therefore Python 3.10:
conda create --name comfyui python=3.10
conda activate comfyui
Install via 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 with python main.py --enable-cors-header for the live editor preview. No extra model downloads for this node - the pack's only real model download is the SAM segmentation model, and you only need that for the image-segmentation stage of the workflow.
Inputs (11)
| 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 | — |
| release_confirmopt | BOOLEAN | false | — |
| use_accurateopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |