UV Cylinder Project
Wrapping a texture around a rounded mesh part
- BPY_OBJ
- BPY_OBJ
This is Blender's Cylinder Project UV unwrap operator, exposed as a node inside Avatar Graph, avatech.ai's pack for building rigged, interactive avatars from character art in ComfyUI. It generates UV coordinates by wrapping a mesh around an imaginary cylinder - the go-to unwrap method for anything roughly tube- or column-shaped: an arm, a torso, a tail, a ponytail.
Where this fits in a rig-building pipeline
Most of this pack's mesh comes from segmenting a flat character image and turning that segment into geometry - which means the mesh usually starts life essentially flat and doesn't need much UV work at all. Cylinder projection earns its place for the parts that aren't flat: anything with actual rounded volume that needs its texture wrapped around it rather than just projected straight on. Get the projection axis and alignment wrong and you get visible seams or stretched, smeared texture right where you don't want them - on a face-adjacent part, that's immediately obvious.
The fields that matter
This mirrors Blender's own Cylinder Project dialog closely enough that if you've used Blender's UV menu before, all of this is already familiar:
direction- how the cylinder aligns relative to the object:VIEW_ON_EQUATOR,VIEW_ON_POLES, orALIGN_TO_OBJECT.align- which axis pair the projection's seam runs along:POLAR_ZXorPOLAR_ZY.pole- how the projection handles the cylinder's top and bottom poles:PINCHsqueezes them to a point,FANspreads them out instead.radius(default 1) - the size of the projection cylinder, which directly scales the resulting UVs.seam(defaultfalse) - automatically mark a UV seam at the projection boundary.correct_aspect(defaulttrue) - keeps the projected UVs proportionally correct rather than stretched; leave this on unless you have a specific reason not to.clip_to_bounds/scale_to_bounds(both defaultfalse) - clamp or rescale the resulting UVs into the standard 0–1 UV space.
Input and output are both BPY_OBJ, this pack's socket type for a live Blender object reference - feed in the mesh you want unwrapped, get the same mesh back with new UVs applied.
Installing it
Through ComfyUI Manager, search avatar-graph-comfyui. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui && python -m pip install -r requirements.txt
Because this node calls straight into Blender's own mesh/UV operators via bpy, it needs this pack's usual dedicated environment: bpy only installs against Python 3.10.x, so it needs its own environment rather than sharing whatever newer Python your main ComfyUI setup is on. The README's route on Windows is a prebuilt Python 3.10 ComfyUI zip; on Mac/Linux, conda create --name comfyui python=3.10 before installing is the recommended path. Restart with --enable-cors-header afterward if you want the pack's live avatar preview panel to work.
Troubleshooting
Visible stretching or a seam in the wrong place is almost always direction or align being mismatched to how your mesh is actually oriented in the scene - cylinder projection is sensitive to the object's real-world axes, not just its shape, so a mesh built at an odd rotation will project oddly no matter how good the settings look on paper. If the poles look pinched when you wanted them flat (or vice versa), that's pole - try the other option before touching anything else. And remember this is one unwrap method among several Blender offers; a genuinely flat mesh segment (the common case in this pack) usually doesn't need cylinder projection at all and will unwrap more predictably with a simpler method.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| directionopt | COMBO | 3 options: VIEW_ON_EQUATOR, VIEW_ON_POLES, ALIGN_TO_OBJECT | |
| alignopt | COMBO | 2 options: POLAR_ZX, POLAR_ZY | |
| poleopt | COMBO | 2 options: PINCH, FAN | |
| seamopt | BOOLEAN | false | — |
| radiusopt | FLOAT | 1.000–3.402823466385289e+38 | — |
| correct_aspectopt | BOOLEAN | true | — |
| clip_to_boundsopt | BOOLEAN | false | — |
| scale_to_boundsopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |