UV Follow Active Quads
Fix the uneven stretch on your avatar's face
- BPY_OBJ
- BPY_OBJ
UV Follow Active Quads is the tool you reach for when the texture looks right in one place and smeared in the next. It takes the faces you've selected and remaps them onto a clean, uniform grid that follows the shape of your active quad - the last face you selected - so every quad gets roughly the same texel density. That's the closest thing to a guaranteed-even checkerboard, and it's why it's the classic "make the UVs behave" operator in Blender.
How it works
This is one of the Avatar Graph pack's auto-generated Blender nodes. Under the hood it wraps bpy.ops.uv.follow_active_quads: it grabs your BPY_OBJ (a live Blender mesh object created upstream by the pack's mesh nodes), drops it into edit mode, runs the operator, and hands the same object back out. Nothing is loaded or generated - the mesh's UV data is just rewritten in place, so you can keep chaining other UV or mesh nodes after it.
The only setting that matters is mode, which controls how the grid is computed:
- EVEN - every quad becomes a uniform square, ignoring aspect ratio. The classic "checkerboard" result. If your face is made of even quads, this is what you want.
- LENGTH - tries to preserve the current edge lengths, so there's less distortion but the grid is less uniform.
- LENGTH_AVERAGE - a middle ground that averages edge lengths, the usual default in Blender's UV menu.
Output is a single BPY_OBJ, the same mesh you fed in.
Where it fits
In an Avatar Graph workflow, your character starts as an image that gets segmented, turned into mesh layers, and unwrapped by the Plane Texture Unwrap node (which cube-projects the faces). That projection is fine for a flat plane but leaves uneven scaling between faces on anything slightly curvy - which is exactly the mouth region and jaw where lipsync blendshapes live. Run UV Follow Active Quads over those faces after the unwrap and the mouth texture stops smearing when the shape keys move.
One honest caveat: the operator only touches selected faces. This node does no selection of its own, so if you chain it straight off Plane Texture Unwrap with nothing selected, it's a no-op that quietly passes the object through. Pair it with a selection step - UV Select All, or a Mesh Select node - and you'll actually see it do something.
Installing Avatar Graph
This node ships in the Avatar Graph pack from Avatech. From the ComfyUI/custom_nodes directory:
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui
python -m pip install -r requirements.txt
then restart ComfyUI with --enable-cors-header (that flag enables the real-time avatar preview; without it you can still export via right-click → Save File on the Avatar Main Output node). Easier: ComfyUI Manager → search Avatar Graph → install.
Two gotchas before you start. The pack pins bpy==3.6.0, and Blender's Python bindings only build on Python 3.10.x - on 3.11/3.12 the pip install fails and the whole pack won't load. Windows users get a bundled 3.10 environment from the README; on macOS/Linux make a python=3.10 conda env for ComfyUI. And the first launch auto-downloads the SAM ViT-H model (~2.5 GB) plus MediaPipe landmarkers, so a long pause on startup is normal, not a hang.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| modeopt | COMBO | 3 options: EVEN, LENGTH, LENGTH_AVERAGE |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |