Object Vertex Weight Normalize Active Vertex
Rescale One Vertex's Weights to Sum to One
- BPY_OBJ
- BPY_OBJ
Normalizing a whole vertex group fixes the global sums, but sometimes only one vertex is off - a single point where the weights add up to 0.7 instead of 1.0, just enough to make the deformation sag. Object Vertex Weight Normalize Active Vertex is the per-vertex version: it rescales the active vertex's weights across all its groups so they sum to 1.
If the group-level Normalize nodes are the wide brush, this is the touch-up. It's the kind of node you reach for when the avatar looks almost right.
How it works
An auto-generated wrapper around Blender's bpy.ops.object.vertex_weight_normalize_active_vertex. No parameters - just BPY_OBJ in and the same object out. The only control is the active vertex (set via the mesh's edit-mode selection), because the operator normalizes exactly that one vertex.
Technically it balances the weights on that vertex across the groups that own it, so the ratios are preserved but the total comes out to 1. That's different from the group-normalize nodes: those rescale within a group; this rescales across groups for a single vertex.
The output is the passthrough BPY_OBJ, so you can chain this right before export for a last-mile cleanup.
Installing it
It rides in the Avatar Graph pack:
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 ComfyUI, or install "Avatar Graph" from ComfyUI Manager. Pack-wide install notes: bpy==3.6.0 needs Python 3.10 (the README suggests a dedicated conda env), and bpy is a several-hundred-MB headless Blender.
Common issues
The dominant failure is scope confusion. This node does exactly one vertex, so if you wire it in expecting a whole-mesh cleanup, nothing visible happens. That's correct behavior - you want the group-level Object Vertex Group Normalize All for the big pass and this only for the stragglers.
Also, "active vertex" is inherited state, not something you set here. If the wrong vertex is active, the wrong vertex gets normalized. And the standing rule: no BPY_OBJ from upstream mesh nodes, no vertex to fix.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |